Weitere ähnliche Inhalte
Ähnlich wie [db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデータベース技術からみたSparkの新しさを紹介 by 日本電信電話株式会社 山室 健 (20)
Mehr von Insight Technology, Inc. (20)
Kürzlich hochgeladen (12)
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデータベース技術からみたSparkの新しさを紹介 by 日本電信電話株式会社 山室 健
- 1. Copyright©2016 NTT corp. All Rights Reserved.
Spark Summit 2016@SFに参加してきたので
最新事例例などを紹介しつつデータベース技術から
みたSparkの新しさを紹介
2016/7/15
⼭山室 健 @ ⽇日本電信電話株式会社
- 3. 3Copyright©2016 NTT corp. All Rights Reserved.
• サーバクラスタの分散メモリを活⽤用しながら効率率率的に分
散並列列処理理することが可能な汎⽤用フレームワーク
• one-‐‑‒size-‐‑‒fits-‐‑‒ʼ’manyʼ’: 様々なAP(SQL, Streaming,
MLlib, ...)が実装され,同⼀一環境で動作
Sparkとは?
- 4. 4Copyright©2016 NTT corp. All Rights Reserved.
• 不不変で並列列実⾏行行可能な分散コレクションで,Sparkにお
ける唯⼀一のデータ操作のためのAPIを実装
Spark RDD -‐‑‒ Resilient Distributed Dataset
val data = Array(1, 2, 3, 4, 5) // Scalaのコレクション
val dataRdd = sc.parallelize(data) // 分散コレクション(RDD)へ変換
val result = dataRdd.map(_ + 1) // RDDに対する操作を定義
.fiter( _ % 2 == 0)
.reduce(_ + _)
- 5. 5Copyright©2016 NTT corp. All Rights Reserved.
• ユーザが記述したコードをDriver Programとして実
⾏行行し、Sparkの最⼩小実⾏行行単位のTaskに分解し,
Worker Node上に起動されたExecutorに割り当てる
ことで分散並列列実⾏行行を⾏行行う
Sparkの動作概要
引用: Cluster Overview, http://spark.apache.org/docs/1.6.2/cluster-overview.html
- 6. 6Copyright©2016 NTT corp. All Rights Reserved.
• 1. Download Spark binary v1.6.2
• http://spark.apache.org/downloads.html
• 2. Launch a Spark shell;
• ./<spark dir>/bin/spark-‐‑‒shell
• 3. Do word-‐‑‒couting
• scala> val textFile = sc.textFile(”hoge.txt")
• scala> val counts = textFile.flatMap(_̲.split(" "))
.map(word => (word, 1))
.reduceByKey(_̲ + _̲)
Quick Start!
- 7. 7Copyright©2016 NTT corp. All Rights Reserved.
• 2013.6 -‐‑‒ Apache Incubatorに
• 2014.2 -‐‑‒ Incubatorを卒業,Top-‐‑‒Levelプロジェクトに
• 2014.6 -‐‑‒ v1.0がリリース
• 2014.11 -‐‑‒ v1.1がリリース
• 2014.12 -‐‑‒ v1.2がリリース
• 2015.3 -‐‑‒ v1.3がリリース
• 2015.5 -‐‑‒ v1.4がリリース
• 2015.9 -‐‑‒ v1.5がリリース
• 2016.1 -‐‑‒ v1.6がリリース
• 2016.7 -‐‑‒ v2.0がリリース予定
Spark Release History
️いまここ
- 8. 8Copyright©2016 NTT corp. All Rights Reserved.
• Databrics社が主催するSpark関連の主要会議
• 2013年年から始まり今回で7回⽬目,特に昨年年の2015年年からは年年
3回のペースで実施(EU・アメリカ⻄西・東海岸)
• 来年年からオーストラリアが追加され年年4回開催の計画
Spark Summit
Spark Summit 2016 @ SF メイン会場の様子
- 9. 9Copyright©2016 NTT corp. All Rights Reserved.
• 参加者: 2500+⼈人(720+企業からの参加)*チケットはsold-‐‑‒out
• 直近のSpark Summit East 2016@東海岸では1300+⼈人だったため,
2倍近い動員数
• ⽇日本からの参加者は⽬目測で10名弱程度度
• IBMやMSなど強⼒力力なスポンサー企業
• その他にもColudera,HortonworksなどのHadoopベンダも後援
Spark Summit 2016 @ SFの概要 6/6-‐‑‒6/8
KEYNOTE
11%
ENTERPRISE
6%
DEVELOPER
15%
DATA
SCIENCE
17%
RESEARH
18%
ECOSYSTEM
18%
USE
CASE
15%
会議セッション内訳(全101件)
主要スポンサー企業(抜粋)
- 10. 10Copyright©2016 NTT corp. All Rights Reserved.
開発コミュニティの最新動向
• 今⽉月中にリリースを予定しているv2.0の話題
• Continuous(連続性)とStructuring(構造化)
• 連続的に⼊入⼒力力されるデータを,既存のバッチ処理理と同様の処理理
⽅方法(API)で,データを構造化しながら効率率率的に処理理
Databricsのco-founder兼CTOの
Matei Zaharia氏
Keynote”Spark 2.0”から引用
• 各セッションではメモリ管理理やオプティ
マイザ(Catalyst)などユーザの興味が
⾼高い部分の新機能を紹介
- 11. 11Copyright©2016 NTT corp. All Rights Reserved.
セッション全体の印象
• Keynoteとセッション共にDeep Learning(AI)に
関する取り組みの話題が散⾒見見
• Jeff Dean⽒氏(Google)やAndrew Ng(Baidu)などの著名⼈人
の話を筆頭に,IBM/Yahooなど各企業の取り組み紹介
• Sparkと直接関係ない話題も多かった
• Sparkに対する企業の関⼼心は⾮非常に⾼高く,依然としてコ
ミュニティは拡⼤大傾向にある印象
• 特に⼒力力を⼊入れているIBM(発表7件)とMicrosoft(発表5件)
• UberやAirbnbなどでも積極的に利利⽤用
• 〜~PB/⽇日の⼤大規模データ処理理に適⽤用(The Weather
Company/IBM)している事例例など
- 12. 12Copyright©2016 NTT corp. All Rights Reserved.
• Spark Streamingの事例例が多く,⼊入⼒力力としてApache
Kafka*とともに⽤用いる場合が⾮非常に多い
• 結果の出⼒力力先としてはApache HBaseやApache
Cassandraが⽤用いられていたが,定番として採⽤用され
る分散ストレージはない印象
Sparkの事例例紹介
*Apache Kafka, 分散メッセージングシステム
Spark Streaming処理概要
- 13. 13Copyright©2016 NTT corp. All Rights Reserved.
Sparkの事例例紹介 -‐‑‒ Microsoft Bing
• Top 5 Lessons Learned in Building Streaming
Applications at Microsoft Bing Scale
• Bingのクエリイベントを⼀一定間隔でマージする処理理
• Kafkaから⼊入⼒力力,マージ後にKafkaに書き戻す
• Spark v1.6.xではAP timeを指定してJoinするAPIが提供され
ていないため,独⾃自に記述して実現
Spark Streaming
➡️同様のことをしているユーザが多い模様
- 14. 14Copyright©2016 NTT corp. All Rights Reserved.
• Temporal Operators For Spark Streaming And
Its Application For Office365 Service
Monitoring
• サービスモニタリングに利利⽤用,問題が発⽣生した場合にアラート
• リクエストの成否,レイテンシなどを監視
• Join/Aggregate⽤用のTemporalオペレータを独⾃自実装
Sparkの事例例紹介 -‐‑‒ Microsoft Office365
- 15. 15Copyright©2016 NTT corp. All Rights Reserved.
• The Internet of Everywhere̶—How IBM The
Weather Company Scales
• バッチデータと連続的に⼊入⼒力力されるデータを統合して,BI/
Visualizationツールを⽤用いてデータ分析
• データ流流量量が~∼360PB/⽇日で,知っている中で最も⼤大規模なデー
タを取り扱った事例例
Sparkの事例例紹介 -‐‑‒ The Weather Company
* 図は同発表者がSpark Summit East 2016で使用したスライドから引用
- 16. 16Copyright©2016 NTT corp. All Rights Reserved.
• Online Security Analytics on Large Scale
Video Surveillance System
• 複数店舗にまたがった不不正なカードの利利⽤用の探索索,盗難があっ
た場合の過去の盗難履履歴からの顔検索索など
• 画像処理理はOpenCV,DL4j,DeepDistなどを利利⽤用
Sparkの事例例紹介 -‐‑‒ EMC
- 17. 17Copyright©2016 NTT corp. All Rights Reserved.
• Airstream: Spark Streaming At Airbnb
• ストリーム処理理における状態管理理,複数ストリームの処理理,
バッチ系との統合などを⾏行行った事例例
• 状態管理理には性能/管理理/機能/コミュニティなどの観点を考慮し
てHBaseを採⽤用
Sparkの事例例紹介 -‐‑‒ Airbnb
- 19. 19Copyright©2016 NTT corp. All Rights Reserved.
• ⼊入出⼒力力にParquet/ORC,map/shuffle処理理を軸にし
た分散処理理,SQL/DataFrameなどのIF,関係代数に
おける問い合わせ最適化,...
• 特に問い合わせ最適化の実装は既存のDB製品と⽐比べる
と基本的なものしかない
• 例例えばコストを考慮したJoin順序の最適化はしない,この種の
最適化に関しては現在検討中(SPARK-‐‑‒16026:Cost-‐‑‒based
optimizer framework)
要素技術としてあまり⽬目新しくはないSpark
- 20. 20Copyright©2016 NTT corp. All Rights Reserved.
• ⼊入⼒力力クエリは⼀一連の処理理最適化の後に,内部的には
RDDを⽤用いて記述された⼿手続に変換され実⾏行行
• 適⽤用可能な最適化はDBMSのものと基本的な相違はない
• データのヒストグラムやカーディナリティなどの事前知
識識がないため,遅い実⾏行行プランを選択しがち
Catalyst: Sparkの問い合わせ最適化
Analyzer
Optimizer
SparkPlanner
引用: “Deep Dive into Spark SQL’s Catalyst Optimizer”,
https://databricks.com/blog/2015/04/13/deep-dive-into-spark-sqls-catalyst-optimizer.html
入力クエリ
- 21. 21Copyright©2016 NTT corp. All Rights Reserved.
遅い実⾏行行プラン例例)Filter-‐‑‒>Join
クエリ例) SELECT * FROM a, b WHERE a.id == b.id AND a.value = 3;
Join Filter
• Filter処理理の結果によって最適なJoinの⽅方法は異異なる
• 1) Filter後のテーブルaが⾮非常に⼩小さい場合
➡️テーブルaをすべてのExecutorに転送
• 2) Filter後のテーブルaが⼤大きい場合
➡️テーブルaとテーブルbをHash-‐‑‒Join(ハッシュ分割して
同じidを持つデータを同じExecutorに転送)
* テーブルaとテーブルbのサイズは大きい前提
- 22. 22Copyright©2016 NTT corp. All Rights Reserved.
遅い実⾏行行プラン例例)Filter-‐‑‒>Join
クエリ例) SELECT * FROM a, b WHERE a.id == b.id AND a.value = 3;
Join Filter
• Filter処理理の結果によって最適なJoinの⽅方法は異異なる
• 1) Filter後のテーブルaが⾮非常に⼩小さい場合
➡️テーブルaをすべてのExecutorに転送
• 2) Filter後のテーブルaが⼤大きい場合
➡️テーブルaとテーブルbをHash-‐‑‒Join(ハッシュ分割して
同じidを持つデータを同じExecutorに転送)
入力データのカーディナリティが分からないため常に2)を選択するが
’a.value=3’の出力結果は小さくなることが多そう
* テーブルaとテーブルbのサイズは大きい前提
- 24. 24Copyright©2016 NTT corp. All Rights Reserved.
• あえて⾔言えば...最適化済み実⾏行行プランを体系的な⽅方法で等価な
javaコードに変換して実⾏行行時コンパイルを⾏行行う点
データベース技術からみたSparkの新しさ
Analyzer
Optimizer
SparkPlanner
引用: “Deep Dive into Spark SQL’s Catalyst Optimizer”,
https://databricks.com/blog/2015/04/13/deep-dive-into-spark-sqls-catalyst-optimizer.html
- 25. 25Copyright©2016 NTT corp. All Rights Reserved.
• Whole-‐‑‒stage Codegenという名前で開発
• 実⾏行行プランの部分⽊木を等価なコードブロックに変換
• オプションʻ‘spark.sql.codegen.wholeStageʼ’でon/offの切切り
替えが可能で,次期リリースではデフォルトでon
Sparkの実⾏行行時コンパイル
最適化済みの
実行プラン
まとめて
コードブロックに変換
実行時コンパイル
- 26. 26Copyright©2016 NTT corp. All Rights Reserved.
• 従来はVolcano-‐‑‒Style(イテレータモデル)に従った
プラン処理理が⼀一般的だが,分析などの複雑なクエリほど
CPU効率率率が悪いことで有名
従来の処理理⽅方式の問題
getNext()
Volcano-Styleに従ったプラン処理
• getNext()を呼ぶと1⾏行行のデータを返却
• 例例えば⼊入⼒力力データが100万⾏行行あった場
合,Scan➡️Filter間で100万回の関数
呼び出しが発⽣生
getNext()
getNext()
- 27. 27Copyright©2016 NTT corp. All Rights Reserved.
Cited from the article of “A Look Back at Single-Threaded CPU
Performance”, http://preshing.com/20120208/a-look-back-at-single-
threaded-cpu-performance
SPECint SPECfp
• クロック周波数は向上していないが2004年年以降降も命令令
レベル/データの並列列化を改善することでベンチマーク
による1スレッドの実性能は向上
並列列化によるCPU性能の改善
- 28. 28Copyright©2016 NTT corp. All Rights Reserved.
• 最適化が⾏行行いやすい形に変換してコンパイルすることで
CPU効率率率の⾼高いプラン処理理を実現
• “⼗十分に賢いコンパイラ”を仮定すれば下記のforループはSIMD
でデータ並列列化されて⾮非常に効率率率的な処理理に
CPU効率率率の⾼高いプラン処理理
- 29. 29Copyright©2016 NTT corp. All Rights Reserved.
• 以下の論論⽂文を参考に実装
• Thomas Neumann, Efficiently Compiling Efficient Query
Plans for Modern Hardware, VLDBʼ’11
• 各実⾏行行オペレータ(Scan,Filter,...)にproduceと
consumeの2つのIFを実装
• produce: データ⽣生成を依頼(⼦子のproduceを呼ぶ),部分⽊木
の葉葉であれば親のconsumeに⽣生成したデータを渡す
• consume:受け取ったデータに各オペレータの処理理を適⽤用して,
親のconsumeに渡す
Sparkの実⾏行行時コンパイルの実装
- 30. 30Copyright©2016 NTT corp. All Rights Reserved.
Sparkの実⾏行行時コンパイルの実装の例例
consume ()
コード生成フロー概要
consume ()
consume ()
produce()
produce()
produce()
doCodegen()
γ
π
σ
- γ.produce:
γ.child.produce()
- γ.consume:
print “count += 1”
- π.produce:
π.child.produce()
- π.consume:
π.parent.consume()
- σ.produce:
σ.child.produce()
- σ.consume:
print “if (ss_item_sk == 1000) {
${σ.parent.consume()}
}”
- scan.produce:
print “for (ss_item_sk in store_sales) {
${scan.parent.consume()}
}”
- 32. 32Copyright©2016 NTT corp. All Rights Reserved.
• Sparkの⽣生成したコードを確認
SPARKの実⾏行行時コンパイルの実際
scala> import org.apache.spark.sql.execution.debug._
scala> val df = sql("SELECT sqrt(a) FROM test WHERE b = 1”)
scala> df.explain
== Physical Plan ==
*Project [SQRT(cast(_1#2 as double)) AS SQRT(CAST(a AS DOUBLE))#18]
+- *Filter (_2#3 = 1)
+- LocalTableScan [_1#2, _2#3]
scala> df.debugCodegen
- 34. 34Copyright©2016 NTT corp. All Rights Reserved.
古くて新しい実⾏行行時コンパイルの歴史
• 1970年年代にIBM SystemRが初期の実⾏行行時コンパイル導⼊入; ⼊入⼒力力
されたクエリ(SEQUEL)を評価して事前に⽤用意したアセンブリ
と動的リンク
• 当時このアプローチはポータビリティと動的リンクした関数の呼び出
しコストが⾼高いことを理理由に⽤用いられなくなった
• ポータビリティの問題を解決するために,1980年年代の研究では直
接アセンブリを扱うのではなく,実⾏行行時にC/Pascalのコードを⽣生
成する抽象化を提案
• しかし今度度は実⾏行行時のコード⽣生成のコストが無視できなくなり流流⾏行行ら
なかった
• 2000年年前半に次世代のDBMSカーネル研究の⼀一環で,実⾏行行時の型
キャストのコストを減らすためにpointer injectionを⽤用いて事
前に⽤用意した型ごとの関数を利利⽤用する⼿手法の提案
• アプローチの妥当性はさておき,このデザインも当時あまり流流⾏行行らなかった
- 35. 35Copyright©2016 NTT corp. All Rights Reserved.
古くて新しい実⾏行行時コンパイルの歴史
• 2000年年後半にJavaのリフレクションを利利⽤用した実⾏行行時コンパイ
ル⼿手法が提案,この基本的なデザイン(抽象化)は近年年の⼿手法に⼤大
きく影響したといわれている
• 2010年年以降降にデータベース最適化技術の⼀一環として,研究界隈で
論論⽂文提案がいくつか⾏行行われた,特に他のモダンな最適化技術
(Vector-‐‑‒at-‐‑‒a-‐‑‒time実⾏行行やMicro-‐‑‒Specialization)と融合し
た評価や提案などが⾏行行われた
• Amazon Redshift, SQL Server, Presto, Hive, Spark,
Impala, MemSQLなどモダンなSQL処理理系の多くが,(実装デ
ザインは異異なるが)実⾏行行時コンパイルを⽤用いた最適化を導⼊入
- 39. 39Copyright©2016 NTT corp. All Rights Reserved.
TPCDSを⽤用いたベンチマーク結果
Cited from the slide of “Spark Performance: What's Next” in SPARK SUMMIT
EAST’16, http://www.slideshare.net/databricks/spark-performance-whats-next#28