ChangeLog - noissefnoc

日々のChangeLog。趣味のコードとかの話

macOS (10.15) に presto (0.227) をインストールした

諸事情で presto

prestodb.github.io

の関数の挙動を調べたいと思ったので、ローカルに環境構築しました。

図示すると下図

f:id:noissefnoc:20191110180054p:plain
今回やりたいこと

で、やりたいことの割に色々やることと、引っかかる箇所が多かったので記録を残しておきます。

環境は

  • macOS (10.15)
  • AdoptOpenJDK (1.8.0_u232)
  • presto (0.227)
  • mysql (8.0.16)

です。

presto のバックエンドに利用するデータベースのインストール

presto 単体だと presto サーバの JMX しか接続先がないので、先にバックエンドになるデータベースのインストール。

今回は MySQL を homebrew でインストール。

$ brew install mysql

また、このままだとデータがない状態なので、外部からCSVをロードします。

LOAD DATA LOCAL 構文で一括インストールしようとしたのですが、MySQL 8 から Server-Client 共にオプションを付与しないと利用できないようになっていました。

dev.mysql.com

ということで、サーバ、クライアント共に対応をします。

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を使ったクライアントソフトを使っているので公式の

dev.mysql.com

を参照して

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 を確認すると

prestodb.io

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 の情報がないので公式ドキュメント

prestodb.github.io

にしたがって、設定ファイルを作成します。今回 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]

問題なく実行できたようです。