3

私はこのstackoverflowの質問を経験しました。回答によると、バッチ間隔にDStream1つだけ作成されます。RDD

例えば:

私のバッチ間隔は 1 分で、Spark ストリーミング ジョブは Kafka トピックからのデータを消費しています。

私の質問は、DStream で利用可能な RDD は、最後の 1 分間のデータ全体をプル/含むか? 過去 1 分間に作成されたすべてのデータを取得するために設定する必要がある条件やオプションはありますか?

3 つのパーティションを持つ Kafka トピックがあり、3 つのパーティションすべてに最後の 1 分間のデータが含まれている場合、DStream はすべての Kafka トピック パーティションで最後の 1 分間に作成されたすべてのデータをプル/格納しますか?

アップデート:

DStream に複数の RDD が含まれているのはどの場合ですか?

4

3 に答える 3

2

Spark のドキュメントDStreamで抽象化について詳しく読むことをお勧めします。

Discretized StreamまたはDStreamは、Spark ストリーミングによって提供される基本的な抽象化です。これは、データの連続ストリームを表します [...]。内部的には、DStreamは連続した一連の RDD によって表されます

これに 1 つのポイントを追加します。RDD自体が別の抽象化レイヤーであるため、小さなチャンクに分割してクラスター全体に分散できることを忘れないでください。

あなたの質問を考慮して:

  • はい、各バッチ間隔が発生した後、1 つのRDDを持つジョブがあります。そして、このRDDには直前の 1 分間のすべてのデータが含まれています。
  • ジョブがより多くのパーティションで Kafka ストリームを使用する場合、すべてのパーティションが並行して使用されます。その結果、すべてのパーティションからのデータが後続の RDD で処理されます。
于 2016-11-13T22:27:03.960 に答える
1

見落とされていた重要な点の 1 つは、Kafka には Spark Streaming の複数の実装があるという事実です。

1 つはレシーバー ベースのアプローチで、選択したワーカー ノードにレシーバーをセットアップし、データを読み取り、バッファリングしてから配布します。

もう 1 つはレシーバーレス アプローチで、これはまったく異なります。ドライバーを実行しているノードでオフセットのみを消費し、タスクを分散するときに、各エグゼキューターに読み取って処理するオフセットの範囲を送信します。このように、バッファリングはなく (したがって、レシーバーなし)、各オフセットは、ワーカーで実行されている相互に排他的なエグゼキューター プロセスによって消費されます。

DStream は、すべての Kafka トピック パーティションで最後の 1 分間に作成されたすべてのデータをプル/格納しますか?

どちらのアプローチでも、そうなるでしょう。1 分間隔になると、Kafka からデータを読み取り、処理のためにクラスター全体に分散しようとします。

DStream に複数の RDD が含まれる場合

他の人が言ったように、決してそうではありません。単一の RDD のみが所定のDStream間隔で内部を流れます。

于 2016-11-16T07:31:32.383 に答える