はじめに
追加のライブラリを導入することで、Apache DrillからS3上に配置したJSONに対してSQLクエリを発行できます。
S3上のファイルに直接アクセスできれば、データをマシン上に配置しなくて済むので、EBSの領域を確保しなくて済みます。
また、Apache Drillを使いたいときだけスポットインスタンスを立ち上げるといったことも簡単になり、お財布にもとても嬉しいです。
ちなみに、このページで解説していることをやってみただけです。
http://drill.apache.org/blog/2014/12/09/running-sql-queries-on-amazon-s3/
動画も公開されていますので手順がわかりやすいです。
https://www.youtube.com/watch?v=jNUsprJNQUg
セットアップ
準備
- Apache Drillを実行できる環境を用意しておいてください。(公式サイトよりtar.gzをDLし解凍するだけ)
- S3のバケットを用意してください
- S3にアクセスできるAWSのアクセスキーとシークレットキーを用意してください
作業ディレクトリは、明示しない限りApache Drillを展開したディレクトリです。
セットアップ手順
- 下記サイトにあるライブラリをダウンロードし、JARをApache Drillのjars/3rdpartyディレクトリにコピーします。
http://www.jets3t.org/
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 jars/3rdparty/
2. conf/hadoop-excludes.txt を編集し、「jets3t」の行を削除する
3. conf/core-site.xmlを作成する。下記テンプレートのIDとSECRETの部分をS3にアクセス可能なAWSのAccess KeyとSecret Keyに置き換える。
<configuration>
<property>
<name>fs.s3.awsAccessKeyId</name>
<value>ID</value>
</property>
<property>
<name>fs.s3.awsSecretAccessKey</name>
<value>SECRET</value>
</property>
<property>
<name>fs.s3n.awsAccessKeyId</name>
<value>ID</value>
</property>
<property>
<name>fs.s3n.awsSecretAccessKey</name>
<value>SECRET</value>
</property>
</configuration>
4. Drillのシェルを起動
シェルを起動することで http://<マシンのIP>:8047/ から設定画面を開けるようになります。
EC2の場合はセキュリティグループの設定で8047を開けておいてください。
./bin/sqlline -u jdbc:drill:zk=local
5. S3用のプラグインを設定する
http://<マシンのIP>:8047/ にアクセスして「Storage」タブを選択します。
Enable Storage Plugins内の「dfs」のUpdateをクリックします。
表示されたテキストエリアの内容をすべてコピーし、「Back」で元の画面に戻ります。
New Storage Pluginのテキストエリアに「s3-mybucketname」のように好きなプラグイン名を入力しCreateを押します。
テキストエリアに先ほどコピーした内容をペーストし、「file:///」を「s3n://my-bucket-name」1に置換しCreateを押します。
「my-bucket-name」はS3のバケット名を指定してください。
実行
セットアップが完了しましたので、S3に適当なjsonファイルを置いてクエリを投げてみます。
下記のtest.jsonを用意してS3バケットに配置しておきます。
{"id": 1, "name": "foo"}
{"id": 2, "name": "bar"}
Apache Drillのシェルからクエリを投げます。
「s3-mybucketname」のところはセットアップで指定したプラグイン名になります。
0: jdbc:drill:zk=local> select * from `s3-mybucketname`.`test.json`;
+------------+------------+------------+
| dir0 | id | name |
+------------+------------+------------+
| mybucketname | 1 | foo |
| mybucketname | 2 | bar |
+------------+------------+------------+
2 rows selected (2.533 seconds)
ちなみに、200MBほどのJSONに対しても6秒ほどで集計できました。
EC2とS3のリージョンを合わせておけばなかなか高速に結果を得られます。
通常のファイルシステムへのアクセスと同じように、FROM句にディレクトリを指定すれば、配下のJSONが結合したテーブルとして扱うこともできます。
日別にJSONが分かれているようなケースでもひとつのテーブルとして扱えます。2