在 Spark 上执行 Presto¶
Presto on Spark 使得利用 Spark 作为 Presto 查询的执行框架成为可能。这对我们想要在数千个节点上运行的查询、需要 10s 或 100s TB 内存以及消耗大量 CPU 年的查询很有用。
Spark 添加了一些有用的功能,例如资源隔离、细粒度资源管理和可扩展的物化交换机制。
步骤¶
下载 Presto Spark 包压缩包,presto-spark-package-0.289.tar.gz 和 Presto Spark 启动器,presto-spark-launcher-0.289.jar。将这两个文件保存在,比如,example 目录中。我们假设这里有一个有两个节点的 Spark 集群,每个节点有四个核心,因此我们总共有八个核心。
以下是一个示例 config.properties
task.concurrency=4
task.max-worker-threads=4
task.writer-count=4
有关属性的详细信息,请参见 属性参考。请注意 task.concurrency
、task.writer-count
和 task.max-worker-threads
都设置为 4,因为每个执行器有四个核心,我们想与下面的相关 Spark 提交参数同步。这些值应该进行调整以使所有执行器核心保持忙碌,并与 spark-submit 参数同步。
要在 Spark 上执行 Presto,首先启动 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 执行器中运行(此限制可能是暂时的,它被引入是为了避免为每个任务复制广播的哈希表)。