2

当我建立一个 Presto 集群并尝试进行一些性能调整时,我想知道是否有更全面的 Presto 配置指南,例如如何控制 Presto worker 可以使用多少 CPU 内核。如果我在单个服务器上启动多个 presto 工作人员(在这种情况下我不需要专用服务器来运行协调器),这是一种好习惯吗?

此外,我不太了解 task.max-memory 参数。presto worker 会为单个查询启动多个任务吗?如果是,也许我可以将 task.max-memory 与 -Xmx JVM 参数一起使用来控制并行度?

提前致谢。

4

3 回答 3

13

Presto 是一个多线程 Java 程序,在处理查询时努力使用所有可用的 CPU 资源(假设输入表足够大以保证这种并行性)。您可以使用 cgroups、CPU 亲和性等人为地限制 Presto 在操作系统级别使用的 CPU 资源量。

在一台机器上启动多个 Presto 工作器没有任何理由或好处。您不应该这样做,因为它们将不必要地相互竞争资源,并且可能比单个进程执行得更差。

我们在拥有 50 多台机器的部署中使用专用协调器,因为我们发现让协调器处理查询会在它执行查询协调工作时减慢它的速度,这会对整体查询性能产生负面影响。对于小型集群,专用一台机器进行协调可能是一种资源浪费。您需要对自己的集群设置和工作负载进行一些实验,以确定哪种方式最适合您的环境。

您可以让单个 Presto 进程同时充当协调器和工作器,这对于小型集群或测试目的很有用。为此,请将其添加到etc/config.properties文件中:

coordinator=true
node-scheduler.include-coordinator=true

您在与工作进程共享的机器上启动专用协调进程的想法很有趣。例如,在具有 16 个处理器的机器上,您可以使用 cgroups 或 CPU 亲和性将 2 个内核专用于协调进程,并将工作进程限制为 14 个内核。我们从未尝试过,但对于小型集群来说,这可能是一个不错的选择。

任务是在工作人员上运行的查询计划中的一个阶段(CLI 会在查询运行时显示阶段列表)。对于像这样的查询SELECT COUNT(*) FROM t,每个工作上都会有一个任务来执行表扫描和部分聚合,而单个工作人员上会有另一个任务来进行最终聚合。具有连接、子查询等的更复杂的查询可能会导致每个工作节点上的多个任务用于单个查询。

于 2013-11-18T07:02:48.323 回答
0

-Xmx 必须高于 task.max-memory,或至少相等。否则你可能会看到 OOM 问题,就像我之前经历过的那样。而且,自 Presto-0.113 以来,他们改变了 Presto 管理查询内存和相应配置的方式。请参考此链接: https ://prestodb.io/docs/current/installation/deployment.html

于 2016-11-09T17:27:11.067 回答
0

对于您关于“Presto 工作人员可以使用的许多 CPU 内核”的问题,我认为它由参数控制task.concurrency,默认情况下为 16

于 2017-12-09T19:23:56.763 回答