話題の記事

Apache Drill 1.0がリリースされたのでAmazon S3と連携してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Apache Drill 1.0がリリースされました!

Apache Drillは、NoSQL向けのSQLクエリエンジンで、ファイルシステム上のJSON/CSV/Parquetなどのファイル、Hiveソース、HBaseMongoDBなどに直接SQLクエリを投げることが出来ます。

何はともあれ、触ってみないとどんなモノなのかわかりません。早速試してみました!

やってみた

試した環境はEC2(on Amazon Linux 2015.03)です。

セットアップ

Drillの動作にはJDK 7が必要になりますので、インストールされていることを確認します。

$ java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (amzn-2.5.5.1.59.amzn1-x86_64 u79-b14)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

ではDrillの圧縮ファイルをゲットし、展開します。

$ wget http://getdrill.org/drill/download/apache-drill-1.0.0.tar.gz  
$ tar -xvzf apache-drill-1.0.0.tar.gz

Drillを起動してみます。余談ですが、t2.microではCannot allocate memoryが発生したので、m3.mediumインスタンスを使っています。

$ cd apache-drill-1.0.0
$ bin/drill-embedded
5 21, 2015 10:19:46 午前 org.glassfish.jersey.server.ApplicationHandler initialize
情報: Initiating Jersey application, version Jersey: 2.8 2014-04-29 01:25:26...
apache drill 1.0.0
"start your sql engine"
0: jdbc:drill:zk=local>

さらっと起動しました。

JSONファイルを扱う

こういうJSONファイルを用意しました。

$ cat /home/ec2-user/data1.json
{"id": 1, "name": "yokota"}
{"id": 2, "name": "miyamoto"}
{"id": 3, "name": "otaki"}
{"id": 4, "name": "ueki"}
{"id": 5, "name": "sasaki"}

そしてSQLクエリを投げてみます。

0: jdbc:drill:zk=local> select * from dfs.`/home/ec2-user/data1.json`;
+-----+-----------+
| id  |   name    |
+-----+-----------+
| 1   | yokota    |
| 2   | miyamoto  |
| 3   | otaki     |
| 4   | ueki      |
| 5   | sasaki    |
+-----+-----------+
5 rows selected (0.425 seconds)

おおー、簡単にできちゃいますね。

CSVファイルを扱う

じゃ、CSVもやってみましょう!

$ cat /home/ec2-user/data2.csv
1,yokoyama
2,kaji
3,ishikawa
4,watanabe

そしてSQLクエリを投げてみます。

0: jdbc:drill:zk=local> select * from dfs.`/home/ec2-user/data2.csv`;
+-------------------+
|      columns      |
+-------------------+
| ["1","yokoyama"]  |
| ["2","kaji"]      |
| ["3","ishikawa"]  |
| ["4","watanabe"]  |
+-------------------+

"columns"という項目の中に配列のように入ってますね。じゃあ分解してみましょう。

0: jdbc:drill:zk=local> select columns[0] as id, columns[1] as name from dfs.`/home/ec2-user/data2.csv`;
+-----+-----------+
| id  |   name    |
+-----+-----------+
| 1   | yokoyama  |
| 2   | kaji      |
| 3   | ishikawa  |
| 4   | watanabe  |
+-----+-----------+
4 rows selected (0.22 seconds)

簡単。素晴らしい。

いろんなSQLクエリをやってみる

まぁ、普通のSQLが使えるので、なんでも出来ます。例えばWHERE。

0: jdbc:drill:zk=local>  select * from dfs.`/home/ec2-user/data1.json` where id = 5;
+-----+---------+
| id  |  name   |
+-----+---------+
| 5   | sasaki  |
+-----+---------+
1 row selected (0.544 seconds)

ORDER。

0: jdbc:drill:zk=local>  select * from dfs.`/home/ec2-user/data1.json` order by id desc;
+-----+-----------+
| id  |   name    |
+-----+-----------+
| 5   | sasaki    |
| 4   | ueki      |
| 3   | otaki     |
| 2   | miyamoto  |
| 1   | yokota    |
+-----+-----------+
5 rows selected (1.35 seconds)

JOINだってCONVERTだって使えちゃいます。

Drillを終了する

!quitによって終了出来ます。他細かい使い方はhelpを実行して確認してください。

0: jdbc:drill:zk=local> !quit
Closing: org.apache.drill.jdbc.DrillJdbc41Factory$DrillJdbc41Connection

Amazon S3上のファイルをクエリする

では今日の本題です。Running SQL Queries on Amazon S3を参考にしました。

jets3tプラグインの最新版アーカイブを取得して展開し、jarファイルをDrillの中のjars/3rdpartyディレクトリにコピーします。

$ wget http://bitbucket.org/jmurty/jets3t/downloads/jets3t-0.9.3.zip
$ unzip jets3t-0.9.3.zip
$ cp jets3t-0.9.3/jars/jets3t-0.9.3.jar /home/ec2-user/apache-drill-1.0.0/jars/3rdparty/

次に以下のファイルを編集し、"jets3t"と書かれた行を削除し、プラグインを有効にします。

$ vi /home/ec2-user/apache-drill-1.0.0/bin/hadoop-excludes.txt
jets3t  ←削除する

そしてEC2からS3へアクセスするための認証情報を記述したconf/core-site.xmlを作成します。

$ vi /home/ec2-user/apache-drill-1.0.0/conf/core-site.xml
<configuration>
  <property>
    <name>fs.s3.awsAccessKeyId</name>
    <value>YOUR_ACCESS_KEY</value>
  </property>

  <property>
    <name>fs.s3.awsSecretAccessKey</name>
    <value>YOUR_SECRET_KEY</value>
  </property>

  <property>
    <name>fs.s3n.awsAccessKeyId</name>
    <value>YOUR_ACCESS_KEY</value>
  </property>

  <property>
    <name>fs.s3n.awsSecretAccessKey</name>
    <value>YOUR_SECRET_KEY</value>
  </property>
</configuration>

Drillを起動し、http://EC2のIPアドレス:8047/にアクセスすると、以下のような画面が表示されます。[Storage]をクリックします。

Apache_Drill

するとストレージプラグインの一覧が表示されます。まずdfsの[Update]ボタンをクリックします。

Apache_Drill 2

で、テキストエリアの内容をごっそりコピーします。[Back]ボタンで戻ります。

Apache_Drill 3

画面下部の[New Storage Plugin]で、名前をつけて(今回は"s3"という名前にしました)、[Create]ボタンをクリックします。

Apache_Drill 4

Configuration画面が開くので、さっきコピーした内容を張付けた上で、"file:///"となっていた箇所を"s3n://YOUR_BUCKET_NAME"に書き換えます。(s3では無くs3nであることに注意。s3と記述しても繋がらず、コメントを参考にs3nにしたら繋がりました)

Apache_Drill 5

これで準備完了。S3の対象バケットにjsonファイルを配置します。

S3_Management_Console_と_406910207970-sasaki_daisuk-accesskey_csv

さて、SQLクエリを実行!

0: jdbc:drill:zk=local> select * from `s3`.`data3.json`;
+---------------+-----+----------+
|     dir0      | id  |   name   |
+---------------+-----+----------+
| smokeymonkey  | 1   | father   |
| smokeymonkey  | 2   | mother   |
| smokeymonkey  | 3   | brother  |
+---------------+-----+----------+
3 rows selected (1.787 seconds)

出来た!S3に配置されたファイルに対して直接SQLクエリが発行出来ました!

さいごに

やぁ、Drillすごい。すごい便利ですよこれ。CSVやJSONファイルを、特殊な処理をすること無く検索や解析ができるってすごいことだと思います。なお、Apache DrillはTableau 9 Serverとも接続可能なそうなので、近いうちにブログ記事が出ることでしょう!楽しみにしていてください!