SlideShare a Scribd company logo
1 of 25
Download to read offline
Copyright©2016 NTT corp. All Rights Reserved.	
2016.12.22
Takeshi  Yamamuro@  NTT  SIC
Sparkのクエリ処理理系と周辺の話題
2Copyright©2016 NTT corp. All Rights Reserved.	
⾃自⼰己紹介
3Copyright©2016 NTT corp. All Rights Reserved.	
• MapReduceを⼀一般化した処理理モデルを基にした分散並
列列処理理のためのフレームワーク
• DataFrame/Dataset  API上に様々なワークロード向
けのライブラリを提供(Unified  Engine)
Sparkとは?
(クエリ最適化を担当)
(クエリ実行を担当)
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(_ + _)
5Copyright©2016 NTT corp. All Rights Reserved.	
• DataFrameはスキーマありの不不変な分散コレクション
• 実際はDataFrame=Dataset[Row]
Spark  DataFrame/Dataset
引用: https://databricks.com/blog/
2016/07/14/a-tale-of-three-apache-
spark-apis-rdds-dataframes-and-
datasets.html
6Copyright©2016 NTT corp. All Rights Reserved.	
Sparkの最近の基本⽅方針
引用: http://www.slideshare.net/databricks/structuring-
spark-dataframes-datasets-and-streaming
7Copyright©2016 NTT corp. All Rights Reserved.	
Sparkの最近の基本⽅方針
引用: http://www.slideshare.net/databricks/structuring-
spark-dataframes-datasets-and-streaming
8Copyright©2016 NTT corp. All Rights Reserved.	
Sparkの動作概要
• ユーザが記述したコードをDriver  Programとして実
⾏行行し、Sparkの最⼩小実⾏行行単位のTaskに分解し,
Worker  Node上に起動されたExecutorに割り当てる
ことで分散並列列処理理を実現
引用: Cluster Overview, http://spark.apache.org/docs/2.0.0/cluster-overview.html
9Copyright©2016 NTT corp. All Rights Reserved.	
• 今年年の7⽉月末にv2.0が正式にリリース
• v2.xのリリースはAPIの安定化を中⼼心に開発4ヶ⽉月+
QA1ヶ⽉月ペースを計画
• 今後開発が予定されている注⽬目機能はコストベース最適
化(w/Huawei)やCPU最適化など
Sparkの過去のリリースと今後の⽅方向性
2012
2013
2014
2015
2016
2017
起源となる
論文(RDD)発表
Apache Incubator
に登録
ApacheのTop-level
プロジェクトに
v1.0
v1.1
v1.2
v1.3 v1.4 v1.5 v1.6 v2.0 v2.1 v2.2
2016.12.22現在
未リリースv0.6 v0.7
v0.8 v0.9
DataFrame
APIsの導入
限定的なコード生成の
サポート
Dataset
APIsの導入
コード生成の
正式サポート
10Copyright©2016 NTT corp. All Rights Reserved.	
• Catalystが関係モデルに従ったルールベースの最適化
を⾏行行い実⾏行行プラン⽊木(実⾏行行計画)を構築、⽊木の中から
コード⽣生成可能な部分⽊木をjavaのコードに変換&コン
パイルしてから実⾏行行を開始
現在のSpark内部のクエリ処理理
Parser & Analyzer
Optimizer
Executor
結果
従来の(関係)データベースの
クエリ処理
統計情報
入力データの分布を
近似したデータ
SQL
Join
Scan
Filter
Scan
Project
論理木
SortMergeJoin
Filter Sort
実行プラン木Project
カタログ
データベースに関する
メタデータ
- DSLの構文チェック
- カタログを用いた型や名前などのチェック
- 経験則に基づいたルールベースの書き換え
- プラン木の列挙(Joinの並び替えや実行アルゴリズム
の列挙)とCPU/IOのコストを考慮した選択
- 行単位のIteratorを用いたインタープリタ方式
の処理(Volcano-style)
Project
IndexScan SeqScan
11Copyright©2016 NTT corp. All Rights Reserved.	
• Catalystが関係モデルに従ったルールベースの最適化
を⾏行行い実⾏行行プラン⽊木(実⾏行行計画)を構築、⽊木の中から
コード⽣生成可能な部分⽊木をjavaのコードに変換&コン
パイルしてから実⾏行行を開始
現在のSpark内部のクエリ処理理
Parser & Analyzer
Optimizer(Catalyst)
Executor(RDD)
結果
Sparkのクエリ処理
SQL/DataFrame/Dataset
カタログ
データベースに関する
メタデータ
- 経験則に基づいたルールベースの書き換え
SortMergeJoin
Filter Sort
プラン木
Project Project
IndexScan SeqScan
Codegen
GeneratedPlan
GeneratedPlan GeneratedPlan
最終的な実行プラン木
- コード生成に対応した部分木を探索、等価な
javaコードを生成、コンパイル
- 行単位のIteratorを用いたインタープリタ方式
の処理(Volcano-style)
12Copyright©2016 NTT corp. All Rights Reserved.	
• 実⾏行行プラン⽊木の各ノードは、その⼦子ノードが返すレコー
ドを処理理するIteratorとして表現
•  故に実⾏行行プラン⽊木はIteratorの連鎖と⾒見見なせる
• 問題:  性能への⾼高いオーバヘッド
•  繰り返しの仮想関数nextの呼び出し
•  コンパイラによる最適化の余地が限りなく少ない
Volcano-‐‑‒styleの処理理と問題点
実行プラン木のFilterノードの実装例
next
next
next
13Copyright©2016 NTT corp. All Rights Reserved.	
実⾏行行プラン⽊木のコード⽣生成の⽬目的
• 1.  仮想関数呼び出しの除去
• 2.  中間データがレジスタに残りやすい処理理
• 3.  コンパイラによる最適化の享受
•  Loop  unrolling
•  データ並列列化(SIMD命令令の利利活⽤用)による⾼高速化
•  共通部分式除去など
レジスタに残りやすく、データ並列化しやすそう
コード生成
14Copyright©2016 NTT corp. All Rights Reserved.	
• SparkはProduce-‐‑‒Consumeモデル*1に基づいて実装
されたCode  Templateベースのコード⽣生成
•  コード⽣生成をサポートするプラン⽊木の各ノードにproduceと
consumeのIFを実装することでコード⽣生成を実現
•  SortやFilterは各ノードが持つCode  Templateを⽤用いて、等
価な処理理をjavaのコード(⽂文字列列)として返却
• 部分⽊木から⽣生成されたjavaのコードを軽量量な組み込み
コンパイラjanino*2を⽤用いてコンパイル
•  BufferedRowIteratorというIteratorと同様のIFを持つ抽象ク
ラスを派⽣生してコードが⽣生成されるため、コンパイルしてイン
スタンス化した後はIteratorとして扱う
Sparkにおけるコード⽣生成の実装
*1 Neumann先生の“Efficiently compiling efficient query plans
for modern hardware”の論文内で提案(2011)
*2 http://janino-compiler.github.io/janino/
15Copyright©2016 NTT corp. All Rights Reserved.	
• コード⽣生成をサポートする実⾏行行プラン⽊木の各ノードに以
下を満たすproduceとconsumeを実装
•  produce:  ⼊入⼒力力レコード⽣生成を依頼(⼦子のproduceを呼ぶ),
部分⽊木の葉葉であれば親のconsumeに⽣生成したレコードを渡す
•  consume:受け取ったレコードに各ノードの処理理を適⽤用して,
親のconsumeに渡す
Produce-‐‑‒Consumeモデル
16Copyright©2016 NTT corp. All Rights Reserved.	
Produce-‐‑‒Consumeモデル
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()}
}”
17Copyright©2016 NTT corp. All Rights Reserved.	
• doCodeGen()を呼ぶと以下のコードブロックを⽣生成
Produce-‐‑‒Consumeモデル
18Copyright©2016 NTT corp. All Rights Reserved.	
• Sparkの実⾏行行プラン⽊木の各ノードはSparkPlanという
抽象クラスを派⽣生させて実装
•  SparkPlanのexecute関数(前述のnext関数相当)の戻り値は
RDD[InternalRow*1]で、RDDは各Workerノード上では
Iteratorとして表現されている
• コード⽣生成をサポートするノードはCodegenSupport
というtrait*2をmixinする
Sparkのコード⽣生成の実装概要
*1 レコードの内部表現
*2 ここではjava8のinterfaceに近い何かと思ってもらって良い
trait CodegenSupport with SparkPlan {
...
protected def doProduce(ctx: CodegenContext): String
def doConsume(ctx: CodegenContext, input: Seq[ExprCode], row: ExprCode): String = {
throw new UnsupportedOperationException
}
}
19Copyright©2016 NTT corp. All Rights Reserved.	
• コード⽣生成可能な部分⽊木を発⾒見見すると部分⽊木の最上位に
WholeStageCodegenExec(とInputAdapter)と
いうノードを挿⼊入、これが部分⽊木のコード⽣生成、コンパ
イル、実⾏行行を仲介
Sparkのコード⽣生成の実装概要
WholeStageCodegenExec
InputAdapter
コード生成する部分木
生成されたコードと実行プランの間で
入力データを仲介するノード
20Copyright©2016 NTT corp. All Rights Reserved.	
• コード⽣生成可能な部分⽊木を発⾒見見すると部分⽊木の最上位に
WholeStageCodegenExec(とInputAdapter)と
いうノードを挿⼊入、これが部分⽊木のコード⽣生成、コンパ
イル、実⾏行行を仲介
Sparkのコード⽣生成の実装概要
WholeStageCodegenExec
InputAdapter
コード生成する部分木
doCodeGen()
produce()
produce()
produce()
produce()
consume()
consume()
consume()
consume()
class GeneratedIterator
extends RowBufferedIteraotr {
...
protected void processNext()
throws IOException {
...
}
}
生成されたjavaのコード
21Copyright©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
22Copyright©2016 NTT corp. All Rights Reserved.	
Sparkが内部で生成したコード
23Copyright©2016 NTT corp. All Rights Reserved.	
• ノードを跨いだコード⽣生成の最適化が困難
•  例例えばAggregateノード→Joinノードという部分⽊木があった場
合に、JoinとAggregateを合成して最適なコードを⽣生成するこ
とができれば冗⻑⾧長的な計算(実体化)を除去できる
• メンテナンス性が低い
•  ⾔言わずもがな・・・
• 処理理系に含まれる他のデータ構造を含めたコード⽣生成
(⽊木構造やハッシュ表を含めた展開)が困難
•  現状のSparkでも、集約ノード⾃自体はコード⽣生成しているが集
約処理理に使うハッシュ表の操作はコード⽣生成できていない
Code  Templateベースのコード⽣生成の⾮非難
24Copyright©2016 NTT corp. All Rights Reserved.	
• ⾼高度度な組み込みコンパイラ基盤を活⽤用することでCode  
Templateベースのコード⽣生成での問題を解決
•  Y.  Klonatos  et  al.,  “Building  Efficient  Query  Engines  in  a  
High-‐‑‒Level  Language”,  VLDB,  2014
•  EPFL(スイス連邦⼯工科⼤大)とOracleの共同研究で、2014年年の
VLDBのBest  Paperの1つ
• 実⾏行行プラン⽊木からコードを直接⽣生成するのではなく、よ
り最適化できる中間表現を設計することで解決
•  A.  Shaikhha  et  al.,  “How  to  Architect  a  Query  
Compiler”,  SIGMOD,  2016  
•  上記のEPFLと同じ研究グループによる提案
コード⽣生成のNext  Step  –  研究動向  contʼ’d
25Copyright©2016 NTT corp. All Rights Reserved.	
• グラフ処理理、機械学習、SQLなどの異異なる処理理を統⼀一し
て表現出来る中間表現を定め、ランタイム中に複数の異異
なる中間表現を結合&最適化して性能を改善
•  S.  Palkar  et  al.,  “Weld:  A  Common  Runtime  for  High  
Performance  Data  Analytics”,  CIDR,  2017
•  AuthorのメンバにSpark  RDDを提案したMatei⽒氏
コード⽣生成のNext  Step  –  研究動向

More Related Content

What's hot

Pythonで入門するApache Spark at PyCon2016
Pythonで入門するApache Spark at PyCon2016Pythonで入門するApache Spark at PyCon2016
Pythonで入門するApache Spark at PyCon2016Tatsuya Atsumi
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアルK Yamaguchi
 
Apache Spark超入門 (Hadoop / Spark Conference Japan 2016 講演資料)
Apache Spark超入門 (Hadoop / Spark Conference Japan 2016 講演資料)Apache Spark超入門 (Hadoop / Spark Conference Japan 2016 講演資料)
Apache Spark超入門 (Hadoop / Spark Conference Japan 2016 講演資料)NTT DATA OSS Professional Services
 
Apache Sparkについて
Apache SparkについてApache Sparkについて
Apache SparkについてBrainPad Inc.
 
HiveとImpalaのおいしいとこ取り
HiveとImpalaのおいしいとこ取りHiveとImpalaのおいしいとこ取り
HiveとImpalaのおいしいとこ取りYukinori Suda
 
Sparkをノートブックにまとめちゃおう。Zeppelinでね!(Hadoopソースコードリーディング 第19回 発表資料)
Sparkをノートブックにまとめちゃおう。Zeppelinでね!(Hadoopソースコードリーディング 第19回 発表資料)Sparkをノートブックにまとめちゃおう。Zeppelinでね!(Hadoopソースコードリーディング 第19回 発表資料)
Sparkをノートブックにまとめちゃおう。Zeppelinでね!(Hadoopソースコードリーディング 第19回 発表資料)NTT DATA OSS Professional Services
 
Spark Streamingを活用したシステムの検証結果と設計時のノウハウ
Spark Streamingを活用したシステムの検証結果と設計時のノウハウSpark Streamingを活用したシステムの検証結果と設計時のノウハウ
Spark Streamingを活用したシステムの検証結果と設計時のノウハウFuture Of Data Japan
 
QConTokyo2015「Sparkを用いたビッグデータ解析 〜後編〜」
QConTokyo2015「Sparkを用いたビッグデータ解析 〜後編〜」QConTokyo2015「Sparkを用いたビッグデータ解析 〜後編〜」
QConTokyo2015「Sparkを用いたビッグデータ解析 〜後編〜」Kazuki Taniguchi
 
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)NTT DATA OSS Professional Services
 
Hadoopエコシステムの最新動向とNTTデータの取り組み (OSC 2016 Tokyo/Spring 講演資料)
Hadoopエコシステムの最新動向とNTTデータの取り組み (OSC 2016 Tokyo/Spring 講演資料)Hadoopエコシステムの最新動向とNTTデータの取り組み (OSC 2016 Tokyo/Spring 講演資料)
Hadoopエコシステムの最新動向とNTTデータの取り組み (OSC 2016 Tokyo/Spring 講演資料)NTT DATA OSS Professional Services
 
初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜
初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜
初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜Tanaka Yuichi
 
本当にあったApache Spark障害の話
本当にあったApache Spark障害の話本当にあったApache Spark障害の話
本当にあったApache Spark障害の話x1 ichi
 
ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!Nagato Kasaki
 
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC EnterpriseYusukeKuramata
 
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)Hadoop / Spark Conference Japan
 
SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係datastaxjp
 

What's hot (20)

Apache Hadoop and YARN, current development status
Apache Hadoop and YARN, current development statusApache Hadoop and YARN, current development status
Apache Hadoop and YARN, current development status
 
Pythonで入門するApache Spark at PyCon2016
Pythonで入門するApache Spark at PyCon2016Pythonで入門するApache Spark at PyCon2016
Pythonで入門するApache Spark at PyCon2016
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアル
 
Apache Spark超入門 (Hadoop / Spark Conference Japan 2016 講演資料)
Apache Spark超入門 (Hadoop / Spark Conference Japan 2016 講演資料)Apache Spark超入門 (Hadoop / Spark Conference Japan 2016 講演資料)
Apache Spark超入門 (Hadoop / Spark Conference Japan 2016 講演資料)
 
Apache Sparkについて
Apache SparkについてApache Sparkについて
Apache Sparkについて
 
HiveとImpalaのおいしいとこ取り
HiveとImpalaのおいしいとこ取りHiveとImpalaのおいしいとこ取り
HiveとImpalaのおいしいとこ取り
 
Sparkをノートブックにまとめちゃおう。Zeppelinでね!(Hadoopソースコードリーディング 第19回 発表資料)
Sparkをノートブックにまとめちゃおう。Zeppelinでね!(Hadoopソースコードリーディング 第19回 発表資料)Sparkをノートブックにまとめちゃおう。Zeppelinでね!(Hadoopソースコードリーディング 第19回 発表資料)
Sparkをノートブックにまとめちゃおう。Zeppelinでね!(Hadoopソースコードリーディング 第19回 発表資料)
 
Spark Streamingを活用したシステムの検証結果と設計時のノウハウ
Spark Streamingを活用したシステムの検証結果と設計時のノウハウSpark Streamingを活用したシステムの検証結果と設計時のノウハウ
Spark Streamingを活用したシステムの検証結果と設計時のノウハウ
 
Apache Sparkの紹介
Apache Sparkの紹介Apache Sparkの紹介
Apache Sparkの紹介
 
QConTokyo2015「Sparkを用いたビッグデータ解析 〜後編〜」
QConTokyo2015「Sparkを用いたビッグデータ解析 〜後編〜」QConTokyo2015「Sparkを用いたビッグデータ解析 〜後編〜」
QConTokyo2015「Sparkを用いたビッグデータ解析 〜後編〜」
 
ストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Stormストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Storm
 
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)
 
Hadoopエコシステムの最新動向とNTTデータの取り組み (OSC 2016 Tokyo/Spring 講演資料)
Hadoopエコシステムの最新動向とNTTデータの取り組み (OSC 2016 Tokyo/Spring 講演資料)Hadoopエコシステムの最新動向とNTTデータの取り組み (OSC 2016 Tokyo/Spring 講演資料)
Hadoopエコシステムの最新動向とNTTデータの取り組み (OSC 2016 Tokyo/Spring 講演資料)
 
初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜
初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜
初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜
 
本当にあったApache Spark障害の話
本当にあったApache Spark障害の話本当にあったApache Spark障害の話
本当にあったApache Spark障害の話
 
ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!
 
Hadoop2.6の最新機能+
Hadoop2.6の最新機能+Hadoop2.6の最新機能+
Hadoop2.6の最新機能+
 
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
 
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
 
SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係
 

Similar to Sparkのクエリ処理系と周辺の話題

SparkやBigQueryなどを用いた モバイルゲーム分析環境
SparkやBigQueryなどを用いたモバイルゲーム分析環境SparkやBigQueryなどを用いたモバイルゲーム分析環境
SparkやBigQueryなどを用いた モバイルゲーム分析環境yuichi_komatsu
 
Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Tanaka Yuichi
 
Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~
Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~
Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~sugiyama koki
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますinfinite_loop
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例Shigeru UCHIYAMA
 
MapReduceを置き換えるSpark 〜HadoopとSparkの統合〜 #cwt2015
MapReduceを置き換えるSpark 〜HadoopとSparkの統合〜 #cwt2015MapReduceを置き換えるSpark 〜HadoopとSparkの統合〜 #cwt2015
MapReduceを置き換えるSpark 〜HadoopとSparkの統合〜 #cwt2015Cloudera Japan
 
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...Insight Technology, Inc.
 
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...NTT DATA Technology & Innovation
 
TerraformでECS+ECRする話
TerraformでECS+ECRする話TerraformでECS+ECRする話
TerraformでECS+ECRする話Satoshi Hirayama
 
Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Tanaka Yuichi
 
2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料Recruit Technologies
 
Deep Learning On Apache Spark
Deep Learning On Apache SparkDeep Learning On Apache Spark
Deep Learning On Apache SparkYuta Imai
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇Manabu Ori
 
dstn交流会_DataSpider のソーシャルとの融合、手組との融合
dstn交流会_DataSpider のソーシャルとの融合、手組との融合dstn交流会_DataSpider のソーシャルとの融合、手組との融合
dstn交流会_DataSpider のソーシャルとの融合、手組との融合dstn
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani Minoru
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjugYuji Kubota
 

Similar to Sparkのクエリ処理系と周辺の話題 (20)

Apache spark 2.3 and beyond
Apache spark 2.3 and beyondApache spark 2.3 and beyond
Apache spark 2.3 and beyond
 
hscj2019_ishizaki_public
hscj2019_ishizaki_publichscj2019_ishizaki_public
hscj2019_ishizaki_public
 
SparkやBigQueryなどを用いた モバイルゲーム分析環境
SparkやBigQueryなどを用いたモバイルゲーム分析環境SparkやBigQueryなどを用いたモバイルゲーム分析環境
SparkやBigQueryなどを用いた モバイルゲーム分析環境
 
Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析
 
Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~
Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~
Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 
MapReduceを置き換えるSpark 〜HadoopとSparkの統合〜 #cwt2015
MapReduceを置き換えるSpark 〜HadoopとSparkの統合〜 #cwt2015MapReduceを置き換えるSpark 〜HadoopとSparkの統合〜 #cwt2015
MapReduceを置き換えるSpark 〜HadoopとSparkの統合〜 #cwt2015
 
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...
 
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
 
TerraformでECS+ECRする話
TerraformでECS+ECRする話TerraformでECS+ECRする話
TerraformでECS+ECRする話
 
Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析
 
Survey of Apache Spark
Survey of Apache SparkSurvey of Apache Spark
Survey of Apache Spark
 
2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料
 
Deep Learning On Apache Spark
Deep Learning On Apache SparkDeep Learning On Apache Spark
Deep Learning On Apache Spark
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
dstn交流会_DataSpider のソーシャルとの融合、手組との融合
dstn交流会_DataSpider のソーシャルとの融合、手組との融合dstn交流会_DataSpider のソーシャルとの融合、手組との融合
dstn交流会_DataSpider のソーシャルとの融合、手組との融合
 
Spring “BigData”
Spring “BigData”Spring “BigData”
Spring “BigData”
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjug
 

More from Takeshi Yamamuro

LT: Spark 3.1 Feature Expectation
LT: Spark 3.1 Feature ExpectationLT: Spark 3.1 Feature Expectation
LT: Spark 3.1 Feature ExpectationTakeshi Yamamuro
 
Quick Overview of Upcoming Spark 3.0 + α
Quick Overview of Upcoming Spark 3.0 + αQuick Overview of Upcoming Spark 3.0 + α
Quick Overview of Upcoming Spark 3.0 + αTakeshi Yamamuro
 
MLflowによる機械学習モデルのライフサイクルの管理
MLflowによる機械学習モデルのライフサイクルの管理MLflowによる機械学習モデルのライフサイクルの管理
MLflowによる機械学習モデルのライフサイクルの管理Takeshi Yamamuro
 
Taming Distributed/Parallel Query Execution Engine of Apache Spark
Taming Distributed/Parallel Query Execution Engine of Apache SparkTaming Distributed/Parallel Query Execution Engine of Apache Spark
Taming Distributed/Parallel Query Execution Engine of Apache SparkTakeshi Yamamuro
 
LLJVM: LLVM bitcode to JVM bytecode
LLJVM: LLVM bitcode to JVM bytecodeLLJVM: LLVM bitcode to JVM bytecode
LLJVM: LLVM bitcode to JVM bytecodeTakeshi Yamamuro
 
20180417 hivemall meetup#4
20180417 hivemall meetup#420180417 hivemall meetup#4
20180417 hivemall meetup#4Takeshi Yamamuro
 
An Experimental Study of Bitmap Compression vs. Inverted List Compression
An Experimental Study of Bitmap Compression vs. Inverted List CompressionAn Experimental Study of Bitmap Compression vs. Inverted List Compression
An Experimental Study of Bitmap Compression vs. Inverted List CompressionTakeshi Yamamuro
 
VLDB2013 R1 Emerging Hardware
VLDB2013 R1 Emerging HardwareVLDB2013 R1 Emerging Hardware
VLDB2013 R1 Emerging HardwareTakeshi Yamamuro
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4Takeshi Yamamuro
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
Introduction to Modern Analytical DB
Introduction to Modern Analytical DBIntroduction to Modern Analytical DB
Introduction to Modern Analytical DBTakeshi Yamamuro
 
SIGMOD’12勉強会 -Session 7-
SIGMOD’12勉強会 -Session 7-SIGMOD’12勉強会 -Session 7-
SIGMOD’12勉強会 -Session 7-Takeshi Yamamuro
 
A x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesA x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesTakeshi Yamamuro
 
VLDB’11勉強会 -Session 9-
VLDB’11勉強会 -Session 9-VLDB’11勉強会 -Session 9-
VLDB’11勉強会 -Session 9-Takeshi Yamamuro
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 

More from Takeshi Yamamuro (20)

LT: Spark 3.1 Feature Expectation
LT: Spark 3.1 Feature ExpectationLT: Spark 3.1 Feature Expectation
LT: Spark 3.1 Feature Expectation
 
Apache Spark + Arrow
Apache Spark + ArrowApache Spark + Arrow
Apache Spark + Arrow
 
Quick Overview of Upcoming Spark 3.0 + α
Quick Overview of Upcoming Spark 3.0 + αQuick Overview of Upcoming Spark 3.0 + α
Quick Overview of Upcoming Spark 3.0 + α
 
MLflowによる機械学習モデルのライフサイクルの管理
MLflowによる機械学習モデルのライフサイクルの管理MLflowによる機械学習モデルのライフサイクルの管理
MLflowによる機械学習モデルのライフサイクルの管理
 
Taming Distributed/Parallel Query Execution Engine of Apache Spark
Taming Distributed/Parallel Query Execution Engine of Apache SparkTaming Distributed/Parallel Query Execution Engine of Apache Spark
Taming Distributed/Parallel Query Execution Engine of Apache Spark
 
LLJVM: LLVM bitcode to JVM bytecode
LLJVM: LLVM bitcode to JVM bytecodeLLJVM: LLVM bitcode to JVM bytecode
LLJVM: LLVM bitcode to JVM bytecode
 
20180417 hivemall meetup#4
20180417 hivemall meetup#420180417 hivemall meetup#4
20180417 hivemall meetup#4
 
An Experimental Study of Bitmap Compression vs. Inverted List Compression
An Experimental Study of Bitmap Compression vs. Inverted List CompressionAn Experimental Study of Bitmap Compression vs. Inverted List Compression
An Experimental Study of Bitmap Compression vs. Inverted List Compression
 
20160908 hivemall meetup
20160908 hivemall meetup20160908 hivemall meetup
20160908 hivemall meetup
 
20150513 legobease
20150513 legobease20150513 legobease
20150513 legobease
 
20150516 icde2015 r19-4
20150516 icde2015 r19-420150516 icde2015 r19-4
20150516 icde2015 r19-4
 
VLDB2013 R1 Emerging Hardware
VLDB2013 R1 Emerging HardwareVLDB2013 R1 Emerging Hardware
VLDB2013 R1 Emerging Hardware
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Introduction to Modern Analytical DB
Introduction to Modern Analytical DBIntroduction to Modern Analytical DB
Introduction to Modern Analytical DB
 
SIGMOD’12勉強会 -Session 7-
SIGMOD’12勉強会 -Session 7-SIGMOD’12勉強会 -Session 7-
SIGMOD’12勉強会 -Session 7-
 
A x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesA x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequences
 
VAST-Tree, EDBT'12
VAST-Tree, EDBT'12VAST-Tree, EDBT'12
VAST-Tree, EDBT'12
 
VLDB’11勉強会 -Session 9-
VLDB’11勉強会 -Session 9-VLDB’11勉強会 -Session 9-
VLDB’11勉強会 -Session 9-
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 

Sparkのクエリ処理系と周辺の話題

  • 1. Copyright©2016 NTT corp. All Rights Reserved. 2016.12.22 Takeshi  Yamamuro@  NTT  SIC Sparkのクエリ処理理系と周辺の話題
  • 2. 2Copyright©2016 NTT corp. All Rights Reserved. ⾃自⼰己紹介
  • 3. 3Copyright©2016 NTT corp. All Rights Reserved. • MapReduceを⼀一般化した処理理モデルを基にした分散並 列列処理理のためのフレームワーク • DataFrame/Dataset  API上に様々なワークロード向 けのライブラリを提供(Unified  Engine) 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. • DataFrameはスキーマありの不不変な分散コレクション • 実際はDataFrame=Dataset[Row] Spark  DataFrame/Dataset 引用: https://databricks.com/blog/ 2016/07/14/a-tale-of-three-apache- spark-apis-rdds-dataframes-and- datasets.html
  • 6. 6Copyright©2016 NTT corp. All Rights Reserved. Sparkの最近の基本⽅方針 引用: http://www.slideshare.net/databricks/structuring- spark-dataframes-datasets-and-streaming
  • 7. 7Copyright©2016 NTT corp. All Rights Reserved. Sparkの最近の基本⽅方針 引用: http://www.slideshare.net/databricks/structuring- spark-dataframes-datasets-and-streaming
  • 8. 8Copyright©2016 NTT corp. All Rights Reserved. Sparkの動作概要 • ユーザが記述したコードをDriver  Programとして実 ⾏行行し、Sparkの最⼩小実⾏行行単位のTaskに分解し, Worker  Node上に起動されたExecutorに割り当てる ことで分散並列列処理理を実現 引用: Cluster Overview, http://spark.apache.org/docs/2.0.0/cluster-overview.html
  • 9. 9Copyright©2016 NTT corp. All Rights Reserved. • 今年年の7⽉月末にv2.0が正式にリリース • v2.xのリリースはAPIの安定化を中⼼心に開発4ヶ⽉月+ QA1ヶ⽉月ペースを計画 • 今後開発が予定されている注⽬目機能はコストベース最適 化(w/Huawei)やCPU最適化など Sparkの過去のリリースと今後の⽅方向性 2012 2013 2014 2015 2016 2017 起源となる 論文(RDD)発表 Apache Incubator に登録 ApacheのTop-level プロジェクトに v1.0 v1.1 v1.2 v1.3 v1.4 v1.5 v1.6 v2.0 v2.1 v2.2 2016.12.22現在 未リリースv0.6 v0.7 v0.8 v0.9 DataFrame APIsの導入 限定的なコード生成の サポート Dataset APIsの導入 コード生成の 正式サポート
  • 10. 10Copyright©2016 NTT corp. All Rights Reserved. • Catalystが関係モデルに従ったルールベースの最適化 を⾏行行い実⾏行行プラン⽊木(実⾏行行計画)を構築、⽊木の中から コード⽣生成可能な部分⽊木をjavaのコードに変換&コン パイルしてから実⾏行行を開始 現在のSpark内部のクエリ処理理 Parser & Analyzer Optimizer Executor 結果 従来の(関係)データベースの クエリ処理 統計情報 入力データの分布を 近似したデータ SQL Join Scan Filter Scan Project 論理木 SortMergeJoin Filter Sort 実行プラン木Project カタログ データベースに関する メタデータ - DSLの構文チェック - カタログを用いた型や名前などのチェック - 経験則に基づいたルールベースの書き換え - プラン木の列挙(Joinの並び替えや実行アルゴリズム の列挙)とCPU/IOのコストを考慮した選択 - 行単位のIteratorを用いたインタープリタ方式 の処理(Volcano-style) Project IndexScan SeqScan
  • 11. 11Copyright©2016 NTT corp. All Rights Reserved. • Catalystが関係モデルに従ったルールベースの最適化 を⾏行行い実⾏行行プラン⽊木(実⾏行行計画)を構築、⽊木の中から コード⽣生成可能な部分⽊木をjavaのコードに変換&コン パイルしてから実⾏行行を開始 現在のSpark内部のクエリ処理理 Parser & Analyzer Optimizer(Catalyst) Executor(RDD) 結果 Sparkのクエリ処理 SQL/DataFrame/Dataset カタログ データベースに関する メタデータ - 経験則に基づいたルールベースの書き換え SortMergeJoin Filter Sort プラン木 Project Project IndexScan SeqScan Codegen GeneratedPlan GeneratedPlan GeneratedPlan 最終的な実行プラン木 - コード生成に対応した部分木を探索、等価な javaコードを生成、コンパイル - 行単位のIteratorを用いたインタープリタ方式 の処理(Volcano-style)
  • 12. 12Copyright©2016 NTT corp. All Rights Reserved. • 実⾏行行プラン⽊木の各ノードは、その⼦子ノードが返すレコー ドを処理理するIteratorとして表現 •  故に実⾏行行プラン⽊木はIteratorの連鎖と⾒見見なせる • 問題:  性能への⾼高いオーバヘッド •  繰り返しの仮想関数nextの呼び出し •  コンパイラによる最適化の余地が限りなく少ない Volcano-‐‑‒styleの処理理と問題点 実行プラン木のFilterノードの実装例 next next next
  • 13. 13Copyright©2016 NTT corp. All Rights Reserved. 実⾏行行プラン⽊木のコード⽣生成の⽬目的 • 1.  仮想関数呼び出しの除去 • 2.  中間データがレジスタに残りやすい処理理 • 3.  コンパイラによる最適化の享受 •  Loop  unrolling •  データ並列列化(SIMD命令令の利利活⽤用)による⾼高速化 •  共通部分式除去など レジスタに残りやすく、データ並列化しやすそう コード生成
  • 14. 14Copyright©2016 NTT corp. All Rights Reserved. • SparkはProduce-‐‑‒Consumeモデル*1に基づいて実装 されたCode  Templateベースのコード⽣生成 •  コード⽣生成をサポートするプラン⽊木の各ノードにproduceと consumeのIFを実装することでコード⽣生成を実現 •  SortやFilterは各ノードが持つCode  Templateを⽤用いて、等 価な処理理をjavaのコード(⽂文字列列)として返却 • 部分⽊木から⽣生成されたjavaのコードを軽量量な組み込み コンパイラjanino*2を⽤用いてコンパイル •  BufferedRowIteratorというIteratorと同様のIFを持つ抽象ク ラスを派⽣生してコードが⽣生成されるため、コンパイルしてイン スタンス化した後はIteratorとして扱う Sparkにおけるコード⽣生成の実装 *1 Neumann先生の“Efficiently compiling efficient query plans for modern hardware”の論文内で提案(2011) *2 http://janino-compiler.github.io/janino/
  • 15. 15Copyright©2016 NTT corp. All Rights Reserved. • コード⽣生成をサポートする実⾏行行プラン⽊木の各ノードに以 下を満たすproduceとconsumeを実装 •  produce:  ⼊入⼒力力レコード⽣生成を依頼(⼦子のproduceを呼ぶ), 部分⽊木の葉葉であれば親のconsumeに⽣生成したレコードを渡す •  consume:受け取ったレコードに各ノードの処理理を適⽤用して, 親のconsumeに渡す Produce-‐‑‒Consumeモデル
  • 16. 16Copyright©2016 NTT corp. All Rights Reserved. Produce-‐‑‒Consumeモデル 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()} }”
  • 17. 17Copyright©2016 NTT corp. All Rights Reserved. • doCodeGen()を呼ぶと以下のコードブロックを⽣生成 Produce-‐‑‒Consumeモデル
  • 18. 18Copyright©2016 NTT corp. All Rights Reserved. • Sparkの実⾏行行プラン⽊木の各ノードはSparkPlanという 抽象クラスを派⽣生させて実装 •  SparkPlanのexecute関数(前述のnext関数相当)の戻り値は RDD[InternalRow*1]で、RDDは各Workerノード上では Iteratorとして表現されている • コード⽣生成をサポートするノードはCodegenSupport というtrait*2をmixinする Sparkのコード⽣生成の実装概要 *1 レコードの内部表現 *2 ここではjava8のinterfaceに近い何かと思ってもらって良い trait CodegenSupport with SparkPlan { ... protected def doProduce(ctx: CodegenContext): String def doConsume(ctx: CodegenContext, input: Seq[ExprCode], row: ExprCode): String = { throw new UnsupportedOperationException } }
  • 19. 19Copyright©2016 NTT corp. All Rights Reserved. • コード⽣生成可能な部分⽊木を発⾒見見すると部分⽊木の最上位に WholeStageCodegenExec(とInputAdapter)と いうノードを挿⼊入、これが部分⽊木のコード⽣生成、コンパ イル、実⾏行行を仲介 Sparkのコード⽣生成の実装概要 WholeStageCodegenExec InputAdapter コード生成する部分木 生成されたコードと実行プランの間で 入力データを仲介するノード
  • 20. 20Copyright©2016 NTT corp. All Rights Reserved. • コード⽣生成可能な部分⽊木を発⾒見見すると部分⽊木の最上位に WholeStageCodegenExec(とInputAdapter)と いうノードを挿⼊入、これが部分⽊木のコード⽣生成、コンパ イル、実⾏行行を仲介 Sparkのコード⽣生成の実装概要 WholeStageCodegenExec InputAdapter コード生成する部分木 doCodeGen() produce() produce() produce() produce() consume() consume() consume() consume() class GeneratedIterator extends RowBufferedIteraotr { ... protected void processNext() throws IOException { ... } } 生成されたjavaのコード
  • 21. 21Copyright©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
  • 22. 22Copyright©2016 NTT corp. All Rights Reserved. Sparkが内部で生成したコード
  • 23. 23Copyright©2016 NTT corp. All Rights Reserved. • ノードを跨いだコード⽣生成の最適化が困難 •  例例えばAggregateノード→Joinノードという部分⽊木があった場 合に、JoinとAggregateを合成して最適なコードを⽣生成するこ とができれば冗⻑⾧長的な計算(実体化)を除去できる • メンテナンス性が低い •  ⾔言わずもがな・・・ • 処理理系に含まれる他のデータ構造を含めたコード⽣生成 (⽊木構造やハッシュ表を含めた展開)が困難 •  現状のSparkでも、集約ノード⾃自体はコード⽣生成しているが集 約処理理に使うハッシュ表の操作はコード⽣生成できていない Code  Templateベースのコード⽣生成の⾮非難
  • 24. 24Copyright©2016 NTT corp. All Rights Reserved. • ⾼高度度な組み込みコンパイラ基盤を活⽤用することでCode   Templateベースのコード⽣生成での問題を解決 •  Y.  Klonatos  et  al.,  “Building  Efficient  Query  Engines  in  a   High-‐‑‒Level  Language”,  VLDB,  2014 •  EPFL(スイス連邦⼯工科⼤大)とOracleの共同研究で、2014年年の VLDBのBest  Paperの1つ • 実⾏行行プラン⽊木からコードを直接⽣生成するのではなく、よ り最適化できる中間表現を設計することで解決 •  A.  Shaikhha  et  al.,  “How  to  Architect  a  Query   Compiler”,  SIGMOD,  2016   •  上記のEPFLと同じ研究グループによる提案 コード⽣生成のNext  Step  –  研究動向  contʼ’d
  • 25. 25Copyright©2016 NTT corp. All Rights Reserved. • グラフ処理理、機械学習、SQLなどの異異なる処理理を統⼀一し て表現出来る中間表現を定め、ランタイム中に複数の異異 なる中間表現を結合&最適化して性能を改善 •  S.  Palkar  et  al.,  “Weld:  A  Common  Runtime  for  High   Performance  Data  Analytics”,  CIDR,  2017 •  AuthorのメンバにSpark  RDDを提案したMatei⽒氏 コード⽣生成のNext  Step  –  研究動向