0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

手を動かして学ぶ!KafkaとPythonによるAWSストリーミングデータ分析入門【30日チャレンジ】 - 7日目: PythonでConsumerを実装してデータを受信しよう

0
Posted at

はじめに

「手を動かして学ぶ!KafkaとPythonによるAWSストリーミングデータ分析入門【30日チャレンジ】」7日目: PythonでConsumerを実装してデータを受信しよう!です。昨日はPythonを使って、高性能なKafkaプロデューサーを実装する方法を学びました。

今日は、その逆の役割を担うコンシューマーの実装に挑戦します。Kafkaからリアルタイムにデータを読み取り、加工・分析する基盤の第一歩です。


1. Pythonコンシューマーの実装

Kafkaコンシューマーは、特定のトピックを購読し、そこからデータを取得します。今回は、昨日のプロデューサーが送信したデータをリアルタイムで受信するスクリプトを作成しましょう。

consumer.pyというファイルを作成し、以下のコードを記述してください。

from confluent_kafka import Consumer, KafkaError, KafkaException
import json
import sys

# Kafkaコンシューマーの設定
conf = {
    'bootstrap.servers': '127.0.0.1:9092',
    'group.id': 'my-python-consumer',
    'auto.offset.reset': 'earliest'
}

# Consumerインスタンスの作成
consumer = Consumer(conf)

# 購読するトピック
topic = "test-topic"

try:
    # 指定したトピックを購読開始
    consumer.subscribe([topic])

    # 無限ループでメッセージを受信
    while True:
        # メッセージを受信(タイムアウト1.0秒)
        msg = consumer.poll(1.0)

        if msg is None:
            # 受信するデータがなかった場合
            continue
        if msg.error():
            # エラーが発生した場合
            if msg.error().code() == KafkaError.PARTITION_EOF:
                # 終端に達したが、これは正常な状態
                sys.stderr.write(
                    f"%% {msg.topic()} [{msg.partition()}] reached end at offset {msg.offset()}\n")
            elif msg.error():
                raise KafkaException(msg.error())
        else:
            # 正常にメッセージを受信した場合
            # メッセージのペイロードをデコード
            try:
                message_value = msg.value().decode('utf-8')
                data = json.loads(message_value)
                print(f"Received message: {data}")
            except Exception as e:
                print(f"Failed to decode or parse JSON: {e}")
                print(f"Raw message: {msg.value()}")

except KeyboardInterrupt:
    sys.stderr.write('%% Aborted by user\n')

finally:
    # Consumerをクローズ
    consumer.close()

2. コードの解説と実行

(1) コードの解説

  • 'group.id': 'my-python-consumer': コンシューマーグループIDを指定します。同じグループIDを持つコンシューマーは、トピックのパーティションを共有して並列にデータを処理します。例えば、3つのパーティションがあるトピックを3つのコンシューマーで購読する場合、各コンシューマーが1つずつのパーティションを担当し、処理が分散されます。
  • 'auto.offset.reset': 'earliest': どこからデータの読み取りを開始するかを指定します。
    • 'earliest':トピックの先頭(最も古いオフセット)から読み取ります。
    • 'latest':最新のデータから読み取ります。
  • consumer.subscribe([topic]): 購読したいトピック名をリストで指定します。
  • consumer.poll(1.0): 新しいメッセージをポーリング(一定時間待機して取得)します。引数の1.0はタイムアウト時間(秒)です。
  • エラーハンドリング: msg.error()で、受信中に発生したエラーを確認します。KafkaError.PARTITION_EOFは、トピックの終端に達したことを示す正常なエラーです。
  • メッセージのデコード: 受信したデータはバイト列なので、.decode('utf-8')で文字列に戻し、json.loads()でPythonの辞書型に変換しています。

(2) 実行方法

  1. DockerでKafkaが起動していることを確認:
    docker-compose up -dでKafkaコンテナが起動しているか確認してください。

  2. producer_async.pyを実行:
    producer_async.pyを別のターミナルで実行して、Kafkaにデータを送信しておきましょう。

    python producer_async.py
    
  3. consumer.pyを実行:
    新しいターミナルでconsumer.pyを実行します。

    python consumer.py
    

実行すると、プロデューサーが送信したデータがリアルタイムに表示されるはずです。

コンシューマーはCtrl + Cで停止するまで、メッセージを受信し続けます。


まとめと次回予告

今日は、PythonでKafkaコンシューマーを実装し、リアルタイムにデータを受信する方法を学びました。これで、PythonからKafkaへのデータの送受信という、ストリーミングデータ分析の最も基本的なパイプラインが完成しました。

来週からは、いよいよAWS環境への移行と実践に入ります。

8日目: AWSでストリーミング!Amazon MSKの概要とメリット

お楽しみに!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?