More Related Content Similar to Structured Streaming - The Internal - (20) More from NTT DATA OSS Professional Services (20) Structured Streaming - The Internal -1. 1
© 2017 NTT DATA Corporation
NTTデータ OSSプロフェッショナルサービス
猿田 浩輔
2017/10/30 NTTデータ テクノロジーカンファレンス2017
Structured Streaming
- The Internal -
2. 2
• 猿田 浩輔
• Apache Sparkコミッタ
• Timeline View作者
• Hadoop/SparkなどOSS並列分散処理系のテクニカルサ
ポートに従事
$ whoami
4. 4
• Apache Sparkの新しいストリーム処理系
• Spark SQLの上に構築される
• Spark 2.0で試験的に導入され、2.2でα版を卒業
• Spark Streamingには無かったセマンティクスをサポート
• イベントタイムウィンドウ集約
• 遅れて到着したデータのハンドリング
• End-to-End Exactly Once
Structured Streaming
16. 16
① 部分集約処理
• タスクローカルでグループごとに集約処理を行う
② 部分マージ処理1
• 各タスクが部分集約処理した結果を、グループキーに基づいて
シャッフルしてマージ
③ ステートリストア
• 直前のマイクロバッチで保存された「ステート」をリストアする
④ 部分マージ処理2
• 部分マージ処理1の出力とリストアしたステートをマージする
⑤ ステートセーブ
• 部分マージ処理2の結果を「ステート」として保存する
⑥ 最終処理
• 集約関数固有の最終処理
ステートフル集約処理は6つのフェーズで行われる
17. 17
例題: 平均値を求める - 部分集約処理 -
20
17
30
A
B
C
area temp
A 20
B 17
C 30
・
・
・
DataFrame
(観測点の気温)
32
31
22
B
B
A
27
15
17
C
A
A
20
17
30
A
B
C
1
1
1
累積気温 観測件数
累積値とレコード数の属性を追加
sumarea count
63
22
B
A
2
1
27
32
C
A
1
2
分
割
し
て
各
タ
ス
ク
に
分
配
タ
ス
ク
ご
と
に
集
約
18. 18
例題: 平均値を求める - 部分マージ処理1 -
20
17
30
A
B
C
1
1
1
累積気温 観測件数
sumarea count
63
22
B
A
2
1
27
32
C
A
1
2
20
22
32
A
A
A
1
1
2
17
63
B
B
1
2
30
27
C
C
1
1
74A 4
80B 3
57C 2
観測点ごとにマージ
(累積気温と観測件数を足し合わせる)
観
測
点
ご
と
に
シ
ャ
ッ
フ
ル
19. 19
例題: 平均値を求める - ステートリストア -
sumarea count
80A 374A 4
80B 3
57C 2
areaの値をキーに、ステートストア
からステート(過去のマイクロバッチ
の部分マージ2の結果)を読み出す
ステートストア
⊕
⊕
⊕
150B 5
150C 5
74A 4
80A 3
80B 3
150B 5
57C 2
150C 5
key=A
key=B
key=C
20. 20
例題: 平均値を求める - 部分マージ2 -
sumarea count
74A 4
80A 3
80B 3
150B 5
57C 2
150C 5
154A 7
230B 8
207C 7
ステートストアからリストアしたステートと、当該
マイクロバッチの部分マージ1の結果をマージ
(累積気温と観測件数を足し合わせる)
21. 21
例題: 平均値を求める - ステートセーブ -
sumarea count
154A 7
230B 8
207C 7
ステートストア
areaの値をキーに、ステートをアップ
デート
ステートセーブの出力は出力モードに
依存する(この例はCompleteモード)
181D 6
154A 7
34E 2
230B 8
135F 5
207C 7
22. 22
例題: 平均値を求める - 最終処理 -
最終処理(sum / countで観測地点ごとの平均気温を求める)
181D 6
154A 7
34E 2
230B 8
135F 5
207C 7
sumarea count
sum / count
30.1D
22A
avgarea
17E
28.8B
27F
29.6C
27. 27
window time word
start end
12:00 12:07 12:00 Spark
12:06 12:13 12:08 Hadoop
イベントタイムウィンドウの作り方
• 任意のイベントタイムを持つレコードについて、それらが属する、開始時間が
最も遅いタイムウィンドウを求める
• 求め方は実行プラン作成時に、イベントタイムを変数として定式化できる
• ウィンドウ幅=7分
• スライディング幅=3分
DataFrame
time word
12:00 Spark
12:08 Hadoop
28. 28
イベントタイムウィンドウの作り方
time word
12:00 Spark
12:08 Hadoop
window time word
start end
11:54 12:01 12:00 Spark
11:57 12:04 12:00 Spark
12:00 12:07 12:00 Spark
12:00 12:07 12:08 Hadoop
12:03 12:10 12:08 Hadoop
12:06 12:13 12:08 Hadoop
• 任意のレコードが属するタイムウィンドウの最大数分だけタイムウィンドウを増幅する
• 最大数はウィンドウ幅とスライディング幅から求められる
• ウィンドウ幅=7分
• スライディング幅=3分
DataFrame
29. 29
イベントタイムウィンドウの作り方
time word
12:00 Spark
12:08 Hadoop
time < window.start || window.end <= timeであるレコードを除外する
• ウィンドウ幅=7分
• スライディング幅=3分
DataFrame
window time word
start end
11:54 12:01 12:00 Spark
11:57 12:04 12:00 Spark
12:00 12:07 12:00 Spark
12:00 12:07 12:08 Hadoop
12:03 12:10 12:08 Hadoop
12:06 12:13 12:08 Hadoop
30. 30
イベントタイムウィンドウ集約
windowとwordでグループ化/集約処理
window time word
start end
11:54 12:01 12:00 Spark
11:57 12:04 12:00 Spark
12:00 12:07 12:00 Spark
12:03 12:10 12:08 Hadoop
12:06 12:13 12:08 Hadoop
12:00 12:07 12:04 Spark
12:03 12:10 12:04 Spark
window word count
start end
11:54 12:01 Spark 1
11:57 12:04 Spark 1
12:00 12:07 Spark 2
12:03 12:10 Hadoop 1
12:03 12:10 Spark 1
12:06 12:13 Hadoop 1