macOS (10.15) に presto (0.227) をインストールした
諸事情で presto
の関数の挙動を調べたいと思ったので、ローカルに環境構築しました。
図示すると下図
で、やりたいことの割に色々やることと、引っかかる箇所が多かったので記録を残しておきます。
環境は
です。
presto のバックエンドに利用するデータベースのインストール
presto 単体だと presto サーバの JMX しか接続先がないので、先にバックエンドになるデータベースのインストール。
今回は MySQL を homebrew でインストール。
$ brew install mysql
また、このままだとデータがない状態なので、外部からCSVをロードします。
LOAD DATA LOCAL
構文で一括インストールしようとしたのですが、MySQL 8 から Server-Client 共にオプションを付与しないと利用できないようになっていました。
ということで、サーバ、クライアント共に対応をします。
MySQL サーバ側
設定ファイルを変更してもいいのですが、何度もデータをロードしないので、DBに接続して設定を変更します
-- オプション設定 mysql> SET PERSIST local_infile = 1 Query OK, 0 rows affected (0.00 sec) -- オプション設定確認 mysql> SELECT @@local_infile; +----------------+ | @@local_infile | +----------------+ | 1 | +----------------+ 1 row in set (0.00 sec)
MySQL クライアント側
MySQL 付属の mysql-client であれば --local-infile=1
オプションを付けてコネクションを張ればよいのですが、JDBCを使ったクライアントソフトを使っているので公式の
を参照して
allowLoadLocalInfile Should the driver allow use of 'LOAD DATA LOCAL INFILE...'? Default: false Since version: 3.0.3
が該当するので、 allowLoadLocalInfile=true
をセットしました。
Java 1.8のインストール
presto の requirements を確認すると
Java 8, 64-bit
となっていました。macOS にインストールされていたのも 8 ではありましたが、アップデートバージョンが不足しており、インストールが必要になりました。
すでに Oracle 配布の Java 8 は homebrew 他で配布されていないので、 homebrew cask を使って 3rd Party の JDK 8 互換の JDK をインストールします。
$ brew cask install adoptopenjdk8
この後、環境変数の JAVA_HOME を変更して、 presto が使う Java のパスを変更します。
$ export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
これで Java の準備は完了。
presto のインストール
homebrew だと
- prestodb
- prestosql
があり、排他的なインストール制限があったので、今回は prestodb のパッケージの方をインストールしました。
$ brew install prestodb
ここは特に問題なし。
presto の MySQL カタログの追加
このままだと presto が使う MySQL の情報がないので公式ドキュメント
にしたがって、設定ファイルを作成します。今回 presto を homebrew でインストールしているので /usr/local/Cellar/prestodb/<バージョン番号>/libexec/etc/catalog/mysql.properties
にファイルを作成します
connector.name=mysql connection-url=jdbc:mysql://localhost:3306 connection-user=<USER_NAME> connection-password=<PASSWORD>
MySQL サーバの起動
brew info に書かれているように
$ mysql.server start
で起動
presto サーバの起動
以下コマンドを実行。 ( 8080
ポートを使うので他で利用している場合は変更)
$ presto-server run
presto クライアントの接続
以下コマンドを実行
$ presto --server localhost:8080 --catalog mysql
成功すると
presto>
と入力待ちの状態になります。
presto のクエリの実行
前までの手順で入力待ちの状態になっているのでクエリを実行します
# データベースを選択 presto> USE presto_test; USE # テーブルの確認 presto:presto_test> SHOW TABLES; Table ----------- pageviews (1 row) Query 20191108_163558_00001_b98d2, FINISHED, 1 node Splits: 19 total, 19 done (100.00%) 0:02 [1 rows, 30B] [0 rows/s, 15B/s] # presto の独自関数 url_extract_path を含むクエリの実行 presto:presto_test> SELECT url_extract_path(url) FROM pageviews LIMIT 5; _col0 -------------------- url /entry/20061110/p4 /entry/20120407/p1 /entry/20130601/p1 /entry/20060731/p1 (5 rows) Query 20191108_163701_00002_b98d2, FINISHED, 1 node Splits: 34 total, 34 done (100.00%) 0:00 [366 rows, 0B] [820 rows/s, 0B/s]
問題なく実行できたようです。