🐰

WSL2でTrino(旧Presto)を動かす

2022/07/31に公開

の続き。

WSL2と書きましたがWSL2というよりLinuxの話かもしれません…

試した環境

  • Windows10
  • WSL2
  • Ubuntu 20.0.4
  • Apache Bigtop 3.1.0

前提

ダウンロード

最新は391なのですが、390からはJava 17以上必須(かつ自分の環境にインストール済みなのはJava 11)なので389をインストールします。

wget https://repo1.maven.org/maven2/io/trino/trino-server/389/trino-server-389.tar.gz
tar xzf trino-server-389.tar.gz
cd trino-server-389
# ついでにクライアントもインストールしておきます
wget https://repo1.maven.org/maven2/io/trino/trino-cli/389/trino-cli-389-executable.jar 

設定

公式ドキュメントにある通り

  • config.properties
  • jvm.config
  • log.properties
  • node.properties
  • catalog/

を解答したディレクトリ(trino-server-389)のetc/下に作ります。

# 設定ファイルを置くディレクトリと、データを置くディレクトリを作ります
mkdir -p etc/catalog data/
# 適当なエディタで設定ファイルを記載します
emacs etc/config.properties etc/jvm.config etc/log.properties etc/node.properties etc/catalog/hive.properties 

config.properties。公式ドキュメントでは三つ例(coordinato, worker, 両方同じマシン)がありますが、今回は両方同じマシンの設定です(include-coordinator=True)。

coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
discovery.uri=http://localhost:8080

jvm.config

cat etc/jvm.config
-server
-Xmx16G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics

log.properties

io.trino=INFO

node.properties

node.environment=dev
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
# ここのディレクトリは適当に変えてください
node.data-dir=/home/notrogue/project/bigtop/trino-server-389/data

hive.properties

connector.name=hive
hive.metastore.uri=thrift://127.0.0.1:9083

起動

  • Hive Metastore(thrift)
  • Trino(CoordinatorとWorker)

を起動します。

Hive

なお、メタデータデータベースがDerby(デフォルトの設定)の場合は、hiveserver2を停止しておく必要があります。

hive --service metastore

Trino

スクリプトで起動するだけです。

./bin/launcher run

確認

クライアントを起動します。

java -jar trino-cli-389-executable.jar

以前にHiveで作ったテーブルをSELECTしてみます。

trino> SELECT * FROM hive.default.tbl_a;
 col_a
-------
 hoge
 hoge
(2 rows)

Query 20220731_104122_00000_7k7ph, FINISHED, 1 node

よさそうです。

はまりどころ

  • 一台のマシンで起動する時はnode-scheduler.include-coordinator=trueを設定する必要があります。設定しない場合Trino起動時はエラーになりませんが、クエリが実行できません
  • メタデータデータベースにDerbyを使用、かつ、Hive Metastore起動時に、hiveserver2起動中にMetastoreを起動するとMetastoreの起動に失敗します(からのTrinoからHive Connectorも失敗)

ログ(抜粋)

Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /var/lib/hive/metastore/metastore_db.
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unknown Source)

Discussion