我真的希望在 AWS EMR 上的 ETL 管道中使用 Presto,但我在配置它以充分利用集群资源时遇到了问题。 这个集群将只为这一个查询而存在,仅此而已,然后死亡。 因此,我想通过增加query.max-memory-per-node
和query.max-memory
来声明每个节点和一个查询的最大可用内存。 在配置集群时,我可以通过在 AWS 控制台的集群创建视图的"编辑软件设置"框中添加这些设置来执行此操作。 但是 Presto 服务器没有启动,在服务器中报告.log提交 IllegalArgumentException,说每个节点的最大内存超过了可用堆空间(默认情况下,对于我的实例类型和使用案例来说太小了)。
我尝试使用会话设置set session resource_overcommit=true
,但这似乎只覆盖查询.max内存,而不是每个节点的查询.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,然后重新启动 Presto 服务器吗? 虽然我意识到可以通过引导脚本或其他东西在 EMR 集群上手动安装 Presto 和自定义配置,但这确实是一个交易破坏者。
我在这里缺少什么吗? 难道没有更简单的方法可以让 Presto 将所有集群分配给一个查询吗?
正如宣传的那样,增加query.max-memory-per-node
,并且必然-Xmx
属性,确实无法在 EMR 上实现,直到 Presto 已经开始使用默认选项之后。 为了增加这些,必须在/etc/presto/conf/中找到的 jvm.config 和 config.properties 进行更改,并且 Presto 服务器在每个节点(核心和协调器)上重新启动。
可以使用以下命令使用引导脚本来执行此操作
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。 唯一需要注意的是,需要在引导操作中包含逻辑,以便仅在安装 Presto 后执行,并且协调节点上的服务器需要最后重新启动(如果主节点的实例类型与核心节点不同,则可能使用不同的设置)。
您可能还需要通过在 config.properties 中为其指定值来更改默认值resources.reserved-system-memory
。 默认情况下,此值为 .4*(Xmx 值),这是 Presto 为系统池声明的内存量。 就我而言,我能够安全地减小此值,并为每个节点提供更多内存以执行查询。
事实上,EMR 中有可用于 Presto 的配置分类。但是,请注意,这些可能因 EMR 发布版本而异。有关每个发布版本的可用配置分类的完整列表,请访问 1(确保根据所需的发布版本在不同的选项卡之间切换)。特别是关于 jvm.config 属性,您将在 2 中看到这些属性当前无法通过配置分类进行配置。话虽如此,您始终可以根据需要手动编辑 jvm.config 文件。
亚马逊 EMR 5.x 发布版本 1
Amazon EMR 上的 Presto 注意事项 - 某些 Presto 部署属性不可配置: 阿拉伯数字