私はBigDataエコシステムに慣れていないので、始めましょう。
kafkaストリーミングを使用したsparkトピックの読み取りに関するいくつかの記事を読みましたが、kafkaからsparkストリーミングではなくジョブ?はいの場合、私を始めるのに役立ついくつかの記事またはコードスニペットを指摘するのを手伝ってくれませんか。
質問の2番目の部分は、寄せ木細工の形式でhdfsに書き込むことです。 Kafkaから読み取ったら、RDDがあると思います。このrddをデータフレームに変換してから、データフレームを寄木細工のファイルとして書き込みます。これは正しいアプローチですか?.
助けてくれてありがとう。
ありがとう
Kafkaからデータを読み取り、ストリーミングの代わりにSparkバッチジョブを使用して、Parquet形式でHDFSに書き込むには、 Spark Structured Streaming を使用できます。
構造化ストリーミングは、Spark SQLエンジン上に構築された、スケーラブルでフォールトトレラントなストリーム処理エンジンです。静的データのバッチ計算を表現するのと同じ方法でストリーミング計算を表現できます。 Spark SQLエンジンは、それを段階的かつ継続的に実行し、ストリーミングデータが到着し続けると最終結果を更新します。 Scala、Java、PythonまたはRのDataset/DataFrame APIを使用して、ストリーミング集計、イベント時間ウィンドウ、ストリームからバッチへの結合などを表現できます。計算は、同じ最適化されたSpark SQLエンジン。最後に、システムはチェックポイント機能とログ先行書き込みにより、エンドツーエンドの1回限りのフォールトトレランスを保証します。つまり、Structured Streamingは、ユーザーがストリーミングについて推論する必要なしに、高速でスケーラブルな、フォールトトレラントなエンドツーエンドの正確に1回のストリーム処理を提供します。
Kafkaが組み込みのソースとして付属しています。つまり、Kafkaからデータをポーリングできます。 Kafkaブローカーバージョン0.10.0以降と互換性があります。
バッチモードでKafkaからデータをプルするために、オフセットの定義された範囲のDataset/DataFrameを作成できます。
// Subscribe to 1 topic defaults to the earliest and latest offsets
val df = spark
.read
.format("kafka")
.option("kafka.bootstrap.servers", "Host1:port1,Host2:port2")
.option("subscribe", "topic1")
.load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.as[(String, String)]
// Subscribe to multiple topics, specifying explicit Kafka offsets
val df = spark
.read
.format("kafka")
.option("kafka.bootstrap.servers", "Host1:port1,Host2:port2")
.option("subscribe", "topic1,topic2")
.option("startingOffsets", """{"topic1":{"0":23,"1":-2},"topic2":{"0":-2}}""")
.option("endingOffsets", """{"topic1":{"0":50,"1":-1},"topic2":{"0":-1}}""")
.load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.as[(String, String)]
// Subscribe to a pattern, at the earliest and latest offsets
val df = spark
.read
.format("kafka")
.option("kafka.bootstrap.servers", "Host1:port1,Host2:port2")
.option("subscribePattern", "topic.*")
.option("startingOffsets", "earliest")
.option("endingOffsets", "latest")
.load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.as[(String, String)]
ソースの各行には、次のスキーマがあります。
| Column | Type |
|:-----------------|--------------:|
| key | binary |
| value | binary |
| topic | string |
| partition | int |
| offset | long |
| timestamp | long |
| timestampType | int |
現在、データを寄木細工の形式でHDFSに書き込むには、次のコードを記述します。
df.write.parquet("hdfs://data.parquet")
Spark構造化ストリーミング+ Kafkaの詳細については、次のガイドを参照してください- Kafka統合ガイド
お役に立てば幸いです。
あなたはすでにこのトピックについていくつかの良い答えを持っています。
強調したいだけです-寄木細工のテーブルに直接ストリーミングするように注意してください。 Parquetのパフォーマンスは、Parquetの行グループのサイズが十分に大きい場合に簡単になります(簡単にするために、たとえばファイルサイズを64〜256Mbのオーダーにする必要があります)。辞書の圧縮やブルームフィルターなどを利用できます(1つのParquetファイルには複数のその行チャンク。通常、各ファイルに複数の行チャンクがありますが、行チャンクは複数の寄木細工のファイルにまたがることはできません)
寄木細工のテーブルに直接ストリーミングしている場合、非常に多くの小さな寄木細工のファイルが作成される可能性があります(Sparkのミニバッチサイズ、およびデータの量によって異なります)このようなファイルのクエリは非常に遅くなる可能性があります。たとえば、Parquetはスキーマを調整するためにすべてのファイルのヘッダーを読み取る必要があり、それは大きなオーバーヘッドです。これが当てはまる場合は、たとえば次のような別のプロセスが必要です回避策、古いファイルを読み取り、それらを「マージ」して書き込みます(これは単純なファイルレベルのマージではなく、プロセスは実際にすべての寄木細工のデータを読み取って、より大きな寄木細工のファイルを作り出す必要があります)。
この回避策により、データの「ストリーミング」の本来の目的が失われる可能性があります。ここでも他のテクノロジーを見ることができます-Apache Kudu、Apache Kafka、Apache Druid、Kinesisなど、ここでうまく機能します。
更新:この回答を投稿したので、ここに新しい強力なプレーヤーがいます-Delta Lake。 https://delta.io/ 寄木細工に慣れている場合、Deltaは非常に魅力的です(実際、Deltaは寄木細工のレイヤー+メタデータの上に構築されています)。 Delta Lakeが提供するもの:
SparkでのACIDトランザクション:
Kafka Streamsを使用します。SparkStreamingは誤った名称です(これはフードの下でのミニバッチで、少なくとも2.2までです)。
https://eng.verizondigitalmedia.com/2017/04/28/Kafka-to-Hdfs-ParquetSerializer/