PySpark 添加执行器使应用程序变慢
Posted
技术标签:
【中文标题】PySpark 添加执行器使应用程序变慢【英文标题】:PySpark adding executors makes app slower 【发布时间】:2018-01-13 02:31:54 【问题描述】:每当我添加超过 10 个执行器时,我的工作就会开始变得慢很多。超过 15 个执行者和我的工作开始崩溃。我通常每个执行器使用 4 个内核,但尝试了 2-5 个。我正在使用纱线和 PySpark 2.1。 我收到的错误:
ERROR TransportRequestHandler: 发送结果 RpcResponse 出错
警告 NettyRpcEndpointRef:发送消息时出错
Future 在 [10 秒] 后超时
我读到大多数人都得到这个错误成为 OOM 错误,但这不在我的任何地方的 stderr 日志中。我尝试将 spark.executor.heartbeatInterval 更改为 30s,这使得 Future 超时警告消息的频率降低,但结果是相同的。
我尝试使用从 30 到 1000 的不同数量的分区来获得更好的结果。我尝试将我的执行程序内存增加到 10g,即使我认为这不是问题。我尝试过使用只有几兆字节的小数据集到 50gb 的大数据集。我唯一能让很多执行者工作的时候是当我做一个非常简单的工作时,比如读入文件并将它们写到其他地方。在这种情况下,执行者不必交换数据,所以我想知道这是否是问题所在。我进行任何聚合或收集或基本上我尝试的任何其他工作的所有其他工作都会给我同样的错误,或者至少执行速度极慢。我只是希望有一些其他的建议可以尝试。
【问题讨论】:
您是否验证了所有执行器机器都能够通过网络进行通信,并且其他机器上没有设置差异?过去曾出现过此类问题,它们是由网络和防火墙问题引起的。 我认为这可能是某种网络设置,但大型配置单元查询工作正常,而且问题仅在使用超过 10 个执行程序时才开始出现,这似乎很奇怪。不过,我会尝试进一步研究网络设置问题,谢谢。 【参考方案1】:在分配资源的过程中,主要是查看集群的硬件设置。最佳配置是一件非常棘手的事情。
-
节点数
VCores
每个内存
根据这3个,您必须决定以下内容
-
执行者人数
执行器核心
执行器内存
大多数情况下,将 --executor-cores 设置为超过 5 会降低性能。因此,将其设置为 5。
设置 num-executors = [Number of Nodes * (VCores - 1) / executor-cores] - 1
这背后的简单规则是留出一个核心用于 Yarn/Hadoop 守护进程和一个执行器用于 AppMaster。
设置 executor-memory = [(M - 1) * (VCores - 1) / executor-cores] * (1 - 0.07)
这里,0.07 是你必须留出的堆外内存。
同样,此公式并非一成不变,因此请根据您的用例进行设置。这些只是我遵循的一些通用规则。
希望,这会有所帮助。
【讨论】:
我已经了解了大部分资源分配并尝试了多种变体。我发现我的问题只发生在通过 Jupyter 笔记本使用 PySpark 时。以上是关于PySpark 添加执行器使应用程序变慢的主要内容,如果未能解决你的问题,请参考以下文章