web-dev-qa-db-ja.com

DStream.foreachRDD関数の意味は何ですか?

spark=ストリーミング、データのすべてのバッチ間隔は常に1つだけのRDDを生成しますが、RDDをforeachするためにforeachRDD()を使用する理由は何ですか?私のテストでは、RDDが複数回表示されることはありません。

24
Guo

DStreamまたは「離散化ストリーム」は、データの連続ストリームを小さなチャンクに分割する抽象化です。これは「マイクロバッチング」と呼ばれます。各マイクロバッチはRDDになり、Sparkでさらに処理されます。RDDは1つだけです各バッチ間隔で各DStreamに対して生成されます。

RDDは、データの分散コレクションです。実際のデータがクラスター内のどこにあるかを示すポインターのセットと考えてください。

DStream.foreachRDDは、Spark= Streamingの「出力演算子」です。これにより、DStreamの基になるRDDにアクセスして、データに対して実用的なアクションを実行できます。 foreachRDDデータベースにデータを書き込むことができます。

ここでのちょっとした工夫は、DStreamが時間制限のあるコレクションであることを理解することです。これを古典的なコレクションと比較してみましょう。ユーザーのリストを取得し、foreachを適用します。

val userList: List[User] = ???
userList.foreach{user => doSomeSideEffect(user)}

これにより、副作用関数doSomeSideEffectuserListコレクションの各要素に適用されます。

ここで、すべてのユーザーが現在わからないため、ユーザーのリストを作成できないとしましょう。代わりに、朝のラッシュ中にコーヒーショップに到着する人々のようなユーザーのストリームがあります。

val userDStream: DStream[User] = ???
userDstream.foreachRDD{usersRDD => 
    usersRDD.foreach{user => serveCoffee(user)}
}

ご了承ください:

  • DStream.foreachRDDは、RDD[User]シングルユーザーではないを提供します。コーヒーの例に戻ると、それはある時間間隔で到着したユーザーのコレクションです。
  • コレクションの単一の要素にアクセスするには、RDDをさらに操作する必要があります。この例では、rdd.foreachを使用して、各ユーザーにコーヒーを提供しています。

実行について考える:コーヒーを作るバリスタのクラスターがあるかもしれません。これらは私たちのエグゼキューターです。 Spark Streamingはユーザー(または注文)の小さなバッチを処理し、Sparkはバリスタに作業を分散し、コーヒーを並列化できるようにしますコーヒーのサービングを作り、スピードアップします。

46
maasg