こんにちは。GMO NIKKOのY.Sです。
先月、Apache Drill 1.2がリリースされました。
Apache DrillはスキーマフリーのSQLエンジンで、HDFS, HBase, MongoDB, Amazon S3, ローカルのCSV, JSONファイルなど、複数のデータソースをテーブルと見なしてJOINすることができるので、クエリを使って様々なデータを取得できます。
今回のリリースでいくつかの機能が追加されました。
- JDBC storage plugin を介したRDBのサポート
- 新しいwindow関数の追加
- File/Directoryに対するDROP TABLEができるように
- MongoDBサポートの強化
今回RDBがサポートされたとのことだったので、どんな感じになるのか試してみました。
Drill in 10 Minutesの手順でインストールします。
1 2 3 4 |
$ wget http://getdrill.org/drill/download/apache-drill-1.2.0.tar.gz $ tar -xvzf apache-drill-1.2.0.tar.gz $ cd apache-drill-1.2.0 $ bin/drill-embedded |
今回はローカルマシン上でembeddedモードで動かしてみます。
1 2 3 4 5 6 7 8 9 10 11 |
0: jdbc:drill:zk=local> SELECT * FROM dfs.`<installed-path>/apache-drill-1.2.0/sample-data/region.parquet`; +--------------+--------------+-----------------------+ | R_REGIONKEY | R_NAME | R_COMMENT | +--------------+--------------+-----------------------+ | 0 | AFRICA | lar deposits. blithe | | 1 | AMERICA | hs use ironic, even | | 2 | ASIA | ges. thinly even pin | | 3 | EUROPE | ly final courts cajo | | 4 | MIDDLE EAST | uickly special accou | +--------------+--------------+-----------------------+ 5 rows selected (0.103 seconds) |
tutorialにあったparquetフォーマットのデータにqueryを投げてみたところ、同じ結果が返ってきました。
JDBC storage pluginを使うにはこちらを参考に設定していきます。
事前にJDBC driverが必要になるのでjarファイルを落としておきます。
今回MariaDBに接続したかったので、MariaDB Connector/Java 1.2のページ
からダウンロードして、jarファイルをapache-drill-1.2.0/jars/3rdparty/配下に配置します。
MariaDBにはtest.t1テーブルを作って適当なデータをいれておきます。
1 2 3 4 5 6 7 8 9 |
MariaDB [test]> select * from t1; +------+------+--------+ | id | val | val2 | +------+------+--------+ | 1 | 2 | 1007 | | 2 | 3 | test 2 | | 3 | 1 | test 3 | : : |
drill-embeddedをいったん終了して抜けます。
次に設定するプラグイン設定情報を永続化できるようするため、<installed_path>/conf/drill-override.confに以下追記します。
1 |
drill.exec.sys.store.provider.local.path = "storage.conf" |
再度drill-embeddedを起動します。
http://localhost:8047/storage/のWeb ConsoleにアクセスしてNew Storage Pluginの追加設定をします。
今回MariaDBに接続したいので、プラグイン名をmariadbと入力して[Create]を押します。
Configurationのテキストフィールドが表示されるので、次のように指定しました。
1 2 3 4 5 6 7 8 |
{ "type": "jdbc", "driver": "org.mariadb.jdbc.Driver", "url": "jdbc:mysql://localhost:3306", "username": "********", "password": "********", "enabled": true } |
Updateボタン押してSuccessと出たので、うまくいったようです。
show databases してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
0: jdbc:drill:zk=local> show databases; +---------------------+ | SCHEMA_NAME | +---------------------+ | INFORMATION_SCHEMA | | cp.default | | dfs.default | | dfs.root | | dfs.tmp | | mariadb | | sys | +---------------------+ 9 rows selected (0.17 seconds) 0: jdbc:drill:zk=local> use mariadb.test; +-------+-------------------------------------------+ | ok | summary | +-------+-------------------------------------------+ | true | Default schema changed to [mariadb.test] | +-------+-------------------------------------------+ 1 row selected (0.085 seconds) 0: jdbc:drill:zk=local> show tables; +--+ | | +--+ +--+ // show tablesの結果は表示されない? 0: jdbc:drill:zk=local> select * from t1 limit 3; +-----+------+---------+ | id | val | val2 | +-----+------+---------+ | 1 | 2 | 1007 | | 2 | 3 | test 2 | | 3 | 1 | test 3 | +-----+------+---------+ 3 rows selected (0.108 seconds) |
show tablesの結果は表示されないものの、SQLの実行はうまく行きました。
MongoDBにもテストデータを入れて Storage Pluginを有効にします。こちらは接続先情報を変えるだけで、query結果の取得までうまくいきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
0: jdbc:drill:zk=local> use mongo.test; +-------+-----------------------------------------+ | ok | summary | +-------+-----------------------------------------+ | true | Default schema changed to [mongo.test] | +-------+-----------------------------------------+ 1 row selected (0.086 seconds) 0: jdbc:drill:zk=local> show tables; +---------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | +---------------+-----------------+ | mongo.test | restaurants | | mongo.test | system.indexes | +---------------+-----------------+ 2 rows selected (0.306 seconds) 0: jdbc:drill:zk=local> select r.address from mongo.test.restaurants r limit 3; +------------------------------------------------------------------------------------------------------+ | address | +------------------------------------------------------------------------------------------------------+ | {"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"} | | {"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"} | | {"building":"2206","coord":[-74.1377286,40.6119572],"street":"Victory Boulevard","zipcode":"10314"} | +------------------------------------------------------------------------------------------------------+ 3 rows selected (0.128 seconds) |
MongoDBとMariaDBのデータソースを使ってjoinしてみます。
1 2 3 4 5 6 7 8 9 |
0: jdbc:drill:zk=local> select r.address, r.borough, r.cuisine from mongo.test.restaurants r, mariadb.test.t1 where r.address.building = t1.val2 limit 3; +----------------------------------------------------------------------------------------------------+------------+------------+ | address | borough | cuisine | +----------------------------------------------------------------------------------------------------+------------+------------+ | {"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"} | Bronx | Bakery | | {"building":"1007","coord":[-73.961696,40.7707089],"street":"Lexington Avenue","zipcode":"10021"} | Manhattan | American | | {"building":"1007","coord":[-73.924643,40.658507],"street":"Clarkson Avenue","zipcode":"11212"} | Brooklyn | Chinese | +----------------------------------------------------------------------------------------------------+------------+------------+ 3 rows selected (0.515 seconds) |
無事ちゃんと取れてるようです。
今回はMongoとMariaDBで試しましたが、HDFS、HBase、RDBなど多様なデータソースに対してjoinしてSQLを実行できるので、色々な組み合わせで活用できそうです。
インストールしてすぐ試すことできるので、興味がある人は是非お試しください。