无法在AWS EMR

时间:2017-05-24 01:04:39

标签: amazon-web-services emr amazon-emr presto

我真的希望在AWS EMR上的ETL管道中使用Presto,但我在配置它时无法充分利用群集的资源。这个集群只存在于这一个查询中,仅此而已。因此,我想通过增加query.max-memory-per-nodequery.max-memory为每个节点和一个查询声明最大可用内存。我可以通过在"编辑软件设置"中添加这些设置来配置群集。 AWS控制台中的群集创建视图的框。但Presto服务器无法启动,在server.log文件中报告IllegalArgumentException,表示每个节点的max-memory超过了可用的堆空间(默认情况下,它对我的​​实例类型来说太小了,用例)。

我曾尝试使用会话设置set session resource_overcommit=true,但这似乎只会覆盖query.max-memory,而不是query.max-memory-per-node,因为在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将所有群集分配给一个查询?

2 个答案:

答案 0 :(得分:4)

正如所宣传的那样,在Presto已经开始使用默认选项之前,增加query.max-memory-per-node,并且还必须增加-Xmx属性,实际上无法在EMR上实现。要增加这些,必须更改/ 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为系统池声明的内存量。在我的例子中,我能够安全地减少这个值,并为每个节点提供更多的内存来执行查询。

答案 1 :(得分:0)

事实上,EMR中有Presto可用的配置分类。但是,请注意,这些内容可能会因EMR发行版本而异。有关每个发行版可用配置分类的完整列表,请访问1(确保根据所需的发行版在不同的选项卡之间切换)。特别是关于jvm.config属性,您将在2中看到这些当前无法通过配置分类进行配置。话虽如此,您始终可以根据需要手动编辑jvm.config文件。

Amazon EMR 5.x发行版本 1

有关Amazon EMR上Presto的注意事项-一些Presto部署属性不可配置: 2