Help us understand the problem. What is going on with this article?

Apache DrillからS3に配置したJSONに対してクエリを発行する

More than 3 years have passed since last update.

はじめに

追加のライブラリを導入することで、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を展開したディレクトリです。

セットアップ手順

  1. 下記サイトにあるライブラリをダウンロードし、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バケットに配置しておきます。

test.json
{"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

脚注


  1. 冒頭の英語版のサイトでは s3:// となっていますが、通常のJSONを扱う場合は s3n:// とする必要があります。 

  2. パフォーマンスは落ちます。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした