Presto のデプロイ

Presto のインストール

Presto サーバーの tarball 、presto-server-0.289.tar.gz をダウンロードして解凍します。tarball には、最上位ディレクトリ presto-server-0.289 が1つ含まれています。これをインストールディレクトリと呼びます。

Presto は、ログなどを保存するためのデータディレクトリを必要とします。Presto のアップグレード時に簡単に保持できるように、インストールディレクトリ外のデータディレクトリを作成することをお勧めします。

Presto の設定

インストールディレクトリ内にetcディレクトリを作成します。これには次の設定が含まれます。

  • ノードプロパティ:各ノードに固有の環境設定

  • JVM 設定:Java 仮想マシンのコマンドラインオプション

  • 設定プロパティ:Presto サーバーの設定。使用可能な設定プロパティについては、プロパティリファレンスを参照してください。

  • カタログプロパティ:コネクタ(データソース)の設定。コネクタで使用可能なカタログ設定プロパティについては、それぞれのドキュメントを参照してください。

ノードプロパティ

ノードプロパティファイル(etc/node.properties)には、各ノードに固有の設定が含まれています。ノードとは、マシン上にインストールされたPrestoの単一インスタンスです。このファイルは、通常、Presto が最初にインストールされるときにデプロイシステムによって作成されます。以下は、最小限のetc/node.propertiesです。

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/presto/data

上記の各プロパティの説明は以下の通りです。

  • node.environment:環境の名前。クラスタ内のすべてのPrestoノードは、同じ環境名を持つ必要があります。

  • node.id:このPrestoインストールの一意の識別子。これは、すべてのノードで一意である必要があります。この識別子は、Prestoの再起動やアップグレードにわたって一貫性を保つ必要があります。単一のマシン上に複数のPrestoインストールを実行する場合(つまり、同じマシン上の複数のノード)、各インストールは一意の識別子を持つ必要があります。

  • node.data-dir:データディレクトリの場所(ファイルシステムパス)。Prestoはここにログやその他のデータを保存します。

JVM 設定

JVM 設定ファイル(etc/jvm.config)には、Java 仮想マシンの起動に使用されるコマンドラインオプションのリストが含まれています。ファイルの形式は、1行に1つのオプションのリストです。これらのオプションはシェルによって解釈されないため、スペースやその他の特殊文字を含むオプションを引用符で囲む必要はありません。

以下は、etc/jvm.configの作成の出発点として役立ちます。

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError

OutOfMemoryErrorは通常、JVMを矛盾した状態に残すため、発生した場合、ヒープダンプ(デバッグ用)を書き込み、強制的にプロセスを終了します。

設定プロパティ

設定プロパティファイル(etc/config.properties)には、Presto サーバーの設定が含まれています。すべてのPrestoサーバーは、コーディネータとワーカーの両方として機能できますが、単一のマシンをコーディネーション作業のみに割り当てることで、大規模クラスタでのパフォーマンスが向上します。

コーディネータの最小限の設定を以下に示します。

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080

ワーカーの最小限の設定を以下に示します。

coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery.uri=http://example.net:8080

あるいは、コーディネータとワーカーの両方として機能する単一のマシンをテスト用に設定する場合は、次の設定を使用します。

coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080

単一のコーディネータでは不十分な場合は、次の最小限の設定を使用して、複数のコーディネータをサポートする分散型コーディネータ設定を使用します。

  • リソースマネージャ

クラスタには少なくとも1つのリソースマネージャが必要です。プライマリとして機能する複数のリソースマネージャをクラスタに追加できます。

resource-manager=true
resource-manager-enabled=true
coordinator=false
node-scheduler.include-coordinator=false
http-server.http.port=8080
thrift.server.port=8081
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080 (Point to resource manager host/vip)
thrift.server.ssl.enabled=true
  • コーディネータ

クラスタには、コーディネータのプールを持つことができます。各コーディネータは、クラスタ内のクエリのサブセットを実行します。

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery.uri=http://example.net:8080 (Point to resource manager host/vip)
resource-manager-enabled=true
  • ワーカー

クラスタには、ワーカーのプールを持つことができます。それらは、リソースマネージャにハートビートを送信します。

coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery.uri=http://example.net:8080 (Point to resource manager host/vip)
resource-manager-enabled=true

これらのプロパティについては、さらに説明が必要です。

  • resource manager:コーディネータとワーカーからのデータを収集し、クラスタのグローバルビューを構築します。詳細については、概念を参照してください。

  • coordinator:このPrestoインスタンスがコーディネータとして機能することを許可します(クライアントからのクエリを受け入れ、クエリ実行を管理します)。

  • node-scheduler.include-coordinator:コーディネータでの作業のスケジュールを許可します。大規模クラスタでは、コーディネータで作業を処理すると、マシンのリソースがクエリのスケジュール、管理、および監視という重要なタスクに使用できないため、クエリのパフォーマンスに影響を与える可能性があります。

  • http-server.http.port:HTTPサーバーのポートを指定します。Prestoは、内部および外部のすべての通信にHTTPを使用します。

  • query.max-memory:クエリが使用できる分散メモリの最大量。

  • query.max-memory-per-node:クエリが任意の1台のマシンで使用できるユーザーメモリの最大量。

  • discovery-server.enabled:Prestoは、Discoveryサービスを使用してクラスタ内のすべてのノードを見つけます。すべてのPrestoインスタンスは、起動時にDiscoveryサービスに自身を登録します。デプロイを簡素化し、追加のサービスを実行しないようにするために、Prestoコーディネータは、Discoveryサービスの埋め込みバージョンを実行できます。これはHTTPサーバーをPrestoと共有し、そのため同じポートを使用します。

  • discovery.uri:DiscoveryサーバーのURI。PrestoコーディネータでDiscoveryの埋め込みバージョンを有効にしたため、これはPrestoコーディネータのURIである必要があります。example.net:8080をPrestoコーディネータのホストとポートに合わせて置き換えます。このURIはスラッシュで終わってはいけません。

次のフラグは、分散型コーディネータクラスタのリソースグループを目的の整合性に合わせて調整するのに役立ちます。

  • concurrency-threshold-to-enable-resource-group-refresh (デフォルト: 1.0)

    実行中のクエリが設定された上限に達した場合、コーディネータが、次のリソースグループの更新を待つように設定します。それによって、任意のリソースグループでより多くのクエリが実行されるのを防ぎます。

    デフォルト値は1.0です。これは、いずれかのリソースグループが最大許容クエリ数を実行している場合、コーディネータは、指定されたリソースグループで新しいクエリの実行を許可する前に、リソースマネージャからの更新を待機する必要があることを意味します。より強い整合性を実現するには、パーセンテージを低い値に減らしてください。

  • resource-group-runtimeinfo-refresh-interval (デフォルト: 100 ms)

    この設定は、クラスタレベルのリソースグループ使用状況のリソースマネージャからのコーディネータの定期的なポーリング間隔を調整するのに役立ちます。

以下のプロパティを設定することもできます。

  • jmx.rmiregistry.port: JMX RMIレジストリのポートを指定します。JMXクライアントはこのポートに接続する必要があります。

  • jmx.rmiserver.port: JMX RMIサーバーのポートを指定します。Prestoは、JMXを介して監視に役立つ多くのメトリクスをエクスポートします。

こちらも参照してください リソースグループ

ログレベル

オプションのログレベルファイルetc/log.propertiesを使用すると、名前付きロガー階層の最小ログレベルを設定できます。すべてのロガーには名前があり、通常はロガーを使用するクラスの完全修飾名です。ロガーは、名前のドットに基づいて階層構造を持っています(Javaパッケージのような)。たとえば、次のログレベルファイルを見てください。

com.facebook.presto=INFO

これは、com.facebook.presto.servercom.facebook.presto.hiveの両方の最小レベルをINFOに設定します。デフォルトの最小レベルはINFOです。(したがって、上記の例では実際には何も変更されません)4つのレベルがあります。DEBUGINFOWARN、およびERROR

カタログプロパティ

Prestoは、カタログにマウントされた*コネクタ*を介してデータにアクセスします。コネクタは、カタログ内のすべてのスキーマとテーブルを提供します。たとえば、Hiveコネクタは各Hiveデータベースをスキーマにマップするため、Hiveコネクタがhiveカタログとしてマウントされ、Hiveにデータベースwebにテーブルclicksが含まれている場合、そのテーブルにはPrestoでhive.web.clicksとしてアクセスします。

カタログは、etc/catalogディレクトリにカタログプロパティファイルを作成することによって登録されます。たとえば、etc/catalog/jmx.propertiesを次の内容で作成して、jmxコネクタをjmxカタログとしてマウントします。

connector.name=jmx

コネクタで、コネクタの設定に関する詳細情報をご覧ください。

Prestoの実行

インストールディレクトリには、bin/launcherにランチャースクリプトが含まれています。Prestoは、次のように実行することでデーモンとして起動できます。

bin/launcher start

あるいは、ログやその他の出力がstdout/stderrに出力されるようにフォアグラウンドで実行することもできます(daemontoolsなどのスーパービジョンシステムを使用する場合は、両方のストリームをキャプチャする必要があります)。

bin/launcher run

--helpを使用してランチャーを実行すると、サポートされているコマンドとコマンドラインオプションを確認できます。特に--verboseオプションは、インストールのデバッグに非常に役立ちます。

起動後、ログファイルはvar/logにあります。

  • launcher.log: このログはランチャーによって作成され、サーバーのstdoutとstderrストリームに接続されています。サーバーのロギングが初期化されている間、およびJVMによって生成されたエラーまたは診断情報を含むいくつかのログメッセージが含まれます。

  • server.log: これはPrestoで使用されるメインログファイルです。サーバーが初期化中に失敗した場合、通常は関連情報が含まれます。自動的にローテーションされ、圧縮されます。

  • http-request.log: これは、サーバーによって受信されたすべてのHTTPリクエストを含むHTTPリクエストログです。自動的にローテーションされ、圧縮されます。

ラップトップでS3をクエリする例

このセクションでは、単一のラップトップ上のHive MetaStoreに接続してS3バケット内のデータをクエリするPrestoの実行方法を示します。

Hive MetaStoreの設定

Hiveのバイナリtarballをダウンロードして解凍します。たとえば、apache-hive-<VERSION>-bin.tar.gzをダウンロードして解凍します。

Prestoカタログ情報(テーブルスキーマやパーティションの場所など)を提供するために、Hive Metastoreを起動するだけです。Hive Metastoreを初めて起動する場合は、対応する設定ファイルと環境を準備します。また、新しいMetastoreを初期化します。

export HIVE_HOME=`pwd`
cp conf/hive-default.xml.template conf/hive-site.xml
mkdir -p hcatalog/var/log/
bin/schematool -dbType derby -initSchema

AWS S3にアクセスする場合は、conf/hive-env.shに次の行を追加します。Hiveはs3a://アドレスを持つファイルにアクセスするために対応するjarファイルと、S3バケットにアクセスするためのAWS認証情報(公開されている場合でも)が必要です。これらのjarファイルはHadoopディストリビューション(例:${HADOOP_HOME}/share/hadoop/tools/lib/の下)で見つけるか、mavenセントラルリポジトリからダウンロードできます。

export HIVE_AUX_JARS_PATH=/path/to/aws-java-sdk-core-<version>.jar:$/path/to/aws-java-sdk-s3-<version>.jar:/path/to/hadoop-aws-<version>.jar
export AWS_ACCESS_KEY_ID=<Your AWS Access Key>
export AWS_SECRET_ACCESS_KEY=<Your AWS Secret Key>

バックグラウンドで実行され、ポート9083(デフォルト)でリッスンするHive Metastoreを起動します。

hcatalog/sbin/hcat_server.sh start

出力は次のようになります。

Started metastore server init, testing if initialized correctly...
Metastore initialized successfully on port[9083].

MetaStoreが実行されているかどうかを確認するには、hcatalog/var/log/にあるHive Metastoreログを確認します。

Prestoの設定

設定プロパティに基づいて、設定ファイルetc/config.propertiesを作成します。たとえば、ラップトップでPrestoを実行するための最小限の設定に従ってください。

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

JVM設定に従ってetc/jvm.configを、ノードプロパティに従ってetc/node.propertiesを作成します。

最後に、先ほど起動したHive Metastoreを指すetc/catalog/hive.propertiesでPresto Hiveコネクタを設定します。PrestoがS3から入力ファイルを読み取る必要がある場合は、ここにAWS認証情報も再び含めます。

connector.name=hive-hadoop2
hive.metastore.uri=thrift://localhost:9083
hive.s3.aws-access-key=<Your AWS Access Key>
hive.s3.aws-secret-key=<Your AWS Secret Key>

Prestoサーバーを実行します。

./bin/launcher start

Dockerを使用した例

PrestoのDockerイメージを準備する方法を見てみましょう。以下に、Prestoを比較的簡単に実行する方法を示します。デモのために、この構成は、スケジューラがワーカーとしてコーディネータを含む単一ノードのPrestoインストールです。カタログを1つ、TPCHを設定します。

Dockerfileでは、Prestoをダウンロードし、ローカルのetcディレクトリ内の一部の設定ファイルをイメージにコピーし、サーバーを実行するためのエントリポイントを指定します。

FROM openjdk:8-jre

# Presto version will be passed in at build time
ARG PRESTO_VERSION

# Set the URL to download
ARG PRESTO_BIN=https://repo1.maven.org/maven2/com/facebook/presto/presto-server/${PRESTO_VERSION}/presto-server-${PRESTO_VERSION}.tar.gz

# Update the base image OS and install wget and python
RUN apt-get update
RUN apt-get install -y wget python less

# Download Presto and unpack it to /opt/presto
RUN wget --quiet ${PRESTO_BIN}
RUN mkdir -p /opt
RUN tar -xf presto-server-${PRESTO_VERSION}.tar.gz -C /opt
RUN rm presto-server-${PRESTO_VERSION}.tar.gz
RUN ln -s /opt/presto-server-${PRESTO_VERSION} /opt/presto

# Copy configuration files on the host into the image
COPY etc /opt/presto/etc

# Download the Presto CLI and put it in the image
RUN wget --quiet https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/${PRESTO_VERSION}/presto-cli-${PRESTO_VERSION}-executable.jar
RUN mv presto-cli-${PRESTO_VERSION}-executable.jar /usr/local/bin/presto
RUN chmod +x /usr/local/bin/presto

# Specify the entrypoint to start
ENTRYPOINT ./opt/presto/bin/launcher run

etc/フォルダには、Prestoを設定するための4つのファイルと、etc/catalog/内の1つのカタログがあります。カタログはコネクタの設定を定義し、ファイル名(.properties拡張子を除く)を元に命名されます。同じコネクタを使用する複数のカタログを含む、Prestoインストールごとに複数のカタログを持つことができます。ファイル名は異なる必要があります。ファイルは次のとおりです。

etc/
├── catalog
│   └── tpch.properties  # Configures the TPCH connector to generate data
├── config.properties    # Presto instance configuration properties
├── jvm.config           # JVM configuration for the process
├── log.properties       # Logging configuration
└── node.properties      # Node-specific configuration properties

etcの直下にある4つのファイルについては上記で説明しています(config.propertiesの単一ノードコーディネータ構成を使用)。etc/catalog/tpch.propertiesというファイルは、tpchカタログを定義するために使用されます。各コネクタには、コネクタ固有の設定プロパティの独自のセットがあります。コネクタと一緒に文書化されているコネクタの設定プロパティを見つけることができます。TPCHコネクタには特別な設定がないため、カタログにもtpchというコネクタの名前を指定するだけです。

etc/catalog/tpch.properties

connector.name=tpch

これで、バージョンを指定してDockerコンテナを構築し、Prestoを起動する準備ができました。Prestoの最新バージョンは現在0.289です。

docker build --build-arg PRESTO_VERSION=<see releases for latest version> . -t prestodb:latest
docker run --name presto prestodb:latest

Prestoが起動すると、一連のログが表示され、SERVER STARTEDで終了します。これは、クエリを受信する準備ができたことを示しています。別のターミナルウィンドウを使用してイメージ内に配置したPrestoに接続するには、Presto CLIを使用します。

docker exec -it presto presto

tpchカタログに対してクエリを実行できます。

presto> SELECT
     ->   l.returnflag,
     ->   l.linestatus,
     ->   sum(l.quantity)                                       AS sum_qty,
     ->   sum(l.extendedprice)                                  AS sum_base_price,
     ->   sum(l.extendedprice * (1 - l.discount))               AS sum_disc_price,
     ->   sum(l.extendedprice * (1 - l.discount) * (1 + l.tax)) AS sum_charge,
     ->   avg(l.quantity)                                       AS avg_qty,
     ->   avg(l.extendedprice)                                  AS avg_price,
     ->   avg(l.discount)                                       AS avg_disc,
     ->   count(*)                                              AS count_order
     -> FROM
     ->   tpch.sf1.lineitem AS l
     -> WHERE
     ->   l.shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY
     -> GROUP BY
     ->   l.returnflag,
     ->   l.linestatus
     -> ORDER BY
     ->   l.returnflag,
     ->   l.linestatus;
 returnflag | linestatus |   sum_qty   |    sum_base_price     |    sum_disc_price     |      sum_charge       |      avg_qty       |     avg_price     |       avg_disc       | count_order
------------+------------+-------------+-----------------------+-----------------------+-----------------------+--------------------+-------------------+----------------------+-------------
 A          | F          | 3.7734107E7 |  5.658655440072982E10 | 5.3758257134869644E10 |  5.590906522282741E10 | 25.522005853257337 | 38273.12973462155 |  0.04998529583846928 |     1478493
 N          | F          |    991417.0 |  1.4875047103800006E9 |  1.4130821680540998E9 |   1.469649223194377E9 | 25.516471920522985 | 38284.46776084832 |  0.05009342667421586 |       38854
 N          | O          |  7.447604E7 | 1.1170172969773982E11 | 1.0611823030760503E11 | 1.1036704387249734E11 |  25.50222676958499 | 38249.11798890821 |   0.0499965860537345 |     2920374
 R          | F          | 3.7719753E7 |   5.65680413808999E10 |  5.374129268460365E10 |  5.588961911983193E10 |  25.50579361269077 | 38250.85462609959 | 0.050009405830198916 |     1478870
(4 rows)

Query 20200625_171123_00000_xqmp4, FINISHED, 1 node
Splits: 56 total, 56 done (100.00%)
0:05 [6M rows, 0B] [1.1M rows/s, 0B/s]