apache drill: rethinking sql for big data – don’t compromise on flexibility or performance -...
DESCRIPTION
MapR Technologies CTO の M.C. Srivas による、Apache Drill概要。SQL-on-Hadoopに求められるフレキシビリティと性能を、どのようなアーキテクチャで実現しているかを解説。2014年7月8日に開催された Hadoop Conference Japan 2014 での説明資料です。TRANSCRIPT
®© 2014 MapR Technologies
®
© 2014 MapR Technologies
2014 年 7 月 8 日
®© 2014 MapR Technologies
MapR エンタープライズ Hadoop
トップランク 500 以上の顧客 クラウドリーダー
®© 2014 MapR Technologies
Hadoop ディストリビューション
Open Source Open Source
ディストリビューション A ディストリビューション C
運用
管理
Open Source
運用
管理
アーキテクチャのイノベーション
®© 2014 MapR Technologies
MapR Distribution for Apache Hadoop
MapR Data Platform (ランダム Read/Write)
データハブ エンタープライズ グレード 業務オペレーション
MapR-FS (POSIX)
MapR-DB (ハイパフォーマンス NoSQL)
セキュリティ
YARN
Pig
Cascading
Spark
バッチ
Spark Streaming
Storm*
ストリーミング
HBase
Solr
NoSQL ・検索
Juju
プロビジョニ ング・コーディ
ネーション
Savannah*
Mahout
MLLib
機械学習 ・グラフ
GraphX
MapReduce v1 & v2
APACHE HADOOP および OSS エコシステム
実行エンジン データガバナンス・オペレーション
ワークフロー ・データ
ガバナンス Tez*
Accumulo*
Hive
Impala
Shark
Drill*
SQL
Sentry* Oozie ZooKeeper Sqoop
Knox* Whirr Falcon* Flume
データ 統合・
アクセス
HttpFS
Hue
NFS HDFS API HBase API JSON API
Map
R C
ontr
ol S
yste
m (運
用管
理・監
視)
* ディストリビューションに統合/認証予定
CLI
GUI
REST API
®© 2014 MapR Technologies
MapR Distribution for Apache Hadoop
MapR Data Platform (ランダム Read/Write)
データハブ エンタープライズ グレード 業務オペレーション
MapR-FS (POSIX)
MapR-DB (ハイパフォーマンス NoSQL)
セキュリティ
YARN
Pig
Cascading
Spark
バッチ
Spark Streaming
Storm*
ストリーミング
HBase
Solr
NoSQL ・検索
Juju
プロビジョニ ング・コーディ
ネーション
Savannah*
Mahout
MLLib
機械学習 ・グラフ
GraphX
MapReduce v1 & v2
APACHE HADOOP および OSS エコシステム
実行エンジン データガバナンス・オペレーション
ワークフロー ・データ
ガバナンス Tez*
Accumulo*
Hive
Impala
Shark
Drill*
SQL
Sentry* Oozie ZooKeeper Sqoop
Knox* Whirr Falcon* Flume
データ 統合・
アクセス
HttpFS
Hue
NFS HDFS API HBase API JSON API
Map
R C
ontr
ol S
yste
m (運
用管
理・監
視)
CLI
GUI
REST API
ApacheDrill
* ディストリビューションに統合/認証予定
®© 2014 MapR Technologies
®© 2014 MapR Technologies
Hadoop は EDW の強化版—なぜか?
®© 2014 MapR Technologies
®© 2014 MapR Technologies
®© 2014 MapR Technologies
複数のスキーマの統合は非常に困難 なぜか? 使い方があらかじめ決められている
®© 2014 MapR Technologies
縦割りが原因で分析は非常に困難
• 一意の{顧客, 取引}の組み合わせをデータセットの中からどのように特定するか?
• 一部のデータが見えない場合、異常挙動がないことをどのように保証できるのか?
®© 2014 MapR Technologies 12
何が価値になるかを事前に知ることはできない
®© 2014 MapR Technologies 13
なぜ Hadoop か?
®© 2014 MapR Technologies
ビッグデータのための SQL を再考してみる
これまで通り
• 標準 ANSI SQL • 普遍的な仕様
• よく知られている • BIや分析については切り替え不要
• 単一テクノロジー • 複数のテクノロジーを管理するのは大変
• エンタープライズ向け • システム・オブ・レコード、高可用性、災害
対策、セキュリティ、マルチテナント、…
新しく創出
• データモデルの柔軟性 • スキーマの急速な進化を許容 • 半構造化データ型をサポート
• アジリティ • 開発者とDB管理者が同一の場合、セルフサービ
スを可能に
• スケーラビリティ • スキーマ、プロセス、運用管理などあらゆる観点で
®© 2014 MapR Technologies
SQL はすっかり浸透
®© 2014 MapR Technologies
Hadoop の位置づけ
®© 2014 MapR Technologies
YOU CAN’T HANDLE REAL SQL 『ア・フュー・グッドメン(米/1992)』より
®© 2014 MapR Technologies
SQL
select * from A where exists ( select 1 from B where B.b < 100 );
• Apache HIVE は上記を処理できないことをご存知ですか?
– 例えば Hive, Impala, Spark/Shark
®© 2014 MapR Technologies
自己表現型のデータ
select cf.month, cf.year from hbase.table1;
• 通常の SQL は上記を処理できないことをご存知ですか? • HIVE や Impala, Shark のようなものでもできないですよね? • 理由はメタストア定義がないから
®© 2014 MapR Technologies
自己表現型のデータが一般的になってきている
中央管理されたスキーマ -‐ 静的 -‐ DB 管理者による管理 -‐ 中央管理のレポジトリ 入念なデータの準備のために長い時間が必要 (ETL, スキーマの作成/変更, 等) – 6〜18 ヶ月
自己表現型もしくはスキーマレスデータ -‐ 動的/更新されていく -‐ アプリケーションによる管理 -‐ データに埋め込まれる スキーマをなくすことで, 大容量・多用途・更新の速いデータにより適している
Apache Drill
®© 2014 MapR Technologies
Apache Drill クイックツアー
®© 2014 MapR Technologies
データソースはクエリの中で指定
!select timestamp, message!!from dfs1.logs.`AppServerLogs/2014/Jan/p001.parquet` !!where errorLevel > 2
Apache Drillにおけるクラスタ -‐ DFS -‐ HBase -‐ Hive メタストア
ワークスペース -‐ 主にサブディ
レクトリ -‐ HIVE データ
ベース
テーブル -‐ パス名 -‐ Hbase テーブル -‐ Hive テーブル
®© 2014 MapR Technologies
データソースを直接組み合わせる
• JSON • CSV • ORC (つまりすべてのHive型)
• Parquet • HBase テーブル • … を組み合わせ可能
Select USERS.name, USERS.emails.work from dfs.logs.`/data/logs` LOGS, dfs.users.`/profiles.json` USERS, where LOGS.uid = USERS.uid and errorLevel > 5 order by count(*);
®© 2014 MapR Technologies
ディレクトリツリー全体も処理可能 // ファイルが対象!
select errorLevel, count(*) from dfs.logs.`/AppServerLogs/2014/Jan/part0001.parquet` group by errorLevel;!!
// データコレクション全体が対象: すべての年、すべての月!
select errorLevel, count(*) from dfs.logs.`/AppServerLogs` !group by errorLevel!
where $dir0 > 2012!, $dir1!
dir0!
dir1!
®© 2014 MapR Technologies
JSON に対するクエリ { name: classic fillings: [ { name: sugar cal: 400 }]} { name: choco fillings: [ { name: sugar cal: 400 } { name: chocolate cal: 300 }]} { name: bostoncreme fillings: [ { name: sugar cal: 400 } { name: cream cal: 1000 } { name: jelly cal: 600 }]}
donuts.json
®© 2014 MapR Technologies
Drill 内部のカーソル
DrillClient drill = new DrillClient().connect( …); ResultReader r = drill.runSqlQuery( "select * from `donuts.json`"); while( r.next()) { String donutName = r.reader( “name").readString(); ListReader fillings = r.reader( "fillings"); while( fillings.next()) { int calories = fillings.reader( "cal").readInteger(); if (calories > 400) print( donutName, calories, fillings.reader( "name").readString()); } }
{ name: classic fillings: [ { name: sugar cal: 400 }]} { name: choco fillings: [ { name: sugar cal: 400 } { name: chocolate cal: 300 }]} { name: bostoncreme fillings: [ { name: sugar cal: 400 } { name: cream cal: 1000 } { name: jelly cal: 600 }]}
®© 2014 MapR Technologies
ネストデータに対する直接クエリ
// JSON, parquet, その他のネストレコードの マップのフラット化!!select name, flatten(fillings) as f! from dfs.users.`/donuts.json`! where f.cal < 300;!!// 300カロリー未満の中身をリスト!
{ name: classic fillings: [ { name: sugar cal: 400 }]} { name: choco fillings: [ { name: sugar cal: 400 } { name: chocolate cal: 300 }]} { name: bostoncreme fillings: [ { name: sugar cal: 400 } { name: cream cal: 1000 } { name: jelly cal: 600 }]}
®© 2014 MapR Technologies
SQL または Fluent API を使った複雑なデータ処理
// SQL Result r = drill.sql( "select name, flatten(fillings) from `donuts.json` where fillings.cal < 300`); // or Fluent API Result r = drill.table(“donuts.json”) .lt(“fillings.cal”, 300).all(); while( r.next()) { String name = r.get( “name").string(); List fillings = r.get( “fillings”).list(); while(fillings.next()) { print(name, calories, fillings.get(“name”).string()); } }
{ name: classic fillings: [ { name: sugar cal: 400 }]} { name: choco fillings: [ { name: sugar cal: 400 } { name: plain: 280 }]} { name: bostoncreme fillings: [ { name: sugar cal: 400 } { name: cream cal: 1000 } { name: jelly cal: 600 }]}
®© 2014 MapR Technologies
埋め込みデータに対するクエリ // hbaseテーブルdonutsの、カラムファミリcf1内の、カラムdonut-json内部に埋め込まれたJSON値!!
select d.name, count( d.fillings),!! from (!
select convert_from( cf1.donut-json, json) as d ! ! from hbase.user.`donuts` );!!
®© 2014 MapR Technologies
JSON レコード内部へのクエリ // 各JSONレコード自体をひとつのデータベースとして扱える!// 例: 少なくとも1つの中身が300カロリーを超えるすべてのドーナツを得る !
!select d.name, count( d.fillings),! max(d.fillings.cal) within record as mincal!!from ( select convert_from( cf1.donut-json,
json) as d ! ! from hbase.user.`donuts` )! where mincal > 300; !!
®© 2014 MapR Technologies
a
• クエリ処理の途中でスキーマが変わる可能性がある • スキーマ変更イベントによりオペレータの再構成ができるよ
うになっている
– 柔軟性のためのオーバーヘッドを 小化 – 実際のデータ特性に基づいてより高度な実行時 適化を行える
®© 2014 MapR Technologies
中央管理ではないメタデータ
// 顧客毎のツイート数をカウント。顧客マスタはHive、ツイートデータはHBaseに存在。hbaseデータはメタデータ情報を持たないことに注目。!!
Select!c.customerName, hb.tweets.count!from !hive.CustomersDB.`Customers` c!join hbase.user.`SocialData` hb!on !c.customerId = convert_from( hb.rowkey, UTF-8);!
®© 2014 MapR Technologies
内部のしくみ
®© 2014 MapR Technologies
基本的な処理の流れ
Zookeeper
DFS/HBase DFS/HBase DFS/HBase
Drillbit
分散キャッシュ
Drillbit
分散キャッシュ
Drillbit
分散キャッシュ
クエリ 1. クエリがいずれかの Drillbit に到着 (JDBC, ODBC, CLI, protobuf) 2. Drillbit はクエリ 適化&ローカリティに基づき実行プランを生成
3. 処理の Fragment が各ノードで実行される
4. データが 初のノードに返される
c c c
®© 2014 MapR Technologies
クエリプランニングのステージ
パーサ Logical プランナ
Physical プランナ
クエリ Foreman
プランのFragment がDrill Bit に送られる
SQL クエリ
ヒューリスティック およびコストベース
コストベース
®© 2014 MapR Technologies
クエリの実行
SQL パーサ
オプティマイザ
スケジューラ
Pig パーサ
Physical プ
ラン
Mongo
Cassandra HiveQL パーサ
RPC エンドポイント
分散キャッシュ
スト
レー
ジエ
ンジ
ンイ
ンタ
ーフ
ェー
ス
Operators オペレータ
Foreman
Logical プ
ラン
HDFS
HBase
JDBC エンドポイント ODBC エンドポイント
®© 2014 MapR Technologies
クエリエンジンの特徴は…
• カラム型/ベクトル化 • 楽観的/パイプライン化 • ランタイムコンパイル • 遅延バインディング • 拡張が容易
®© 2014 MapR Technologies
カラム表現
A B C D E
A
B
C
D
ディスク上
E
®© 2014 MapR Technologies
カラムナエンコーディング
• カラム内の値を隣り合わせで格納 – 高い圧縮効率 – レンジマップ: 小値と 大値を保管し、存
在しなければスキップ
• クエリで対象になっているカラムのみを取得
• デコードすることなく集約可能
A
B
C
D
ディスク上
E
®© 2014 MapR Technologies
ランレングスエンコーディング & 合計の計算
• データセットは次のようにエンコード <値> <繰り返しの数>: – 2, 4 (2 が 4回) – 8, 10 (8 が 10回)
• ゴール: レコードの合計を求める • 単純な処理:
– 展開: 2, 2, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 – 加算: 2 + 2 + 2 + 2 + 8 + 8 + 8 + 8 + 8 + 8 + 8 + 8 + 8 + 8
• 適化された処理: 2 * 4 + 8 * 10 – より少ないメモリ、より少ない計算
®© 2014 MapR Technologies
ビットパックディクショナリソート • データセットはディクショナリとビット位置を使ってエンコードされる:
– ディクショナリ: [Rupert, Bill, Larry] {0, 1, 2} – 値: [1,0,1,2,1,2,1,0]
• 単純な処理 – 展開して格納: Bill, Rupert, Bill, Larry, Bill, Larry, Bill, Rupert – ソート: 〜24回の可変長文字列の比較
• 適化された処理 – ディクショナリのソート: {Bill: 1, Larry: 2, Rupert: 0} – ビットパック値のソート – 処理: 大3回の文字列比較, 〜24回の固定長ディクショナリビットの比較
®© 2014 MapR Technologies
Drill の 4値セマンティクス
• SQL の 3値セマンティクス – True – False – Unknown
• Drill は第4の値を追加 – Repeated
®© 2014 MapR Technologies
値のバッチ
• Value Vector – 同じスキーマを持つ値のリスト – それぞれの値に4値セマンティクスがつく
• バッチ (Batch) 単位で送信される – Batch あたり 大 256KB – Batch あたり 大 64K 行
• 1つのリクエストに複数の応答があることを想定して RPC が設計されている
®© 2014 MapR Technologies
固定長 Value Vector
®© 2014 MapR Technologies
Null 許容値
®© 2014 MapR Technologies
反復値
®© 2014 MapR Technologies
可変長
®© 2014 MapR Technologies
反復 Map
®© 2014 MapR Technologies
ベクトル化
• Drill は複数のレコードを同時に処理する – ワードサイズの操作 – SIMD インストラクション
• GCC, LLVM, JVM はみな、さまざまな 適化を自動的に行っている – アルゴリズムのコーディングによりさらなる 適化も
• Logical ベクトル化 – ビットマップの利用による非常に高速な null チェック – CPU パイプラインを高速化するため分岐を回避
®© 2014 MapR Technologies
ランタイムコンパイラはより高速
• JIT はスマートだがランタイムコンパイルはより高速
• Janino: Java ベースの Java コンパイラ
From hsp://bit.ly/16Xk32x
®© 2014 MapR Technologies
Drill コンパイラ
ロードされた クラス
2つのクラスの バイトコードを
マージ
Janino が ランタイムバイト
コードをコンパイル
CodeModel がコードを生成
事前コンパイル されたバイトコード
テンプレート
®© 2014 MapR Technologies
楽観的
0 20 40 60 80
100 120 140 160
スピード vs. チェックポイント処理
チェックポイント不要
頻繁なチェックポイント Apache Drill
®© 2014 MapR Technologies
楽観的実行
• 復旧のコーディングは容易 – 実行中のインスタンスは失敗したクエリの中間ステートを破棄する
• パイプライン化が可能 – Batch がある程度大きくなればすぐに結果を送信 – バリアのないクエリの分解が必要
®© 2014 MapR Technologies
パイプライン化
• Record Batch はノード間でパイプライン化される – 通常は 〜256kB
• Drill の処理単位 – オペレータは Batch に対して処理する
• Batch 境界でオペレータの再構成が発生
DrillBit
DrillBit DrillBit
®© 2014 MapR Technologies
Record Batch のパイプライン化
SQL パーサ
オプティマイザ
スケジューラ
Pig パーサ
Physical プ
ラン
Mongo
Cassandra HiveQL パーサ
RPC エンドポイント
分散キャッシュ
スト
レー
ジエ
ンジ
ンイ
ンタ
ーフ
ェー
ス
Operators オペレータ
Foreman
Logical プ
ラン
HDFS
HBase
JDBC エンドポイント ODBC エンドポイント
®© 2014 MapR Technologies
ディスク
パイプライン化
• ランダムアクセス: コピーや再構成なしでソート • シリアライズ/デシリアライズを避ける • オフヒープ (メモリが大きい場合のGC問題を回避)
• Full specificauon + オフヒープ + Batch – C/C++ オペレータが有効に (早い!)
• ディスクへの Read/Write – データがメモリより大きい場合
Drill Bit
メモリに 収まらない場合 ディスクを利用
®© 2014 MapR Technologies
コストベース 適化 • 拡張が容易なフレームワーク Opuq を利用
• プラガブルなルールとコストモデル
• 分散実行プラン生成のルール • Exchange オペレータを Physical プランに挿入 • Opuq が並列クエリプランの探索を強化
• プラガブルコストモデル – CPU, IO, メモリ, ネットワークコスト (データ局所性) – ストレージエンジンの機能 (HDFS vs HIVE vs HBase)
クエリ オプティマイザ
プラガブル ルール
プラガブル コストモデル
®© 2014 MapR Technologies
分散実行プランのコスト
• オペレータは distribu5on プロパティを持つ • Hash, Broadcast, Singleton, …
• Exchange オペレータが分散を実施 • Hash: HashToRandomExchange • Broadcast: BroadcastExchange • Singleton: UnionExchange, SingleMergeExchange
• すべてを数値化しコストを計算して 適な プランを決定 • マージジョイン vs ハッシュジョイン • パーティションベースジョイン vs
ブロードキャストベースジョイン • ストリーミング集約 vs ハッシュ集約
• 集約を 1 段階で行うか 2 段階で行うか • 部分的にローカル集約 + 終的な集約
HashToRandomExchange
ソート
ストリーミングの集約
データ データ データ
®© 2014 MapR Technologies
Apache Drill
自己記述型データもしくは中央管理型メタデータを利用した分析
SQL/BI ツールおよび
Apache Hive への投資を再利用
半構造化データ・ ネストデータの分析
… 1 から作り上げたアーキテクチャにより、 低レイテンシクエリのスケーラブルな処理を実現
フレキシブルな スキーマ管理
ネストデータに対する 効率の良い分析
既存資産との プラグアンドプレイ
®© 2014 MapR Technologies
Apache Drill ロードマップ
• 低レイテンシ SQL • スキーマレスデータの処理 • ファイル & HBase/M7サポート • Hive 連携 • ODBC/JDBC を経由した BI および SQL ツールサポート
データ検索/アドホッククエリ
1.0
• HBase クエリ性能向上 • ネストデータ機能 • 高度な SQL 機能
高度な分析および オペレーショナルデータ
1.1 • さらなる低レイテンシクエリ • 単一行 insert/update/delete
• ワークロード管理
オペレーショナル SQL
2.0
®© 2014 MapR Technologies
Drill 1.0 Hive 0.13 + Tez Impala 1.x Shark 1.0
レイテンシ Low Medium Low Medium
ファイル Yes (すべての Hive ファイル形式に加え JSON, Text, …)
Yes (すべての Hive ファイル形式)
Yes (Parquet, Sequence, …)
Yes (すべての Hive ファイル形式)
HBase/M7 Yes Yes, 性能の問題 Yes, 一部に問題 Yes, 性能の問題
スキーマ Hive or スキーマレス Hive Hive Hive
SQL サポート ANSI SQL 2003 HiveQL HiveQL (サブセット) HiveQL
クライアントサポート
ODBC/JDBC ODBC/JDBC ODBC/JDBC ODBC/JDBC
Hive 互換性 High High Low High
大きなデータセット Yes Yes Limited Limited
ネストデータ Yes Limited No Limited
同時実行 High Limited Medium Limited
インタラクティブ SQL-on-Hadoop の選択肢
®© 2014 MapR Technologies
バイアスのないオープンソース (Linux を例に) • オープンソースディストリビューションは選択肢の提供が鍵
– Linux は MySQL, PostgreSQL, SQLite のすべてを含む – Linux は Apache hspd, nginx, Lighspd のすべてを含む
• MapR はバイアスのない選択肢を提供する唯一の Hadoop
MapR DistribuYon for Hadoop ディストリビューションA ディストリビューションB
Spark Spark および Shark
Spark のみ なし
インタラクティブ SQL
Shark, Impala, Drill, Hive/Tez 単一の選択肢 (Impala)
単一の選択肢 (Hive/Tez)
バージョン Hive 0.10, 0.11, 0.12 Pig 0.11, 012 HBase 0.94, 0.98
単一のバージョン 単一のバージョン
®© 2014 MapR Technologies
MapR Distribution for Apache Hadoop
MapR Data Platform (ランダム Read/Write)
データハブ エンタープライズ グレード 業務オペレーション
MapR-FS (POSIX)
MapR-DB (ハイパフォーマンス NoSQL)
セキュリティ
YARN
Pig
Cascading
Spark
バッチ
Spark Streaming
Storm*
ストリーミング
HBase
Solr
NoSQL ・検索
Juju
プロビジョニ ング・コーディ
ネーション
Savannah*
Mahout
MLLib
機械学習 ・グラフ
GraphX
MapReduce v1 & v2
APACHE HADOOP および OSS エコシステム
実行エンジン データガバナンス・オペレーション
ワークフロー ・データ
ガバナンス Tez*
Accumulo*
Hive
Impala
Shark
Drill*
SQL
Sentry* Oozie ZooKeeper Sqoop
Knox* Whirr Falcon* Flume
データ 統合・
アクセス
HttpFS
Hue
NFS HDFS API HBase API JSON API
Map
R C
ontr
ol S
yste
m (運
用管
理・監
視)
CLI
GUI
REST API
* ディストリビューションに統合/認証予定
®© 2014 MapR Technologies
MapR の Drill 開発チーム
• ワールドクラスの SQL チーム、〜20 名 • 商用データベース開発の経験、のべ 150 年以上
• Oracle, DB2, ParAccel, Teradata, SQLServer, Veruca • Apache Hive におけるいくつかの困難な問題を解決
®© 2014 MapR Technologies
アクティブな Drill コミュニティ
• 大きなコミュニティ、急速に拡大中 – コントリビュータ 35〜40名、コミッタ 16名 – Microsoz, Linked-‐in, Oracle, Facebook, Visa, Lucidworks, Concurrent, 多数の大学
• 2014 年の活動 – 20 回を超える Meet-‐Up、さらに多数を予定 – Hackathon 2回、40 を超える参加者
• 皆さんの参加、学習、貢献をお待ちしています (Have fun!)
®© 2014 MapR Technologies
Apache Drill リソース
• Drill を始めるのはかんたん – tarball をダウンロードして、ローカルファイルに対し SQL クエリを
投げるだけ
• メーリングリスト – drill-‐[email protected] – drill-‐[email protected]
• ドキュメント: hsps://cwiki.apache.org/confluence/display/DRILL/Apache+Drill+Wiki • GitHub でフォーク: hsp://github.com/apache/incubator-‐drill/ • JIRA の作成: hsps://issues.apache.org/jira/browse/DRILL