我真的希望在AWS EMR上的ETL管道中使用Presto,但我在配置它时无法充分利用群集的资源。这个集群只存在于这一个查询中,仅此而已。因此,我想通过增加query.max-memory-per-node
和query.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将所有群集分配给一个查询?
答案 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)