在 AWS EMR 上配置 Presto 的内存分配时遇到问题

Trouble configuring Presto's memory allocation on AWS EMR

我真的很希望在 AWS EMR 上的 ETL 管道中使用 Presto,但我无法配置它以充分利用集群的资源。这个集群将只为这个查询而存在,仅此而已,然后就死了。因此,我想通过增加 query.max-memory-per-nodequery.max-memory 来为每个节点和一个查询申请最大可用内存。我可以在配置集群时执行此操作,方法是在 AWS 控制台的集群创建视图的 "Edit software settings" 框中添加这些设置。但是 Presto 服务器没有启动,在 server.log 文件中报告一个 IllegalArgumentException,说 max-memory-per-node 超出了可用堆 space(默认情况下,对于我的实例类型和用例)。

我尝试使用会话设置 set session resource_overcommit=true,但这似乎只覆盖 query.max-内存,而不是 query.max-每个节点的内存,因为在 Presto UI,我发现每个节点上只有很少的可用内存用于查询。

通过 Google,我被引导相信我还需要通过更改 /etc/presto/conf/jvm.config 中的 -Xmx 和 -Xms 属性来增加 JVM 堆大小,但它说这里 (http://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-presto.html) 无法在集群创建阶段更改 JVM 设置。

要在 EMR 集群处于活动状态且 Presto 服务器已启动后更改这些属性,我真的必须手动 ssh 到每个节点并更改 jvm.config 和 config.properties,然后重新启动急速服务器?虽然我意识到可以通过 bootstrap 脚本或其他方式在 EMR 集群上手动安装具有自定义配置的 Presto,但这确实是一个交易破坏者。

我在这里遗漏了什么吗?有没有更简单的方法让 Presto 将所有集群分配给一个查询?

正如所宣传的那样,增加 query.max-memory-per-node 以及 -Xmx 属性 的必要性,在 Presto 已经使用默认选项启动之前,确实无法在 EMR 上实现。要增加这些,必须更改 /etc/presto/conf/ 中的 jvm.config 和 config.properties,并在每个节点(核心和协调器)上重新启动 Presto 服务器。

可以使用 bootstrap 脚本使用

这样的命令来做到这一点
sudo sed -i "s/query.max-memory-per-node=.*GB/query.max-memory-per-node=20GB/g" /etc/presto/conf/config.properties
sudo restart presto-server

/etc/presto/jvm.conf 同样如此。唯一需要注意的是,需要在 bootstrap 操作中包含仅在安装 Presto 后执行的逻辑,并且协调节点上的服务器需要最后重新启动(如果主节点可能具有不同的设置)节点的实例类型与核心节点不同)。

您可能还需要更改 resources.reserved-system-memory 的默认值,方法是在 config.properties 中为它指定一个值。默认情况下,此值为 .4*(Xmx 值),这是 Presto 为系统池申请的内存量。在我的例子中,我能够安全地减小这个值并为每个节点提供更多内存来执行查询。

其实EMR中Presto是有配置分类的。但是,请注意,这些可能会因 EMR 发布版本而异。有关每个发行版本的可用配置分类的完整列表,请访问 1 (make sure to switch between the different tabs according to your desired release version). Specifically regarding to jvm.config properties, you will see in 2 目前无法通过配置分类配置这些分类。也就是说,您始终可以根据需要手动编辑 jvm.config 文件。

A​​mazon EMR 5.x 发布版本 1

A​​mazon EMR 上 Presto 的注意事项 - 一些 Presto 部署属性不可配置: 2