この記事はOpt Technologies Advent Calendar 2016の17日目です。
前から面白そうだと思っていたApacheDrillを触ってみたので、
自分が知ったこと、やってみたことをざっとご紹介したいと思います。
追加したstorageなどの保存場所
デフォルトでは /tmp/drill
ディレクトリになるようです。(Macの場合)
そのため、設定した内容が翌日に消えたりするので、以下の設定ファイルで変更しましょう。
${DRILL_HOME}/conf/drill-override.conf
以下のように設定しておくと、drillをインストールしたディレクトリの直下の settings ディレクトリに保存されるようになります。
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。
"workspaces": {
...
"tmpAsJson": {
"location": "/tmp",
"writable": true,
"defaultInputFormat": "json"
}
}
これで、/tmp/jsons/
に拡張子なしJSONが複数あるような状態で、以下のようなクエリ結果が得られるようになります。
S3上のファイルなどでも、同様の方法で処理が可能です。
select * from dfs.tmpAsJson.`/jsons`;
+----+----+----+
| a | b | c |
+----+----+----+
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
+----+----+----+
Storage Plugin 作ってみた
mongodbや、jdbcへの接続機能はpluginとして同梱されているため、自分も真似をして作ってみました。
インストール
- ビルド
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。
{
"type" : "http",
"enabled" : true
}
ConnpasAPI叩いたサンプル
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で不要論も聞こえたりするApache Drillですが、自作プラグインでのカスタマイズや、JDBC経由のRDBやmongdbとのJOINも可能など、違った面白さがあると思います。
というわけでみなさんもApacheDrillを触っていきましょうー。