DockerでApache Drillをサクッと試してみる(S3上のParquetファイル読んでみた)

Apache Drillですが、簡単にインストールして使うことできます。

こちらに書かれているようにダウンロードして解凍するだけです。

Installing Drill on Linux and Mac OS X - Apache Drill

ただDocker使える環境あればもっと簡単に試すことできます。

公式コンテナ

Docker Hubで公式コンテナ探したのですが、地味ながらこちらが公式のようです。

hub.docker.com

マニュアルに書かれているので。

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にアクセス可能です。

http://localhost:8047/

f:id:yomon8:20190212231925p:plain

メモリが少ないと以下のようなエラーが出る場合があります。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のコンテナ起動した状態で以下にアクセスします。

http://localhost:8047/

Top -> Storage -> S3 -> Update

f:id:yomon8:20190212232535p:plain

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です。

f:id:yomon8:20190212234417p:plain

いくつかクエリを投げてみる

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ロールも使えますし。

drill.apache.org

関連リンク

yomon.hatenablog.com