Spark上でのPrestoの実行

Presto on Sparkを使用すると、Prestoクエリの実行フレームワークとしてSparkを活用できます。これは、数千ノードで実行したいクエリ、10テラバイトまたは100テラバイトのメモリが必要なクエリ、および多くのCPU年数を消費するクエリに役立ちます。

Sparkは、リソースの分離、きめ細かいリソース管理、スケーラブルなマテリアライズド交換メカニズムなど、いくつかの便利な機能を追加します。

手順

Presto Sparkパッケージのtarball、presto-spark-package-0.289.tar.gz とPresto Sparkランチャー、presto-spark-launcher-0.289.jar をダウンロードします。両方のファイルを、たとえば *example* ディレクトリに保存します。ここでは、それぞれ4つのコアを持つ2ノードのSparkクラスタを想定しているため、合計8つのコアになります。

以下は、config.properties の例です。

task.concurrency=4
task.max-worker-threads=4
task.writer-count=4

プロパティの詳細については、プロパティリファレンス を参照してください。エグゼキュータあたり4つのコアがあり、以下の関連するSpark送信引数と同期させたいので、task.concurrencytask.writer-count、およびtask.max-worker-threads はそれぞれ4に設定されていることに注意してください。これらの値は、すべての実行プログラムのコアをビジー状態に保ち、**spark-submit** パラメータと同期させるように調整する必要があります。

Presto on Sparkを実行するには、まずSparkクラスタを起動します。ここでは、URLが *spark://spark-master:7077* であると想定します。時間のかかるクエリは、たとえば *query.sql* というファイルに保存します。先に作成した *example* ディレクトリから **spark-submit** コマンドを実行します。

/spark/bin/spark-submit \
--master spark://spark-master:7077 \
--executor-cores 4 \
--conf spark.task.cpus=4 \
--class com.facebook.presto.spark.launcher.PrestoSparkLauncher \
  presto-spark-launcher-0.289.jar \
--package presto-spark-package-0.289.tar.gz \
--config /presto/etc/config.properties \
--catalogs /presto/etc/catalogs \
--catalog hive \
--schema default \
--file query.sql

カタログの設定に関する詳細は、カタログプロパティ を参照してください。Spark送信引数では、*executor-cores*(Sparkのエグゼキュータあたりのコア数)と *spark.task.cpus*(Sparkの各タスクに割り当てるコア数)の値に注意してください。これらもコア数(この場合は4)と同じであり、上記の一部の config.properties 設定と同じです。これは、単一のPresto on Sparkタスクが単一のSparkエグゼキュータで実行されるようにするためです(この制限は一時的なものであり、タスクごとにブロードキャストされたハッシュテーブルの複製を回避するために導入されています)。