More Related Content
Similar to Apache Spark 2.4 and 3.0 What's Next? (20)
More from NTT DATA Technology & Innovation (20)
Apache Spark 2.4 and 3.0 What's Next?
- 1. © 2019 NTT DATA Corporation
2019/03/19
株式会社NTTデータ 技術開発本部
猿田 浩輔
Apache Spark 2.4 and 3.0 - What's Next? -
- 2. © 2019 NTT DATA Corporation 2
猿田 浩輔
株式会社NTTデータ 技術開発本部
Apache Sparkコミッタ (2015年から)
Hadoop/SparkなどOSS並列分散処理系のテクニカルサ
ポートに従事してきた
最近はPersistent Memoryなど新しいトレンドのハードウェア
の活用に興味
$ whoami
- 3. © 2019 NTT DATA Corporation 3
オープンソースの並列分散処理系
並列分散処理の面倒な部分は処理系が解決してくれる
障害時のリカバリ
タスクの分割やスケジューリング
etc
What is Apache ?
大量のデータを たくさんのサーバを並べて
並列分散処理し、
現実的な時間(数分~数時間)で
目的の処理結果を得る
- 4. © 2019 NTT DATA Corporation 4
Unified Analytics Engine
Spark Core
(Sparkのデータ処理エンジンや基本的なAPIなどを含む)
Spark Streaming
(ストリーム処理)
Spark SQL
(クエリ処理)
Structured
Streaming
(ストリーム処理)
GraphX
(グラフ処理)
MLlib / Spark ML
(機械学習)
SQL
- 5. © 2019 NTT DATA Corporation 5
近年はSpark SQLを中心とした処理系になってきており、パフォー
マンスや利便性が良くなった
宣言的なAPIやSQL/HiveQLで処理が書ける
オプティマイザによる最適化の恩恵が受けられる
開発言語による性能差が出にくい
機械学習、ストリーム処理向けのライブラリも、Spark SQLのデー
タ構造であるDataFrame / Datasetをベースとしたものが整備され
てきた
MLlib (spark.mlパッケージ)
Structured Streaming
RDDからDataFrame / Datasetを中心とした処理系へ
// 宣言的なAPIでクエリを記述する例
// DataFrame (テーブル上のデータ構造)にParquetフォーマットのファイルをロード
val df = spark.read.parquet(“/path/to/file”)
// 港区在住の人の平均給与を求めるクエリ
df.select($”salary”).where($”residence” === “港区”).avg()
- 6. © 2019 NTT DATA Corporation 6
Kubernetesサポート (Spark 2.4 / 3.0)
Project Hydrogen
Barrier Execution Mode (Spark 2.4)
Accelerator Aware Scheduling (Spark 3.0)
Spark Graph (Spark 3.0)
本日主にご紹介する新機能
- 8. © 2019 NTT DATA Corporation 8
Spark 2.3(ひとつ前のフィーチャーリリース)からKubernetes
がサポートされた
2.3では機能不足だったSparkも徐々に完成度を上げている
Spark on Kubernetes
Spark Core
(Sparkのデータ処理エンジンや基本的なAPIなどを含む)
Spark Streaming
(ストリーム処理ラ
イブラリ)
Spark SQL
(クエリでデータ処理を記述する
ためのライブラリ)
Structured
Streaming
(ストリーム処理ラ
イブラリ)
GraphX
(グラフ処理処理ラ
イブラリ)
MLlib / Spark ML
(機械学習ライブラリ)
YARN Standalone Mesos Kubernetes
- 9. © 2019 NTT DATA Corporation 9
Spark 2.4
サポートする開発言語の強化
• PySpark対応(SPARK-23984)
• SparkR対応(SPARK-24433)
クライアントモードでの動作(SPARK-23146)
• インタラクティブシェルやノートブックと組み合わせて利用できるように
なった
Spark 3.0
Kerberosサポート(SPARK-23257) 大体完了
• KerberizedなHDFSやHBaseなどと連携が可能に
Driver/Executor Pod向けのユーザ定義テンプレート マージ済み
• Kubernetesらしく、宣言的に設定できる(SPARK-24434)
ダイナミックリソースアロケーション(SPARK-24432) 3.0に向けて議論中
External Shuffle Service(SPARK-25299) 3.0に向けて議論中
Kubernetesサポート in Spark 2.4 and 3.0
- 10. © 2019 NTT DATA Corporation 10
Project Hydrogen
- 11. © 2019 NTT DATA Corporation 11
SparkにおけるAI(特にディープラーニング)を活用したユース
ケースをカバーするためのサブプロジェクト
Sparkはこれまでもディープラーニングのユースケースで活用
されてきたが、浮き彫りになった弱点を強化する取り組み
大きく3つの取り組みから成り立っている
Project Hydrogen
Barrier Execution
Mode
Optimized Data
Exchange
Accelerator Aware
Scheduling
2.4で基本部分が実装済み 3.0での導入を目標に開発
が進められている
- 12. © 2019 NTT DATA Corporation 12
Sparkでは、ユーザが記述した処理から「ステージ」や「タス
ク」と呼ばれる処理単位が生成される
複数のExecutorが異なるタスクを処理することでクラスタ全
体で分散処理が行われる
Sparkの処理単位(おさらい)
タスク
タスク
タスク
タスク
タスク
ステージ1 シャッフル ステージ2 シャッフル ステージ3
タスク
タスク
タスク
タスク
- 13. © 2019 NTT DATA Corporation 13
Executorへのタスクの割り当ては、Sparkのスケジューラが
決定する
ステージ間は依存関係になっており、先行するステージのタ
スクがすべて完了すると後続のステージのスケジューリング
が始まる
タスクのスケジューリング(おさらい)
タスク
タスク
タスク
タスク
タスク
ステージ1 シャッフル ステージ2 シャッフル ステージ3
タスク
タスク
タスク
タスク
ステージ1のタスクがすべて完了したら、
ステージ2のタスクのスケジューリングが始まる
- 14. © 2019 NTT DATA Corporation 14
従来からのタスクスケジューリングは、データローカリティや
Executorの空コア数などに基づいて行われる
コアを遊ばせないようにタスクがスケジューリングされる
同じステージに含まれるタスクが一斉にスケジューリン
グされるとは限らない
あるタスクが失敗した場合、当該タスクのみリトライされる
ステージ内の他のタスクは影響を受けない
タスクのスケジューリング(おさらい)
タスク
タスク
タスク
進行中のタスク
スケジューリング
待ちのタスク
タスク
タスク
タスク
×
完了
完了
リトライが必要なのは
失敗したタスクだけ
- 15. © 2019 NTT DATA Corporation 15
従来のスケジューリング方式は、各タスクが独立に動作する
前提になっており、分散ディープラーニングなどで必要とされ
る、複数のタスクの協調動作の実現が難しい
協調動作が必要なタスクを同時にスケジューリング
協調動作が必要なタスクのいずれかが失敗したら、他の
タスクもまとめて再スケジューリング
スケジューリングのほかに、タスク間で同期する仕組み
もない
分散ディープラーニングにおける従来のスケジューリングの課題
タスク
タスク
タスク
進行中のタスク
スケジューリング
待ちのタスク
タスク
タスク
タスク
×
完了
完了
リトライが必要なのは
失敗したタスクだけ
- 16. © 2019 NTT DATA Corporation 16
Barrier Execution Modeは複数のタスクの協調動作を可能
にする、新しいスケジューリング方式
協調動作が必要なタスクが同時にExecutorに、をまとめ
てスケジューリング可能
• Executorのコアに空があっても、同時に動作が必要
なタスク数に満たなければスケジューリングしない
協調動作が必要なタスクのいずれかが失敗した場合は、
同じステージのすべてのタスクをリトライ
タスク間での同期のメカニズムも実装されている
従来のスケジューリング方式と組み合わせて利用可能
Barrier Execution Mode
- 17. © 2019 NTT DATA Corporation 17
RDD#barrierメソッドで、Barrier Execution Modeでのスケ
ジューリング対象を設定できる
BarrierTaskContext#barrierメソッドで、タスク間の同期点を設定で
きる
具体的な通信処理ロジックなどはDLフレームワーク側やDL
アプリケーション開発者が実装する必要がある
Barrier Execution Modeは協調を可能にする仕掛けを提供
するだけ
Barrier Execution Mode
rdd.barrier().mapPartitions() { iter =>
val context = BarrierTaskContext.get() // バリアタスクコンテキストを取得
<何か処理>
context.barrier() // ここでタスク間の待ち合わせ
- 18. © 2019 NTT DATA Corporation 18
3.0への導入に向けて、Project Hydrogenの中では最近議
論が活発
Standalone / YARN / Kubernetes向けに導入が検討されて
いる
Hadoop 3.1.2からYARNがGPUをサポート(管理し、払
い出す対象のリソースとして認識)。
クラスタマネージャの機能と連携しながら、Spark側のスケ
ジューラもアクセラレータリソースが払い出されたExecutorへ
のタスクのスケジューリングを行う
例えば、どのExecutor上でどのくらいのアクセラレータが
利用できるかで、タスクのスケジューリングを制御する必
要がある
3.0ではGPU向けの機能が実装される見込み
Accelerator Aware Scheduling
- 20. © 2019 NTT DATA Corporation 20
これまでもSpark向けに様々なグラフ処理ライブラリがあった
GraphX
GraphFrames
Spark GraphはGraphXやGraph Frameの課題を解決する
新しいグラフ処理ライブラリ
3.0への導入に向けて議論が進められている
Spark向けのグラフ処理ライブラリ
- 21. © 2019 NTT DATA Corporation 21
GraphX
RDDベース
Scala APIしか提供されていない
あまりメンテナンスされていない
GraphFrames
DataFrameベース
SparkPackagesで提供されるサードパーティパッケージ
エッジやノードのセマンティクスが弱く、単純なグラフマッ
チングしか行えない
従来のSpark向けのグラフライブラリの問題点
- 22. © 2019 NTT DATA Corporation 22
GraphFramesではノード集合やエッジ集合をDataFrameで表現する
各レコードがノードやエッジに対応する
DataFrameのレコードとして表現されるため、ノードやエッジに属性
が付与できる
ただし、ノードやエッジそのものに「型」は定義できない
GraphFramesのデータモデル
太郎 次郎
東京 NYC
姉妹都市
居住
兄弟
居住
駐在経験
• 右のグラフで緑のノードは場所
を表し、水色のノードは人を表
す(型が違う)。
• エッジについても色ごとに種類
が異なる。
• GraphFramesではエッジやノード
の「型」を設定できないため、種
類の違いを区別できない
- 23. © 2019 NTT DATA Corporation 23
GraphFramesではMotifsと呼ばれる簡易的なクエリでグラフマッチングが
行える
ただし、エッジやノードに型が定義できないため、形状に基づくマッチング
しか行えない
属性(例えばノードに関連付けられた人の名前など)を考慮したマッチング
もサポートされていない
Motifsでマッチした結果はDataFrameとして得られるので、複雑なマッチ
ングを行う場合はDataFrameのオペレーションと併用する
GraphFramesのグラフマッチング
val motifs = g.find(“(node1)-[edge]->(node2)”)
val filtered = motifs.filter(“edge.rel = ‘居住’”)
例えば、先述のグラフで居住者と居住地を表す部分グラフを抽出したい場合
は、Motifsでマッチングした後にエッジに付与された属性が「居住」であるもの
をフィルタするひつようがある。
- 24. © 2019 NTT DATA Corporation 24
Property Graphと呼ばれるデータモデルを扱う
エッジやノードに「属性」だけでなく「型」が設定できる
Cypherによるグラフマッチングが可能
Property Graphに対して、型や属性に基づくマッチングが可能
マッチしたエッジやノードだけでなく、付与された属性もDataFrameとして
返却可能
Spark Graph
val result: CypherResult = graph.cypher(
"""|MATCH (person: 人)-[rel: 居住]->(loc: 都市)
"""|RETURN person.name, loc.name""").stripMargin
result.df.show()
| person.name | loc.name |
| 太郎 | 東京 |
| 次郎 | 東京 |
Property Graphに対するCypherの適用例
- 26. © 2019 NTT DATA Corporation 26
Pandas UDFの強化(ユーザ定義集約関数やWindow関数が定義
できるようになった)
ビルトイン関数/高階関数の拡充
2.4では、主に配列やマップなど、複雑なデータ型を対象とし
た29個のビルトイン関数を追加
3.0でもマップ向けの高階関数が追加される見通し
サポートするデータソースの追加(Avro, 画像ファイル)
Structured StreamingへForeachBatchシンクの追加
レコード単位ではなく、DataFrame単位でのオペレーションが
記述できる(Spark StreamingのforeachRDDと似ている)
複数のデータストアへの出力などに使える
ほかにもまだまだ・・・ in Spark 2.4
- 27. © 2019 NTT DATA Corporation 27
Java11サポート
既にmasterブランチ/3.0ブランチにはマージ済み
Scala 2.12サポート
Spark 2.4からすでにScala 2.12が利用できるが、Spark 3.0
ではScala 2.12がデフォルトになる予定
Hadoop 3系サポート
Sparkが依存しているHiveのバージョンも上げなければならな
い
依存するHiveのバージョンを1.2.1から2.3.4にアップグレード
ほかにもまだまだ・・・ in Spark 3.0
Editor's Notes
- みなさん、こんばんは。
今日私からは、Apache Sparkの現時点での最新フィーチャーリリースである2.4と、
そして今年リリースが期待される3.0の新機能をいくつかご紹介したいと思います。