Apache Drill で遊んでみた。プラグインも作ってみた。

この記事は[Opt Technologies Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opt-technologies)の17日目です。

前から面白そうだと思っていたApacheDrillを触ってみたので、
自分が知ったこと、やってみたことをざっとご紹介したいと思います。

## 追加したstorageなどの保存場所

デフォルトでは `/tmp/drill` ディレクトリになるようです。(Macの場合)
そのため、設定した内容が翌日に消えたりするので、以下の設定ファイルで変更しましょう。

`${DRILL_HOME}/conf/drill-override.conf`

以下のように設定しておくと、drillをインストールしたディレクトリの直下の settings ディレクトリに保存されるようになります。

```js
drill.exec: {
  cluster-id: "drillbits1",
  zk.connect: "localhost:2181",
  sys.store.provider: {
    local: {
      path: "settings",
      write: true
    }
  }
}
```

## ディレクトリ内の拡張子無しJSONを一括でクエリする

Drillではディレクトリ内のファイルを一括でクエリできますが、
ファイルをどの形式として解釈するかは拡張子による判定のため、拡張子なしのJSONをクエリする場合はStorageの設定に手を入れてやる必要があります。

DrillのWEBコンソールから `Storage` `dfs` `Update` と進んで、`workspaces` に以下のブロックを追加して保存すればOK。

```js
  "workspaces": {
    ...
    "tmpAsJson": {
      "location": "/tmp",
      "writable": true,
      "defaultInputFormat": "json"
    }
  }
```

これで、`/tmp/jsons/` に拡張子なしJSONが複数あるような状態で、以下のようなクエリ結果が得られるようになります。
S3上のファイルなどでも、同様の方法で処理が可能です。

```sql
select * from dfs.tmpAsJson.`/jsons`;
```

```
+----+----+----+
| a  | b  | c  |
+----+----+----+
| 1  | 2  | 3  |
| 4  | 5  | 6  |
| 7  | 8  | 9  |
+----+----+----+
```



## Storage Plugin 作ってみた

mongodbや、jdbcへの接続機能はpluginとして同梱されているため、自分も真似をして作ってみました。

https://github.com/yohei224/drill-http-json

### インストール

- ビルド

```
mvn clean compile jar:jar
mv target/drill-http-storage-0.0.1.jar ${DRILL_HOME}/jars/
```

- Drillに設定

DrillのWEBコンソールから `Storage` `New Storage Plugin` と進んで以下のように入力し保存すればOK。

```js
{
  "type" : "http",
  "enabled" : true
}
```

### ConnpasAPI叩いたサンプル

```sql
select
  ev.`ev`.event_url url, ev.`ev`.started_at started_at, ev.`ev`.title title
from (
  select FLATTEN(t.events) ev
  from http.`https://connpass.com/api/v1/event/?keyword_or=scala` t
) ev
order by started_at;
```

```
+-------------------------------------------------------+----------------------------+------------------------------------------------+
|                          url                          |         started_at         |                     title                      |
+-------------------------------------------------------+----------------------------+------------------------------------------------+
| https://entama.connpass.com/event/45662/              | 2016-12-10T11:00:00+09:00  | エンたまもくもく会(Web系技術)#2                            |
| https://golangtokyo.connpass.com/event/44807/         | 2016-12-12T18:40:00+09:00  | golang.tokyo #2                                |
| https://rpscala.connpass.com/event/46710/             | 2016-12-14T19:30:00+09:00  | Scala勉強会第187回 in 本郷                            |
| https://gbdaitokai.connpass.com/event/37730/          | 2016-12-17T10:00:00+09:00  | 合同勉強会 in 大都会岡山 -2016 Winter-                   |
| https://parser.connpass.com/event/43186/              | 2016-12-18T14:30:00+09:00  | 構文解析勉強会Vol.3                                   |
| https://weeyble-scala.connpass.com/event/46705/       | 2016-12-19T19:00:00+09:00  | イメージで掴む型クラス入門(初学者向けScala入門)                    |
| https://fp-in-scala-nagoya.connpass.com/event/46785/  | 2017-01-11T18:30:00+09:00  | 名古屋『FP in Scala』読書会 #18                        |
| https://connpass.com/event/46744/                     | 2017-01-13T20:00:00+09:00  | Scalaハンズオン【Play FrameworkでCRUDアプリを作ろう！】【若手歓迎】  |
| https://rust.connpass.com/event/43893/                | 2017-01-15T12:40:00+09:00  | Rust入門者向けハンズオン #2                              |
| https://connpass.com/event/47367/                     | 2017-01-18T19:00:00+09:00  | 【大阪】1/18(水) Scalaもくもく会                         |
+-------------------------------------------------------+----------------------------+------------------------------------------------+
```

ちなみに、`WHERE` `ORDER` `GROUP BY` などはプラグイン側では一切処理していません。Drill側が面倒をみてくれます。
（ただし、JDBCやmongoなどフィルタやソートの機能を持っている外部ストレージのプラグインの実装を見てみると、極力そちら側で処理してもらうような最適化を行っており、これを `push down` と呼んでいるようです。）

また、このプラグインでGitHubApiなども同様にクエリ可能なのを確認していますが、CommitやPullRequestの一覧などはページングするAPIとなっているため、全件取得するにはそれを考慮したプラグインにする必要がありそうです。


## さいごに

 先日発表された[Amazon Athena](https://aws.amazon.com/jp/blogs/news/amazon-athena-interactive-sql-queries-for-data-in-amazon-s3/)で不要論も聞こえたりするApache Drillですが、自作プラグインでのカスタマイズや、JDBC経由のRDBやmongdbとのJOINも可能など、違った面白さがあると思います。

というわけでみなさんもApacheDrillを触っていきましょうー。