web-dev-qa-db-ja.com

Spark ZKまたはKafkaに消費され、再起動後に読み戻すことができる)最新のオフセットを保存する方法

使ってます Kafka 0.8.2 AdExchangeからデータを受け取るには、Spark Streaming 1.4.1データをMongoDBに保存します。

私の問題は、Spark Streamingたとえば、新しいバージョンの更新、バグの修正、新機能の追加などのジョブ。その時点で、offsetの最新のkafkaが引き続き読み取られます。その後、ジョブの再起動中に、AdXプッシュkafkaへのデータが失われます。

auto.offset.reset -> smallestですが、0から受信します->最後に、データが巨大で、dbに重複していました。

特定のgroup.idおよびconsumer.idSparkに変更しましたが、同じです。

最新のoffsetを保存する方法spark zookeeperまたはkafkaに消費され、それから最新のoffsetに読み戻すことができますか?

14
giaosudau

CreateDirectStream関数のコンストラクターの1つは、パーティションIDをキーとして保持し、消費を開始するオフセットを値として保持するマップを取得できます。

ここでapiを見てください: http://spark.Apache.org/docs/2.2.0/api/Java/org/Apache/spark/streaming/kafka/KafkaUtils.html 私がマップ通常は次のように呼ばれていました:fromOffsets

マップにデータを挿入できます。

startOffsetsMap.put(TopicAndPartition(topicName,partitionId), startOffset)

ダイレクトストリームを作成するときに使用します。

KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder, (String, String)](
                streamingContext, kafkaParams, startOffsetsMap, messageHandler(_))

各反復の後、次を使用して処理されたオフセットを取得できます。

rdd.asInstanceOf[HasOffsetRanges].offsetRanges

このデータを使用して、次の反復でfromOffsetsマップを構築できます。

完全なコードと使用法については、こちらをご覧ください。 https://spark.Apache.org/docs/latest/streaming-kafka-integration.html ページの最後にあります

15

Michael Kopaniovの答えに追加して、オフセットのマップを格納およびロードする場所としてZKを本当に使用したい場合は、そうすることができます。

ただし、結果はZKに出力されないため、出力操作がべき等でない場合(そうでないように聞こえる)でない限り、信頼性の高いセマンティクスは得られません。

結果をmongoの同じドキュメントにオフセットと一緒に1つのアトミックアクションで保存できる場合は、それが適している可能性があります。

詳しくは https://www.youtube.com/watch?v=fXnNEq1v3VA をご覧ください

2
Cody Koeninger

ZKにオフセットを格納するために使用できるコードを次に示します http://geeks.aretotally.in/spark-streaming-kafka-direct-api-store-offsets-in-zk/

そして、これがKafkaUtils.createDirectStreamを呼び出すときにオフセットを使用するために使用できるいくつかのコードです: http://geeks.aretotally.in/spark-streaming-direct-api-reusing-offset-from-zookeeper/ =

1
Felipe Oliveira