PySpark添加执行程序会使应用程序变慢

时间:2018-01-13 02:31:54

标签: apache-spark pyspark

每当我添加10个以上的执行器时,我的工作开始变慢。超过15个执行者和我的工作开始崩溃。我通常每个执行器使用4个核心,但尝试过2-5。我正在使用纱线和PySpark 2.1。 我收到的错误:

错误TransportRequestHandler:发送结果RpcResponse

时出错

警告NettyRpcEndpointRef:发送消息错误

未来[10秒]后超时

我已经读过大多数人都会将此错误变成OOM错误,但这不是我的stderr日志中的任何地方。我已经尝试将spark.executor.heartbeatInterval更改为30s,这使得Future timed out警告消息不那么频繁,但结果是一样的。

我尝试使用30到1000之间不同数量的分区来获得更好的结果。我已经尝试将执行程序内存增加到10g,即使我不认为这是问题。我尝试使用只有几兆字节的小型数据集到50gb的较大数据集。我可以让很多执行程序工作的唯一一次是我正在做一个非常简单的工作,比如读取文件并将它们写在其他地方。在这种情况下,执行程序不必交换数据,所以我想知道是否存在问题。我做任何聚合或收集的其他工作,或者我尝试的其他任何工作给我带来了相同的错误,或者至少执行速度非常慢。我只是希望有其他建议可以尝试。

1 个答案:

答案 0 :(得分:0)

在分配资源期间,您必须主要查找群集的硬件设置。最佳配置是一件非常棘手的事情。

  1. 节点数
  2. VCores
  3. 每个内存
  4. 根据这些3,你必须决定以下

    1. NUM-执行人
    2. 执行-芯
    3. 执行存储器
    4. 大多数情况下,将 - executor-cores 设置为 5 ,会降低性能。所以,将它设置为5.

      设置 num-executors = [{节点数*(VCores - 1)} / executor-cores] - 1

      这背后的简单规则是将一个Core for Yarn / Hadoop守护进程一个执行者用于AppMaster

      设置 executor-memory = [(M-1)* {(VCores - 1)/ executor-cores}] *(1 - 0.07)

      这里,0.07是你必须留出的Off Heap Memory。

      同样,这个公式无处可见,因此请根据您的使用情况进行设置。这些只不过是我遵循的一些通用规则。

      希望,这有帮助。