spark=ストリーミング、データのすべてのバッチ間隔は常に1つだけのRDDを生成しますが、RDDをforeachするためにforeachRDD()
を使用する理由は何ですか?私のテストでは、RDDが複数回表示されることはありません。
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)}
これにより、副作用関数doSomeSideEffect
がuserList
コレクションの各要素に適用されます。
ここで、すべてのユーザーが現在わからないため、ユーザーのリストを作成できないとしましょう。代わりに、朝のラッシュ中にコーヒーショップに到着する人々のようなユーザーのストリームがあります。
val userDStream: DStream[User] = ???
userDstream.foreachRDD{usersRDD =>
usersRDD.foreach{user => serveCoffee(user)}
}
ご了承ください:
DStream.foreachRDD
は、RDD[User]
、シングルユーザーではないを提供します。コーヒーの例に戻ると、それはある時間間隔で到着したユーザーのコレクションです。rdd.foreach
を使用して、各ユーザーにコーヒーを提供しています。実行について考える:コーヒーを作るバリスタのクラスターがあるかもしれません。これらは私たちのエグゼキューターです。 Spark Streamingはユーザー(または注文)の小さなバッチを処理し、Sparkはバリスタに作業を分散し、コーヒーを並列化できるようにしますコーヒーのサービングを作り、スピードアップします。