PySpark加入执行人,使应用程序变慢(PySpark adding executors make

2019-10-30 01:15发布

每当我添加超过10个执行人我的工作开始变得慢了很多。 大于15个执行人,我的工作开始崩溃。 我一般用每执行4个核心,但已尝试2-5。 我使用的纱线和PySpark 2.1。 错误我收到:

ERROR TransportRequestHandler:发送错误结果RpcResponse

WARN NettyRpcEndpointRef:发送邮件时出错

未来超时后[10秒]

我已阅读,大多数人得到的OOM错误,这个错误变得但这不是我的标准错误日志中的任何地方。 我试图改变spark.executor.heartbeatInterval到30秒,这让未来超时警告信息那么频繁,但结果是一样的。

我曾经想取得更好的成绩使用不同数量的不同,从30到1000的分区我曾尝试增加我的执行内存到10g,即使我不认为这是问题。 我一直在使用仅几兆的小数据集,以更大的50GB的数据集尝试。 我唯一一次可以得到很多执行人的工作是当我在做一个很简单的工作怎么样读文件,写在别的地方。 在这种情况下,执行者不必交换数据,所以我不知道是否在某种程度上这就是问题所在。 所有其他的工作,我做任何聚集或收集或基本上什么我试着给我同样的错误,或者至少非常缓慢执行。 我只是很希望有一些其他的建议,我可以试试。

Answer 1:

在分配资源的时候,你必须寻找主要群集的硬件设置。 最佳的配置是相当的棘手的事情。

  1. 节点数
  2. VCores
  3. 记忆中的每个

根据这3个,你必须决定以下

  1. NUM-执行人
  2. 执行,内核
  3. 执行记忆

大多数时候,--executor-核心建立5个以上,使性能下降。 所以,将其设置为5。

NUM-执行人= [{节点*数(VCores - 1)} /执行器型磁芯] - 1

这背后的简单规则预留纱/ Hadoop守护进程一个核心 和AppMaster一个执行者

设定执行程序存储器= [(M - 1)* {(VCores - 1)/执行器型磁芯}] *(1 - 0.07)

在这里,0.07是,你必须抛开关堆内存。

同样,这个公式是无处铭刻在石头所以要根据你的使用情况进行设置。 这些都不算什么,但我遵循一些通用规则。

希望这可以帮助。



文章来源: PySpark adding executors makes app slower