27
5回 システム系論文輪読会 Building Efficient Query Engines in a HighLevel Language 20150520 maropu@pfi

20150513 legobease

Embed Size (px)

Citation preview

Page 1: 20150513 legobease

第5回 システム系論文輪読会  Building  Efficient  Query  Engines  in  a  High-­‐Level  Language  

20150520  maropu@pfi  

Page 2: 20150513 legobease

本日紹介する論文

•  VLDB’14  Best  Paper  Awardsの受賞論文  

•  EPFL(スイス連邦工科大)とOracleの共同研究  •  EPFLはScalaのMarLn  Oderskyや、DBMSのHW 適化の研究

で有名なAnastasia  Ailamakiが所属  

hOp://www.vldb.org/2014/awards.html  

Page 3: 20150513 legobease

Outline

•  DBMSクエリエンジンの性能/生産性のトレードオフを解消  –  Abstrac(on  without  Regret  [21,  10,  11]の実現  –  高級言語(Scala)で開発しながら,C/C++で 適化したものに近い性

能を実現するデザインを再考  

•  LegoBase:  実行時 適化を活用して,クエリ処理モデルにおける抽象化の性能オーバヘッドを低減  –  クエリの中間表現(IR)の操作にScalaを活用することで,低級言語で

は難しい柔軟で幅広い 適化を実現  –  終的にCコード片に変換,clang/LLVMでコンパイルして実行  –  数100行のScala実装でHyper*を上回るTPC-­‐Hの性能  

*  VLDB’14  Early  Career  Awardの Thomas  Neumannが主導で開発,hOp://www.hyper-­‐db.com/

Page 4: 20150513 legobease

NoLce

•  PVLDB掲載後にEraOaが投稿,本発表は未反映  –  Errata  for  “Building  Efficient  Query  Engines  in  a  High-­‐Level  

Language”  (PVLDB  7(10):853-­‐864),  Proc.  of  VLDB,  Vol.  7,  No.  13,  2014  

Page 5: 20150513 legobease

What’s  Scala?

•  JVMベースで生産性向上を目的としたオブジェクト指向と関数型の特徴を兼ねた言語  

•  現在の 新版が2.11.6  –  hOp://www.scala-­‐lang.org/  

•  Apache  Spark*の開発言語として有名  

*  100x  faster  than  HadoopMR,  hOps://spark.apache.org/

Page 6: 20150513 legobease

性能/生産性のトレードオフ比較

実行時 適化  

Page 7: 20150513 legobease

実行時 適化

•  実行時情報(クエリやデータの統計情報)を用いてコード生成とコンパイルをRunLmeに行う手法の総称  

•  近年のDBMS研究で再燃,モダンなOSSでも積極的に活用  –  1981年のSystemR  [2]が先駆け  –  VLDB’13とICDE’14でチュートリアル*が連年で採択  

–  SQL処理系であるImplaやSpark  SQL,PostgreSQL用のGPUアクセラレータであるPG-­‐Strom  

•  既存手法:  Code  Templateを用いたコード生成  –  雛形用の文字列を用意して、後で実行時情報を埋め込む  

*  StraLs  D.  Viglas,  Just-­‐in-­‐Lme  compilaLon  for  SQL  query  processing        -­‐  VLDB’13,  hOp://www.vldb.org/2013/tutorials.html        -­‐  ICDE’14,  hOp://ieee-­‐icde2014.eecs.northwestern.edu/seminar.html

Page 8: 20150513 legobease

Code  TemplateのNaïveな例

//  Define  a  code  template  for  runLme  compilaLon  #define  CODE_TEMPLATE    “int  main()  {  prinr(\“%s\”);  return  0;  }”    //  Embed  runLme  info.  in  the  template  const  char  *p  =  “test”;  snprinr(buf,  sizeof(buf),  CODE_TEMPATE,  p);    //  Compile  and  invoke  it  …    

Page 9: 20150513 legobease

Impala/SparkSQLにおける実行時 適化

•  クエリの情報のみを用いたシンプルな 適化が多い  –  スキーマ情報や,述語関数の条件など  

•  Impala*1はLLVMを,SparkSQL*2はReflecLonを用いて実装  –  適用される代表的な部分は入力データのパース処理,述語・集約関

数,Expression木における四則演算など  

•  Impalaで2〜3倍程度の性能改善  –  hOp://blog.cloudera.com/blog/2013/02/inside-­‐cloudera-­‐impala-­‐

runLme-­‐code-­‐generaLon/  

 

*1  hOps://github.com/cloudera/Impala/tree/cdh5-­‐trunk/be/src/codegen  *2  hOps://github.com/apache/spark/tree/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen  

Page 10: 20150513 legobease

Impala/SparkSQLにおける実行時 適化

•  Project  Tungsten:  Bringing  Spark  Closer  to  Bare  Metal  –  SparkにおけるCPU 適化に関するプロジェクト  

 

hOps://databricks.com/blog/2015/04/28/project-­‐tungsten-­‐bringing-­‐spark-­‐closer-­‐to-­‐bare-­‐metal.htmlから引用  

Page 11: 20150513 legobease

PG-­‐Stromにおける実行時 適化

hOp://www.slideshare.net/kaigai/gpgpupostgresql/10から引用  

Page 12: 20150513 legobease

既存手法(Code  Template)の課題

•  1. 実装が複雑  

•  2.  オペレータ間を超えた 適化が不可能  –  集約(join)と結合(group-­‐by)の両方を考慮した冗長計算の削除など  

•  3.  実行時に得られる情報を含めた 適化が困難  –  タプル(行)選択率を用いたコード生成など  

•  4.  DBMS内の他コーポネントを含めた 適化が困難  –  木構造やハッシュ表を含めたinline化など  

Page 13: 20150513 legobease

既存手法の 適化の制約

•  インタープリタ的に動作する一般的なDBMSやCode  Templateを用いた手法では困難な 適化の例:  –  group-­‐byで集約される値における共通部分式除去  –  冗長な実体化(materializaLon)の除去  

実体化が2回行われるが実際には  1回で処理可能  

Fig.2  本研究が対象とする制約の具体例  

Page 14: 20150513 legobease

LegoBaseの概要

•  Scalaで記述されたin-­‐memoryで動作するクエリエンジン  –  hOps://github.com/epfldata/dblab  

•  DBMSが出力したプラン木からScalaのコード片を生成, 適化後にCのコード片に変換してコンパイル  

提案手法の範囲

Fig.3 処理フロー概要  

Page 15: 20150513 legobease

LegoBaseの概要

•  内部でLMS(Lightweight  Modular  Staging)を活用  –  EPFLで開発している組み込みコンパイル向けのScalaライブラリ  –  ユーザ定義の 適化ルールの追加が用意  –  Scala→Scala変換  

•  LegoBaseにおけるLMSの活用  –  適化ルールはLMS内で表された中間表現を書き換えることで実装  –  Scalaを入力として 適化されたCのコード片を生成  

Page 16: 20150513 legobease

hOp://www.slideshare.net/maropu0804/program-­‐generaLon-­‐and-­‐embedded-­‐compilers/7  

Page 17: 20150513 legobease

LegoBaseで定義した主な 適化ルール

•  1.  Inter-­‐Operator  OpLmizaLons  –  処理フローの切り替えと,冗長な計算の除去  

•  2.  Data  Structure  SpecializaLon  –  木やハッシュ表などのデータ構造の特殊化(specializaLon)  

•  3.  Changing  Data  Layout  –  タプル集合の行(NSM*1)から列モデル(DSM*2)の書き換え  

•  4.  Other  Compiler  OpLmizaLons  –  ループ融合(loop  fusion)や自動並列化/ベクトル化  

*1  N-­‐ary  Storage  Model  *2  DecomposiLon  Storage  Model  

Page 18: 20150513 legobease

1.  Inter-Operator  OpLmizaLons

•  コンパイラがpullからpushベースの処理フローに書き換え –  DBMSは古典的にpullベース(Iterator-­‐like)な処理モデル  –  キャッシュヒット率などのCPU効率が悪いことを先行研究 [15]が指摘  

接続されている子オペレータのiteraotr経由で  次のタプルを取得  

Fig.6  処理フローの変換例  

Page 19: 20150513 legobease

1.  Inter-Operator  OpLmizaLons

•  コンパイラがpullからpushベースの処理フローに書き換え –  DBMSは古典的にpullベース(Iterator-­‐like)な処理モデル  –  キャッシュヒット率などのCPU効率が悪いことを先行研究 [15]が指摘  

子ではなく親オペレータにタプルを  push-­‐upする処理に変更  

Fig.6  処理フローの変換例  

Page 20: 20150513 legobease

1.  Inter-Operator  OpLmizaLons

•  冗長的な実体化(materializaLon)の除去  –  Scalaのパタンマッチと再起処理で 適化を記述

オペレータがHashJoinだった場合に…  

実体化が必要な集約処理をHasjJoin#openに移譲  

Fig.6  集約と結合における冗長な実体化の除去の例  

Page 21: 20150513 legobease

2.  Data  Structure  SpecializaLon

–  クエリエンジン側の実装に手を入れずに,コンパイラ側で適化された実装に書き換え •  実行時情報(ハッシュ表のサイズなど)を用いて 適化  

・・・  Fig.7  ハッシュ表の特殊化の例  

ハッシュ表の生成をしている場合に,  適化された実装(closed  hashing)に置き換え  

Page 22: 20150513 legobease

3.  Changing  Data  Layout

•  コンパイラが行から列への変換コードを生成(Fig.  8)  •  参考:  “DSM  vs  NSM-­‐CPU  Performance  Tradeoffs  in  Block-­‐Oriented  Query  

Processing”,  Damon’08  

行モデル(デフォルト)   列モデル  

青で囲まれば部分がメモリ上の  連続領域に配置  

Page 23: 20150513 legobease

評価実験

•  評価条件  –  Intel  Xeon  E5-­‐2620v2  x2  –  256GB  of  DDR3  RAM  –  Scala  v2.10.3  –  Clang  for  LLVM  v2.9  

Page 24: 20150513 legobease

性能改善の評価

•  商用DBMS(DBX)からの性能改善の相対値  

Page 25: 20150513 legobease

Why  Scala→C  ?

•  Cに変換しない場合と比べて2.5xの性能差  –  Scalaというか,主にJVMが原因  

•  性能分析から以下3つが原因(perf)  –  分岐予測ミスが1.4x  –  LLC(Last-­‐Level  Cache)ミスが1.8x  –  実行命令数が5.5x  

Page 26: 20150513 legobease

実行時 適化におけるオーバヘッド

Page 27: 20150513 legobease

生産性の評価 コーディング日数   行数