使ってます 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.id
をSpark
に変更しましたが、同じです。
最新のoffset
を保存する方法spark zookeeper
またはkafka
に消費され、それから最新のoffset
に読み戻すことができますか?
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 ページの最後にあります
Michael Kopaniovの答えに追加して、オフセットのマップを格納およびロードする場所としてZKを本当に使用したい場合は、そうすることができます。
ただし、結果はZKに出力されないため、出力操作がべき等でない場合(そうでないように聞こえる)でない限り、信頼性の高いセマンティクスは得られません。
結果をmongoの同じドキュメントにオフセットと一緒に1つのアトミックアクションで保存できる場合は、それが適している可能性があります。
詳しくは https://www.youtube.com/watch?v=fXnNEq1v3VA をご覧ください
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/ =