impala 2.0 update 日本語版 #impalajp
DESCRIPTION
2014/10/31に Tokyo Impara Meetup で実施した嶋内の発表の日本語資料です http://connpass.com/event/9031/TRANSCRIPT
1
Impala 2.0 Update嶋内翔, Cloudera
2014/10/31
2
トピック
• Cloudera Impalaとは?
• Impala 1.4 / 2.0 の update
• パフォーマンスの改善
• クエリ言語
• リソース管理とセキュリティ
• その他
3
自己紹介
• Pre-sales Solutions Architect
• 2011年にCloudera入社 , 日本における最初の社員
• email: [email protected]
• twitter: @shiumachi
4
Cloudera Impala
5
Impalaとは?
• Hadoop環境でのMPP SQL query engine
• ハードウェアの性能を最大限に引き出すためネイティブコードで提供されている
• open-source!• http://impala.io/
• Cloudera, Amazon, MapRからのサポート提供
• 略史• 2012/10 Public Beta released
• 2013/04 Impala 1.0 released
• current version: Impala 2.0
6
Impalaを使うのは簡単
• HDFS / HBaseに格納されたデータを仮想的なビューとして表を作成• Metastoreにスキーマ情報を格納
• shared with Hive, Pig, etc.
• ODBC / JDBCを通じてアクセス
• 認証には Kerberos / LDAPを使用可
• 標準的な SQL• ANSI SQL-92 based
• 限定的な SELECT と bulk INSERT
• no correlated subqueries available in 2.0
• UDF / UDAF
7
Impala 1.4 (2014/07)
• DECIMAL(<precision>, <scale>)• HDFS caching DDL• Sentry-based authorization (GRANT / REVOKE)• Parquet file を元にした列定義(CREATE TABLE … LIKE PARQUET)• LIMIT句を指定しないORDER BY• TLS上でのLDAP• SHOW PARTITIONS• 本番利用可能な統合リソースマネージャであるYARN • Llama HA のサポート• CREATE TABLE … STORED AS AVRO• SUMMARY• COMPUTE STATSの高速化• partition pruningのパフォーマンス改善• impala shell での UTF-8 のサポート• EDW systems からの追加の built-ins
8
Impala 2.0 (2014/10)
• Hash Tableを diskへ書き出し可能に• join and aggregate tables の制限が不要に
• サブクエリの機能追加• WHERE句でのクエリ• EXISTS / NOT EXISTS• IN / NOT IN のサブクエリの結果への適用• correlated / uncorrelated サブクエリ• Scalar サブクエリ
• SQL 2003 準拠の解析ウィンドウ関数• LEAD(), LAG(), RANK(), FIRST_VALUE(), etc.
• 新しいデータ型: VARCHAR, CHAR• セキュリティへの機能追加
• 複数の認証方式• GRANT / REVOKE / CREATE ROLE / DROP ROLE / SHOW ROLES / etc.
• text + gzip / bzip2 / Snappy• Hints• QUERY_TIMEOUT_S• DATE_PART() / EXTRACT()• Parquet の default block size が 256MB に変更(変更前: 1GB)• LEFT ANTI JOIN / RIGHT ANTI JOIN• impala-shellの設定ファイルとして $HOME/.impalarcを使用可能に
9
パフォーマンスの改善
10
HDFS caching
• HDFS ファイルがメモリ上にキャッシュされた場合にImpalaはディスクアクセスなしにアクセス可能になり別のメモリ上のコピーを作成必要もない
• チェックサムの確認とデータコピーが不要
• この新しい HDFS API は CDH 5.0から使用可能
• Impala DDLでキャッシュを構成する方法
• CREATE TABLE tbl_name CACHED IN ‘<pool>’
• ALTER TABLE tbl_name ADD PARTITION … CACHED IN ‘<pool>’
11
Partition Pruning の改善
• 以前の Impala が検索していたのはおよそ3000パーティション程度。Partition Pruningの改善で万単位のパーティションの処理を快適に処理できるように
12
SQL 処理のディスクへの書き出し
• メモリに収まらない一時データの書き出し
• BlockMgr.BytesWrittenプロファイルでクエリ中にディスクに書き出されたデータの統計を確認可能
• 新しいクエリのオプションの QUERY_TIMEOUT_S で各クエリのタイムアウトを設定可能
13
クエリ言語
14
サブクエリ
スカラサブクエリ:結果が単一セルの値になる
SELECT x FROM t1 WHERE x > (SELECT MAX(y) FROM t2);
非相関サブクエリ: サブクエリの外側で参照されている表を参照しない
SELECT x FROM t1 WHERE x IN (SELECT y FROM t2);
相関サブクエリ: サブクエリの外側の表の値を参照する
SELECT employee_name, employee_id FROM employees one WHERE
salary > (SELECT avg(salary) FROM employees two WHERE
one.dept_id = two.dept_id);
15
分析関数(またはウィンドウ関数)
• 2.0 以降でのサポート
• サポートされる関数
• RANK() / DENSE_RANK()
• FIRST_VALUE() / LAST_VALUE()
• LAG() / LEAD()
• ROW_NUMBER()
16
分析関数の例
select stock_symbol, closing_date, closing_price,
lag(closing_price,1) over (partition by stock_symbol order by closing_date) as "yesterday closing"
from stock_ticker
order by closing_date;
+--------------+---------------------+---------------+-------------------+
| stock_symbol | closing_date | closing_price | yesterday closing |
+--------------+---------------------+---------------+-------------------+
| JDR | 2014-09-13 00:00:00 | 12.86 | NULL |
| JDR | 2014-09-14 00:00:00 | 12.89 | 12.86 |
| JDR | 2014-09-15 00:00:00 | 12.94 | 12.89 |
| JDR | 2014-09-16 00:00:00 | 12.55 | 12.94 |
| JDR | 2014-09-17 00:00:00 | 14.03 | 12.55 |
| JDR | 2014-09-18 00:00:00 | 14.75 | 14.03 |
| JDR | 2014-09-19 00:00:00 | 13.98 | 14.75 |
+--------------+---------------------+---------------+-------------------+
日毎に終値と前日の終値を出力
17
概算の仕組み
• APPX_COUNT_DISTINCT クエリオプション
• COUNT(DISTINCT) を NDV()に書き変える
• 処理の高速化
• COUNT(DISTINCT) が単一クエリ内に複数回あっても可
• APPX_MEDIAN()
• 入力に対するおよその中央値を返す
18
概算関数の例
[localhost:21000] > select min(x), max(x), avg(x) from
million_numbers;
+-------------------+-------------------+-------------------+
| min(x) | max(x) | avg(x) |
+-------------------+-------------------+-------------------+
| 4.725693727250069 | 49994.56852674231 | 24945.38563793553 |
+-------------------+-------------------+-------------------+
[localhost:21000] > select appx_median(x) from million_numbers;
+----------------+
| appx_median(x) |
+----------------+
| 24721.6 |
+----------------+
19
CREATE TABLE … LIKE PARQUET
• CREATE TABLE ... LIKE PARQUET 'hdfs_path_of_parquet_file'
• 列名とデータ形式はPARQUETファイルを元に設定される
20
LIMIT句無しのORDER BY
• ORDER BY句でのLIMITの設定はオプションに
• Impala はデータノードのメモリを超過しそうな際には自動的に一時データをDiskに書き込む
21
DECODE()
SELECT event, DECODE(day_of_week, 1, "Monday", 2, "Tuesday", 3,
"Wednesday”, 4, "Thursday", 5, "Friday", 6, "Saturday", 7,
"Sunday", "Unknown day")
FROM calendar;
22
ANTI JOIN
LEFT ANTI JOIN / RIGHT ANTI JOIN が Impala 2.0からサポート
[localhost:21000] > create table t1 (x int);
[localhost:21000] > insert into t1 values (1), (2), (3), (4), (5), (6);
[localhost:21000] > create table t2 (y int);
[localhost:21000] > insert into t2 values (2), (4), (6);
[localhost:21000] > select x from t1 left anti join t2 on (t1.x = t2.y);
+---+
| x |
+---+
| 1 |
| 3 |
| 5 |
+---+
23
新しいデータ型
• DECIMAL (Impala 1.4-)
• column_name DECIMAL[(precision[,scale])]
• precision と scale を指定しない場合はDECIMAL(9,0)と同等
• VARCHAR (Impala 2.0-)
• 長さ上限のあるSTRING
• CHAR (Impala 2.0-)
• 長さが指定されたSTRING
24
新しい built-in 関数
• EXTRACT() : TIMESTAMP から単一の日付もしくは時刻を返す
• TRUNC() : date/time をyear, monthなどに切り詰め• ADD_MONTHS(): MONTHS_ADD()のエイリアス• ROUND(): DECIMAL のまるめた値• 統計的分散を計算するための関数
• STDDEV()• STDDEV_SAMP() / STDDEV_POP()• VARIANCE()• VARIANCE_SAMP() / VARIANCE_POP()
• MAX_INT() / MIN_SMALLINT()• IS_INF() / IS_NAN()
25
SHOW PARTITIONS
[localhost:21000] > show partitions census;
+-------+-------+--------+------+---------+
| year | #Rows | #Files | Size | Format |
+-------+-------+--------+------+---------+
| 2000 | -1 | 0 | 0B | TEXT |
| 2004 | -1 | 0 | 0B | TEXT |
| 2008 | -1 | 0 | 0B | TEXT |
| 2010 | -1 | 0 | 0B | TEXT |
| 2011 | 4 | 1 | 22B | TEXT |
| 2012 | 4 | 1 | 22B | TEXT |
| 2013 | 1 | 1 | 231B | PARQUET |
| Total | 9 | 3 | 275B | |
+-------+-------+--------+------+---------+
26
SUMMARY
• impala-shell のコマンド
• クエリ実行時のフェーズごとの統計を把握するための簡易な要約
[localhost:21000] > select avg(ss_sales_price) from store_sales where ss_coupon_amt = 0;
+---------------------+
| avg(ss_sales_price) |
+---------------------+
| 37.80770926328327 |
+---------------------+
[localhost:21000] > summary;
+--------------+--------+----------+----------+-------+------------+----------+---------------+-----------------+
| Operator | #Hosts | Avg Time | Max Time | #Rows | Est. #Rows | Peak Mem | Est. Peak Mem | Detail |
+--------------+--------+----------+----------+-------+------------+----------+---------------+-----------------+
| 03:AGGREGATE | 1 | 1.03ms | 1.03ms | 1 | 1 | 48.00 KB | -1 B | MERGE FINALIZE |
| 02:EXCHANGE | 1 | 0ns | 0ns | 1 | 1 | 0 B | -1 B | UNPARTITIONED |
| 01:AGGREGATE | 1 | 30.79ms | 30.79ms | 1 | 1 | 80.00 KB | 10.00 MB | |
| 00:SCAN HDFS | 1 | 5.45s | 5.45s | 2.21M | -1 | 64.05 MB | 432.00 MB | tpc.store_sales |
+--------------+--------+----------+----------+-------+------------+----------+---------------+-----------------+
27
SET 文
• Impala 2.0以前では SET はimpala-shell内でのみ使用可能
• Impala 2.0 ではSETを JDBC / ODBC APIを通してクライアントアプリケーションから実行可能
28
リソース管理とセキュリティ
29
YARN と Llama
• Llama: 低レイテンシの Application Master
• 粒度の大きなYARNのスケジュールを低レイテンシで短期間のクエリに細分化
• Llama は単一の長期間のApplication MasterをYARN pool に登録
• Llama は YARNに割り当てられたリソースをImparaのクエリ用に高速に再割り当てしながら使用する
• YARNよりさらに高速
• Impala 1.4から Llama HA をサポート
30
セキュリティ
• Impala 2.0 は複数の認証形式を使用可能
• ex) host A は Kerberos host B は LDAPで認証といった混在
• セキュリティ関連の文
• GRANT
• REVOKE
• CREATE ROLE
• DROP ROLE
• SHOW ROLES
• SHOW ROLE GRANT
• --disk_spill_engryption option
31
その他
32
Text + gzip, bzip2, and Snappy
• Impala 2.0 以降ではgzip, bzip2, Snappy といった形式で圧縮されたテキストデータをサポート
• デリミタ、エスケープシーケンスといった行のフォーマットを指定しての表作成
CREATE TABLE csv_compressed (a STRING, b STRING, c STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";
33
impala-shell
• UTF-8 サポート (1.4)
• .impalarc file (2.0)
[impala]
verbose=true
default_db=tpc_benchmarking
write_delimited=true
output_delimiter=,
output_file=/home/tester1/benchmark_results.csv
show_profiles=true
34
Documentation
• Impalaを使用する Cluster のサイジングGuidelines
• http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/impala_cluster_sizing.html
35