May 28, 2017

Run Presto Product Test

Prestoには 特に設定せずに使えるテストに加えて、product-testというものが存在します。これは裏でDockerでHadoop, MySQL, PostgreSQL, Cassandra, SQL Serverを立ち上げておいて、そのDBに対してクエリを発行し、テストするものです。各コネクタ内のDBはドライバが提供しているEmbedded Serverを立ち上げられる機能等を利用しています。コネクタ内のDBバージョンとproduct-testのバージョンをあえて分けることで複数バージョンに対する保証にもなっています。例えばCassandraはコネクタ内のテストで使用しているバージョンは2.xでproduct-test内のバージョンは3.xとなっています。
それではMac上での最初の設定方法を書いていきます。シェル上で実行する方法もありますが、一番実行することの多そうなIntelliJ上でのテスト方法について書いていきます。MacとUbuntuとで多少異なる部分もありますが、基本的には同じ流れです。 シェルでの実行方法や最新の情報を見たい場合はこちらをご覧ください。
1 リポジトリ直下でビルド

./mvnw install -DskipTests

2 テスト対象のコンテナを起動 必要であれば全部起動させますが、1個だけでももちろん大丈夫です。 ※SQL Serverを使用する場合は事前にメモリを3.25GB以上をDockerに割り当てておく必要があります。起動する際も容量が空いてないと失敗します。

presto-product-tests/conf/docker/singlenode/compose.sh up -d hadoop-master
presto-product-tests/conf/docker/singlenode/compose.sh up -d mysql
presto-product-tests/conf/docker/singlenode/compose.sh up -d postgres
presto-product-tests/conf/docker/singlenode/compose.sh up -d cassandra
presto-product-tests/conf/docker/singlenode-sqlserver/compose.sh up -d sqlserver

3 IPアドレスを/etc/hostsに記載 起動したコンテナに対して以下のようにコマンドを実行すると、IPアドレスが返却されます。$()内のコマンドは前のステップで使用したものを参考にしてください。

$ docker inspect $(presto-product-tests/conf/docker/singlenode-sqlserver/compose.sh ps -q sqlserver) | grep -i IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.18.0.4",

localhostに部分に”hadoop-master mysql postgres cassandra sqlserver”を追加し、上記で取得したアドレスを追記していきます。
127.0.0.1 localhost hadoop-master mysql postgres cassandra sqlserver
172.18.0.4      sqlserver

4 IntelliJの設定追加 メニューバー内の”Run”→”Edit Configurations…“のあと以下のように入力します。Prestoメモ#1 IntelliJ IDEAのセットアップで作成したPrestoServerの設定をコピーすると楽です。入力が終わったらOKでダイアログを閉じます。

Main class: com.facebook.presto.server.PrestoServer
VM options: -ea -Xmx2G -Dconfig=etc/config.properties -Dlog.levels-file=etc/log.properties -DHADOOP_USER_NAME=hive -Duser.timezone=UTC
Working directory: presto-product-tests/conf/presto

ここまで来たらIntelliJ上でステップ4で作成したConfigurationをRun/DebugするとPrestoServerと同じように起動時のメッセージがコンソールに流れて行くと思います。起動が完了したら、presto-product-tests内にあるテストを実行していけます。めでたしめでたし。https://github.com/prestodb/presto/tree/master/presto-product-tests

May 22, 2017

Setup Presto Dev Environment

半年ほど前から密かにPrestoにコントリビュートしているんですが、メモも兼ねて自分が送ったPRや開発のTipsについて書いていきたいと思います。開発言語はJavaなのと、直すべきところも多々あるので比較的コントリビュートしやすいOSSな気がします。次に開発環境ですが、Windowsはサポートされていません。頑張れば出来るかもしれませんが、スタイルチェッカーで文字コード等々が弾かれエラーになります。俺はッWindowsを愛しているんだッ…!という方はこちらのIssueに対応しましょうWindows Support #2351。約2年以上経過していますが、0/12という進捗率です…。僕は基本Macで時々VM内のUbuntu上で開発しています。後々詳しく書きますが、Dockerを使うテストがあるので、その時はやはりUbuntu上で動かすことが多いです。

準備としてIntellij IDEAとPrestoをローカルにクローン/ダウンロードしておきます。 最新のRequirmentsはこちらをご覧ください。

1 Terminalからリポジトリの直下でビルド 環境によっては数十分かかるかもしれないので気長に待ちましょう。

mvn clean install -DskipTests

2 IDEA上でプロジェクトをImport Intellij IDEAを起動し、Import Projectでリポジトリ直下のpom.xmlを選択します。そこから先は適当にNextを連打し、JDKの選択画面では1.8のパスを選択します。

3 IDEA上でPrestoサーバーを起動 プロジェクトのフォルダで以下のファイルまで移動し、右クリックでCreate ‘PrestoServer.main()’…とした後に、VM OptionsとWorking directoryを入力します。

presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java
VM Options: -ea -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -Xmx2G -Dconfig=etc/config.properties -Dlog.levels-file=etc/log.properties
Working directory: $MODULE_DIR$

これでRunもしくはDebugするとPrestoのサーバー側が起動します。起動しているサーバーに接続するためには下記のパスにあるjarを実行することで接続できます。

presto-cli/target/presto-cli-*-SNAPSHOT-executable.jar

ちなみに、サーバー側の設定ファイルはpresto-main/etc配下に存在します。master上の設定ファイルでは全部のコネクタが記載されていないので、もしcatalog内に記載されていないコネクタでデバッグしたい時などはconfig.propertiesを修正し、catalog配下にpropertiesファイルを追加する必要があります。

なおテストですが、全部を回すとなると環境にもよりますが1時間以上はかかるかと思います。Travis CIの無料プランで大体1時間ちょっと、Presto側では30分ちょっとで終わります。あくまで自分の場合はですが、ローカルではクラス単位、たまにコネクタ単位でテストしたらmvn clean install -DskipTestsでスタイルチェック後に、GitHubにPushしてTravis CI上で全テストを回すようにしています。presto-product-testsはそれなりの頻度で失敗するので、影響がなさそうな部分を直したのに失敗している時はログを見ないでその部分だけRestartをかけちゃってます。

May 2, 2017

Develop presto-elasticsearch connector

I’ve developed presto-elasticsearch connector.
https://github.com/ebyhr/presto/tree/elastic

I know the existence of sql4es but I want more thin library. My current presto-elasticsearch connector is yet under construction. In future, I’m going to add the feature holding caches, filtering record on elasticsearch server side(not presto side), and more tests.