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,191