Apache Drill
に触ってみる
Apache Drill とは
クエリエンジン
- 複数のファイル/データソースに対してクエリ
- スキーマフリー
- ANSI SQL準拠
- 異なるデータソース間でJOIN/SORT/GROUP
- 分散システム
データソース
- HBase
- MongoDB
- MapR-DB
- HDFS
- Amazon S3
- NAS
- local files
- RDBMS(JDBC)
etc...
フォーマット
- JSON
- Avro
- CSV (Comma-Separated-Values)
- TSV (Tab-Separated-Values)
- PSV (Pipe-Separated-Values)
- Parquet
- Hadoop Sequence Files
インターフェース
- JDBC
- ODBC
- REST
- web console
アーキテクチャ
基本的にオンメモリで処理
- io.netty.buffer.ByteBuf
- java.nio.ByteBuffer
=> ダイレクトメモリ JavaHeap外に確保される
データが載り切らない場合には
一部のデータをディスク上に一時的に退避
DEMO
使い勝手とか
CREATE VIEW view_name AS (SELECT ...);
SELECT ... FROM view_name WHERE xxx ORDER BY yyy;
CREATE VIEW
実体はSQLが書かれたファイル
細かい使い勝手とか
CREATE TABLE table_name AS (SELECT ...);
SELECT ... FROM table_name WHERE xxx ORDER BY yyy;
CREATE TABLE
実体はファイル
デフォルトで, parquetという
列指向データフォーマットで保存
プラグイン作ってみた
https://github.com/yohei224/drill-http-json
HTTP URL をデータソースとして jsonデータを取得
DEMO
実装してみて
FileSystem
全取得後、Drillがfilter, sort, group
=> 今回のはこちら。解析結果をDrillに渡すだけ
JDBC / mongo etc
pushdownと呼ばれる最適化
Drillが受取ったクエリを変換し外部DBへ投げる
=> 省メモリ, 高速化
Storage / Format Plugin
ここがイマイチ
- 結局、対象のJSONの構造知ってないとダメ
- 直感的でないクエリ解釈
- ドキュメントが英語のみ
- プラグイン開発は未ドキュメント化
/* jdbc */
SELECT * FROM mysql.{db_name}.{table_name};
/* local */
SELECT 1 FROM (VALUES(1));
/*
{ "user": { "name": "yohei.yamana", "mail": "xxxxx@xxxx.com" } }
*/
SELECT t.`user`.name AS name, t.`user`.mail AS mail
FROM dfs.`/tmp/users.json` t
WHERE T.`user`.name = 'yamana'
ご清聴有難うございました!
ApacheDrill
By yohei yamana
ApacheDrill
- 1,190