More Related Content
Similar to Spark Structured Streaming with Kafka (20)
More from Sotaro Kimura (7)
Spark Structured Streaming with Kafka
- 2. 自己紹介
• Kimura, Sotaro(@kimutansk)
– データエンジニア雑用係 @ ドワンゴ
• オンプレ~クラウド、インフラ~個別機能
• バッチ~ストリーム、開発~プロマネ
– すなわち雑用係
– 好きな技術分野
• ストリーム処理(主にJVM上)
• 分散システム
– ストリーム処理で最近やらかした失敗
• Spark StreamingをSSH接続>起動して
実行ツールのセッション切れてログロスト
- 4. アジェンダ
• Spark Structured Streamingとは?
• Spark Structured Streamingの用語
• Spark Strucutred Streamingの実行の流れ
• Kakfa用コンポーネントの構成
- 6. Spark Structured Streamingとは?
• Spark SQL上でストリーム処理アプリケーションを
簡単に組むためのコンポーネント
– Spark2.2系でProduction Ready!
– バッチ処理と同様の方法でストリーム処理を記述可能
• バッチ処理で読み込んだデータとストリームのJoinも可能!
– Scala/Java/PythonのDataset/DataFrame APIで記述
– Dataset/DataFrameを用いることで
構造化データとして最適化された状態で動作
• メモリ使用量の節約
• ベクトル演算によるCPUリソースの有効活用
- 7. Spark Structured Streamingとは?
• 注意点
– Spark Streamingと同様マイクロバッチ方式であり、
レコード単位で処理するストリーム処理ではない。
– Sparkの新実行エンジンDrizzleとは独立した別の機能
• https://github.com/amplab/drizzle-spark
– Spark2.3.0で継続的に実行する方式についての提案も
挙がっているが、現状の進み具合から
おそらくSpark2.3.0では無理?
• [SPARK-20928]
Continuous Processing Mode for Structured Streaming
- 8. 簡単なアプリケーション例
// Sparkアプリケーション生成
val spark = SparkSession
.builder
.appName("StructuredNetworkWordCount")
.getOrCreate()
import spark.implicits._
// ローカルポート上にソケットを生成してデータを待ち受け
val lines = spark.readStream
.format("socket")
.option("host", "localhost")
.option("port", 9999)
.load()
- 9. 簡単なアプリケーション例
// 入力データを単語毎に分割
val words = lines.as[String].flatMap(_.split(" "))
// 入力単語毎にカウント
val wordCounts = words.groupBy("value").count()
// 集計結果を毎回すべてコンソールに出力するStreamingQueryを生成
val streamingQuery = wordCounts.writeStream
.outputMode("complete") // 出力モードを指定
.format("console")
.start()
// アプリケーションが外部から停止されるまで実行
streamingQuery.awaitTermination()
- 12. 用語説明(アプリケーション例)
• Source
– データの入力元
• Sink
– データの出力先
• Streaming Query
– 1連の処理単位。出力先1つ、入力元1個以上持つ。
• Output Mode
– Sinkへ出力する際の出力方式
• Append(結果を1回出力)/Complete(毎回全出力)
Update(更新があった結果のみ出力)の3モードが存在
- 21. 実行の流れ(詳細:状態復旧)
• 「 Sourceからデータの取得>破棄」を行う理由
– OffsetLogの最終値=BatchCommitLogの最終値の場合、
Spark側として処理完了したものの、
Sourceに対してCommitせずに完了したことを表すため。
• 繰り返しになるが、SourceへのCommitはSparkとして
処理完了したタイミングとは異なるタイミングで実施。
– Source側がCommitされたから復旧したケースを
考慮していると思われる。
• その場合、そのまま実行すると復旧した範囲を無視して、
その次のデータを読み込んでCommitという流れとなるため。
- 23. 実行の流れ(詳細:次バッチ作成)
– Watermarkの更新
• 前回のバッチ実行時の最新EventTime値 - Delay値を基準
– 以下のようなコードで指定可能
– 出力されるOffset値の形式
• Sourceに依存する。
Sourceコンポーネント側で生成。
– Kafkaについては後述。
– 保存されるLogの世代
– 「spark.sql.streaming.minBatchesToRetain」で指定(Def:100)
exampleDataFrame.withWatermark('eventTime', "10 minute")
# eventTimeカラムを用いてWatermark設定、許容遅延を10分に設定
- 33. まとめ
• Spark Strucured Streamingは
Source/Sink/Offsetという形で
各コンポーネントを抽象化して使用
– コンポーネント毎の固有個所は意外に少ない
• 上記はSourceRegisterに登録して適用
• Offsetは自前で管理しており、
KafkaのOffset管理の機構は未使用