Apache Drillですが、簡単にインストールして使うことできます。
こちらに書かれているようにダウンロードして解凍するだけです。
Installing Drill on Linux and Mac OS X - Apache Drill
ただDocker使える環境あればもっと簡単に試すことできます。
公式コンテナ
Docker Hubで公式コンテナ探したのですが、地味ながらこちらが公式のようです。
マニュアルに書かれているので。
Running Drill on Docker - Apache Drill
コンテナの起動
以下のコマンドを実行すれば、Apache Drillのコンソールが開きます。
$ docker run --rm -it --name drill -p 8047:8047 -t drill/apache-drill:1.15.0 /bin/bash Apache Drill 1.15.0 "Start your SQL engine." 0: jdbc:drill:zk=local>
この状態でブラウザで以下にアクセスすればWeb UIにアクセス可能です。
メモリが少ないと以下のようなエラーが出る場合があります。1.5GBは必要そう。
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006c0000000, 1431633920, 0) failed; error='Cannot allocate memory' (errno=12) # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 1431633920 bytes for committing reserved memory. # An error report file with more information is saved as: # //hs_err_pid1.log
S3への接続設定
例として、これらのファイルにクエリをかけてみます。
- s3://mybucket/path/to/my/parquet/a.parquet
- s3://mybucket/path/to/my/parquet/b.parquet
Dockerのコンテナ起動した状態で以下にアクセスします。
Top
-> Storage
-> S3
-> Update
JSONに設定を入れます。設定が終わったら Update
ボタンと Enable
ボタンを押します。
{ "type": "file", "connection": "s3a://mybucket", "config": { "fs.s3a.access.key": "ID", "fs.s3a.secret.key": "SECRET" }, "workspaces": { "myparquet": { "location": "/path/to/my/parquet/", "writable": true, "defaultInputFormat": null, "allowAccessOutsideWorkspace": false }, "root": { "location": "/", "writable": false, "defaultInputFormat": null, "allowAccessOutsideWorkspace": false } }, "formats": { 省略
Enable Storage Pluginsに以下のようにS3が表示されればOKです。
いくつかクエリを投げてみる
DB一覧に先程JSONで追加した、s3.myparquet
が入っています。
0: jdbc:drill:zk=local> show databases; +---------------------+ | SCHEMA_NAME | +---------------------+ | cp.default | | dfs.default | | dfs.root | | dfs.tmp | | information_schema | | s3.default | | s3.myparquet | | s3.root | | sys | +---------------------+
ファイルの一覧も確認できます。
0: jdbc:drill:zk=local> SHOW FILES FROM s3.myparquet; +------------+--------------+---------+---------+--------+--------+--------------+------------------------+------------------------+ | name | isDirectory | isFile | length | owner | group | permissions | accessTime | modificationTime | +------------+--------------+---------+---------+--------+--------+--------------+------------------------+------------------------+ | a.parquet | false | true | 6498 | | | rw-rw-rw- | 1970-01-01 00:00:00.0 | 2019-02-12 14:40:39.0 | | b.parquet | false | true | 6498 | | | rw-rw-rw- | 1970-01-01 00:00:00.0 | 2019-02-12 14:40:44.0 | +------------+--------------+---------+---------+--------+--------+--------------+------------------------+------------------------+ 2 rows selected (1.007 seconds)
同様の操作で root
からにディレクトリたどることも可能です。
0: jdbc:drill:zk=local> SHOW FILES FROM s3.root.`/pathto/somewehre/`;
SELECT文も当然打てます。
0: jdbc:drill:zk=local> select elb_name,count(*) from s3.myparquet.`a.parquet` group by elb_name; +---------------+---------+ | elb_name | EXPR$1 | +---------------+---------+ | elb_demo_001 | 2 | | elb_demo_002 | 1 | | elb_demo_003 | 2 | | elb_demo_004 | 1 | | elb_demo_006 | 1 | | elb_demo_008 | 1 | | elb_demo_009 | 2 | +---------------+---------+ 7 rows selected (3.707 seconds)
S3ファイルのダウンロードが走るのでEC2上などでやった方がパフォーマンスや料金観点からも良いかもです。IAMロールも使えますし。