evolution of impala #hcj2014
DESCRIPTION
Hadoop Conference Japan 2014 で発表した、Impala の資料です。TRANSCRIPT
1
Evolu(on of Impala Sho Shimauchi, Cloudera 2014/07/08
2
今日のトピック
• Cloudera Impala とは? • クエリ言語とユーザビリティ
• メタデータ管理 • UDF
• リソース管理 • アドミッションコントロール • YARN と Llama (ラマ)
• セキュリティ (Apache Sentry) • パフォーマンスと最適化
• HDFS • Parquet
• ロードマップ
3
Who am I?
• 嶋内 翔(しまうち しょう) • プロアクティブサポートエンジニア • 2011年4月にClouderaの最初の日本人社員として入社
• email: [email protected] • twiUer: @shiumachi
4
Cloudera Impala
5
Cloudera Impala とは?
• Hadoop クラスタのための MPP SQL クエリエンジン • ハードウェア性能を最大に引き出すためネイティブコードで記述
• オープンソース • hUp://impala.io/
• Cloudera / MapR / Amazon がサポートを提供 • 歴史
• 2012/10 パブリックベータリリース • 2013/04 Impala 1.0 リリース • 現在のバージョンは Impala 1.3.1
6
Impala は使うのが簡単
• HDFS や HBase 上のデータに対し、仮想的なビューとしてテーブルを作成することができる • スキーマは Hive メタストアに保存
• ODBC / JDBC で接続可能 • Kerberos / LDAP で認証可能 • 標準SQLを実行可能
• ANSI SQL-‐92 ベース • SELECT とバルクインサートに限定 • 相関サブクエリは未実装 (Impala 2.0 で実装予定) • UDF / UDAF に対応
7
Impala のアーキテクチャ
• 分散サービス • コンポーネント
• impalad • statestore • catalogd
• インタフェース • impala-‐shell • ODBC / JDBC
8
impalad
• データのあるノード全てで動作する • どの impalad でもユーザからのクエリを受け付けることが可能 • クエリを受け付ける impalad は、通常「コーディネータノー
ド」と呼ばれる
• コーディネータノードは、リモートの impalad 上での計算処理を開始する
9
statestore
• ステートリポジトリ • ネームサービス • クラスタ毎に1ノード
• ソフトステート • 起動時に全ての impalad はstatestoreに登録する • impalad への接続が切れたとき、statestore はその情報を
他の impalad へ周知する • Impala サービスは statestore がなくても動作継続する
10
catalogd (Impala 1.2)
• Impala SQL からクラスタ内の全ノードにメタデータの変更をリレーする
• クラスタ毎に1ノード • 詳細は後述
11
Impala のアーキテクチャ
HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase
ODBC / JDBC
SQL App
クライアント・インタフェース メタデータ
Hive Metastore HDFS NN State
Store Catalogd
12
Impala のアーキテクチャ
HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase
ODBC / JDBC
SQL App
メタデータ
Hive Metastore HDFS NN State
Store Catalogd
SQL リクエスト プランナーはプランフラグメン
トの集合に変換する
クライアント・インタフェース
13
Impala のアーキテクチャ
HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase
ODBC / JDBC
SQL App
メタデータ
Hive Metastore HDFS NN State
Store Catalogd
コーディネータはリモートのimpalad上での計算処理を開始する
クライアント・インタフェース
14
Impala のアーキテクチャ
HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase
ODBC / JDBC
SQL App
メタデータ
Hive Metastore HDFS NN State
Store Catalogd
HDFS ショートサーキットリードを使って ローカルダイレクトスキャン、その後計算処理を実行 (集約やハッシュJOINなど)
クライアント・インタフェース
15
Impala のアーキテクチャ
HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase
ODBC / JDBC
SQL App
メタデータ
Hive Metastore HDFS NN State
Store Catalogd
もしクエリが複雑なら、impaladは計算結果を互いに交換し、他の計算処理を実行 中間結果はストリームで転送される
クライアント・インタフェース
16
Impala のアーキテクチャ
HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase HDFS DN
Query Exec Engine
Query Coordinator
Query Planner
HBase
ODBC / JDBC
SQL App
HiveQLとインタフェース メタデータ
Hive Metastore HDFS NN State
Store Catalogd
コーディネータは最後の計算を実行し、クライアントに結果を返す
17
クエリ計画
• 2フェーズプロセス • シングルノードプラン
• クエリ演算子の lee deep tree
• 分散並列処理のためにプランフラグメントに分割する • スキャンローカリティを最大化する • データの移動を最小化する
18
クエリ計画
FRAGMENT 2
HDFS SCAN
HASH JOIN
AGGREGATION
FRAGMENT 1
EXCHANGE
AGGREGATION
COORDINATOR FRAGMENT
TOP-‐N
EXCHANGE
AGGREGATION
19
クエリ実行
• インメモリでの実行 • JOINの右側の入力をメモリにキャッシュし、結果を集約し
ていく • 例: 1TB のテーブルを JOIN する。200列のうち2列を参照し、
行の10%を用いる • 1024 * (2 / 200) * 0.1 = 1GB を、全てのノード上のメモリにキャッ
シュする必要がある
• データはストリームで送信される • ディスクに書き出されることはない
20
クエリ実行: ランタイムコード生成
• LLVMを使って、クエリのランタイム依存の部分をJITコンパイルする
• クエリのカスタムコーディングと同じ効果がある • 分岐の削除 • 定数、オフセット、ポインタなどのプロパゲート • インライン関数呼び出し
• 最近のCPUのための実行最適化(命令パイプライン)
21
What’s new?
HCJ 2013 (2013/01/21)
HCJ 2014 (2014/07/08)
Impala 0.4 (Beta)
DDL (CREATE, ALTER, etc.) No
JOIN 最適化 No
分散 JOIN No
UDF No
JDBC ドライバ No
カラムナファイル フォーマット RCFile
22
What’s new?
HCJ 2013 (2013/01/21)
HCJ 2014 (2014/07/08)
Impala 0.4 (Beta) 1.3.1
DDL (CREATE, ALTER, etc.) No Yes
JOIN 最適化 No Yes (コストベース)
分散 JOIN No Yes
UDF No Yes (UDF / UDAF)
JDBC ドライバ No Yes
カラムナファイル フォーマット RCFile RCFile, Parquet
23
クエリ言語とユーザビリティ
24
メタデータ管理
• catalogd (Impala 1.2) • Impala SQL からクラスタ内の全ノードにメタデータの変更をリ
レーする • クラスタ毎に1ノード
• DDL(CREATE や DROP TABLEなど)の後に、 REFRESH や INVALIDATE METADATA を実行する必要がなくなった
• HiveでDDLを実行した場合は引き続き実行が必要 • INVALIDATE METADATA new_table_name (Impala 1.2.4)
• INVALIDATE METADATA はコスト高の処理 • このクエリにより指定したテーブルだけに実行することが可能
25
UDF (ユーザ定義関数)
• Impala 1.1 / 1.2 からの新機能 • UDF と UDAF をサポート • 以下のUDFを作成可能
• C++ でネイティブコードを書く • Java で書かれた Hive UDF をポートする
• Python UDF も開発中! • hUps://github.com/cloudera/impyla
IntVal AddUdf (UdfContext* context, const IntVal& arg1, const IntVal& arg2) { if (arg1.is_null || arg2.is_null) { return IntVal::null(); } return IntVal(arg1.val + arg2.val)
}
26
HBase 連携
• Impala は HBase のテーブルに対し SELECT や INSERT を実行可能 • ユースケース
• 巨大なファクトテーブルをImpalaに持ち、より小さいディメンジョンテーブルをHBase で持つ
• 高速にインクリメントされるカウンタをHBaseに保存する • 例: WebサイトのPVや、SNS の投稿での投票の数など
• 非常に幅広い(そして通常は疎な)テーブルをHBaseで持つ • 例: オンラインサービスのユーザ情報
• 1行インサートも可能 • INSERT … VALUES
Impala HBase external systems
put SELECT * FROM hbase_tbl …
INSERT / INSERT … VALUES get, scan
27
リソース管理
28
アドミッションコントロール (Impala 1.3)
• 高速・軽量なリソース管理機構 • 並列ワークロードに対するリソースの過剰利用を避ける • 設定した限界値を超えたらクエリはキューイングされる
• 全 impalad で動作 • SPOF なし
29
アドミッションコントロール (Impala 1.3)
• 設定可能なリソースプール • クエリの最大並列実行数 • キューの最大長 • プールのメモリ総量
• 設定方法は2通り • Cloudera Manager の「動的リソースプール」 • fair-‐scheduler.xml と llama-‐site.xml を手動編集する
30
アドミッションコントロールの例
並列実行可能な クエリ数
クエリキューの 最大長
100 10
10 1
最大メモリ
1000 GB
100 GB
Group A
Group B
31
アドミッションコントロール (Impala 1.3)
• 制限は「ソフトリミット」 • 実行可能クエリ数の最大値を少しだけオーバーすること
がある • クエリを statestore のハートビート間隔(500ms)より速い間
隔で送信していると発生する可能性がある
32
YARN と Llama (ラマ)
• Llama: Low Latency Applica(on MAster • 低レイテンシ・短寿命のクエリで用いるために、粒度の粗いYARNのスケジューリングをよりきめ細かくする
• YARNプールごとに長寿命のAMを登録する • YARNから割り当てられたリソースを短時間キャッシュする • Impala クエリに高速に再割り当てする • YARN を待つよりもはるかに高速
• Impala 1.3 ではベータ版 • Produc(on Ready in Impala 1.4
33
セキュリティ
34 34
Apache Sentry
• Apache Incubatorプロジェクト • オープンソースで開発 • Oracle社やCloudera社が主導
• データベース、テーブル、ビュー、列/行 の粒度でアクセス制御
• HiveやImpalaなど幅広いHadoop エコシステムで利用可能
35
パフォーマンスと最適化
36
HDFS ショートサーキットリード
• ローカルディスクから読み込むときにデータノードのプロトコルをバイパスする
• ディスクあたり 100+ MB / s の読み込み性能を出せる
Impalad
DataNode OS
37
HDFS キャッシング
• メモリ常駐データへのゼロオーバヘッドアクセス • チェックサム計算とデータコピーを回避する • 新しい HDFS API が CDH5.0 で導入された • Impala DDL でキャッシュ指定することが可能 (Impala 1.4) • CREATE TABLE tbl_name CACHED IN ‘<pool>’ • ALTER TABLE tbl_name ADD PARTITION … CACHED IN ‘<pool>’
38
Parquet
• Hadoop 用カラムナストレージ • 多くの Hadoop エコシステムがサポートしている
• Impala, Hive, Pig, MapReduce, Cascading
• 高圧縮かつ高スキャン効率 • TwiUer と Cloudera の共同開発 • 2014年5月にApache インキュベータプロジェクトになった • hUp://incubator.apache.org/projects/parquet.html • 現在のプロジェクトページ: hUp://parquet.io/
39
Parquet のアーキテクチャ
a b c
a1 b1 c1
a2 b2 c2
a3 b3 c3
a4 b4 c4
a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4
Row Group
column chunk column chunk column chunk
40
Parquet: ストレージ効率
41
Parquet: スキャン効率
42
COMPUTE STATS (Impala 1.2.2)
• テーブルや列の統計情報を収集し、メタストアに保存する
• ETL処理の終わりには必ず COMPUTE STATS を実行しましょう • コストベースのJOIN順序の最適化 • JOINクエリの性能改善とメモリ使用量削減 • ParquetテーブルへのINSERTの性能改善とメモリ使用量削
減
• Impala 1.4 では COMPUTE STATS 自体が高速化
43
Impala ベンチマーク
• TPC-‐DS を使ったベンチマーク • 21種類のクエリ • 15TB スケールファクタ―データセット • 21ノードクラスタ
• Impala で TPC-‐DS を試したい人は以下のツールを使うと楽 • hUps://github.com/cloudera/impala-‐tpcds-‐kit
44
Impala ベンチマーク
Hardware
# of nodes 21
CPU Intel Xeon CPU E5-‐2630L 0 at 2.00GHz 2 processors 12 cores
disk 12 disks 932GB each OS: 1 disk HDFS: 11 disks
memory 348GB
So>ware
Impala 1.3
Hive-‐on-‐Tez 13.0
Shark (RDD) 0.9.2
Shark (HDFS) 0.9.2
Presto 0.60
45
Impala ベンチマーク: シングルユーザ
• クエリをグループ分けして幾何平均をとった • インタラクティブ
• レポート
• 高度な分析
• Impala は次点のSharkに比べて約5倍高速
46
Impala ベンチマーク: シングルユーザ
• クエリをグループ分けして幾何平均をとった • インタラクティブ
• レポート
• 高度な分析
• Impala は次点のSharkに比べて約5倍高速
17 34 62 49
193 327
Shark / ORC (HDFS)
Impala
47
Impala ベンチマーク: マルチユーザ
• 10並列のクエリ
• 「インタラクティブ」クエリ
• 10ユーザでの並列クエリだとImpalaはPrestoより19.1倍高速
48
Impala ベンチマーク: マルチユーザ
• 10並列のクエリ
• 「インタラクティブ」クエリ
• 10ユーザでの並列クエリだとImpalaはPrestoより19.1倍高速
Impala 1クエリ: 15 10並列: 29
Presto 1クエリ: 64 10並列: 555
49
Impala ベンチマーク: マルチユーザ
50
Impala ベンチマーク: マルチユーザ
x21.6 beCer than Presto
Impala: 863
Presto: 40
51
Impala ベンチマーク: マルチユーザ
52
Impala ベンチマーク: マルチユーザ
Impala 81秒
Presto 1858秒
53
Impala ベンチマーク: vs. DBMS-‐Y
54
Hadoopにおけるスケーラビリティ
• Hadoopにはリニアスケーラビリティがある • クラスタにノードを追加すれば、それに比例して性能が向上する • 性能増はあらゆるワークロードに適用される
• EDWワークロードにおける評価指標 • レスポンスタイム • 並列性とクエリスループット • データサイズ
55
Hadoopにおけるスケーラビリティ
• Impalaのスケーラビリティ評価結果 • クラスタ: 18 ノードと 36 ノード • データセット: 15TB と 30TB の TPC-‐DS データセット • クエリ: 6種類の「インタラクティブ」TPC-‐DSクエリ • 並列性: 10 クエリと 20 クエリ (並列性以外のテストでは 1
クエリ)
56
Impala のスケーラビリティ: レスポンスタイム
57
Impala のスケーラビリティ: 並列性 (10 vs. 20 ユーザ)
58
Impala のスケーラビリティ: データサイズ (15TB vs. 30TB データセット)
59
ロードマップ
60
ロードマップ
• Impala 1.4 (2014年夏) • HDFS キャッシング DDL • COMPUTE STATS の高速化 • LIMIT なしの ORDER BY • DECIMAL(<precision>, <scale>) • ブロードキャストJOIN用のブルームフィルタ • Llama が produc(on ready になる • EDW システム用の追加のビルトイン • そして……さらに高速化!
61
ロードマップ
• Impala 2.0 (2014年下半期) • SQL 2003 準拠の分析ウィンドウ関数
• LEAD(), LAG(), etc.
• 相関サブクエリ • ハッシュテーブルをディスクに書き出せるようになる
• 任意のサイズのテーブルをJOIN、集約することが可能に
• Nested data type • map, struct, and array
62
まとめ
63
Cloudera Impala
• Hadoop クラスタのためのオープンソースの高速SQLエンジン
• 他の類似ソフトに比べて圧倒的に高速 • リソース管理、セキュリティなど機能も豊富
Hadoop上の分析SQLエンジンは Cloudera Impala を使いましょう
hUp://impala.io/
64
Cloudera Impala の⽇日本語フリーブック
• オライリーの「インパラ本」、日本語PDF版が無償公開されました!
• http://www.oreilly.co.jp/books/9784873116723/• Cloudera の John Russell 著• Hadoop、HBase、Hadoopオペレーション、
プログラミングHiveなどを翻訳された玉川竜司さんが翻訳!
「これまでClouderaの皆さんにご尽力いただいた翻訳レビューへの感謝の気持ちとして、Cloudera World Tokyo開催のお祝いに翻訳寄贈します!」
65