增加 spark.executor.cores 是否会使改组速度更快

Mor*_*sss 2 apache-spark

假设我们固定了一个 spark 作业的总内核数和总内存大小,并且输入数据中有很多分区。比较这两种配置:

  • 100个执行器,每个执行器10G内存和1个内核
  • 20个执行器,50G内存,每个执行器5核

这是我的问题:

  1. 有时我发现 NODE_LOCAL 任务从网络而不是内存/磁盘获取输入,这是否真的意味着同一台机器上的两个执行程序进程之间的通信?
  2. 如果 1 为真,第二个是否会更快,因为改组可以更“本地处理”?
  3. 如果只有地图任务,第二个会和第一个一样快吗?
  4. 我可以说#executor和之间的主要权衡#executor cores是 IO 吗?

谢谢

Arv*_*mar 5

一季度。有时我发现 NODE_LOCAL 任务从网络而不是内存/磁盘获取输入,这是否真的意味着同一台机器上的两个执行程序进程之间的通信?

NODE_LOCAL 任务可能会从同一节点中的其他执行程序获取输入,或者需要从 HDFS、缓存等系统中检索输入。是的,NODE_LOCAL 任务意味着同一节点中的两个执行程序进程之间的通信。RACK_LOCAL 意味着数据在另一个节点中,因此需要在执行前传输。

Q2.如果 1 为真,第二个是否会更快,因为 shuffle 可以更“处理本地”?

  • 100个执行器,每个执行器10G内存和1个内核
  • 20个执行器,50G内存,每个执行器5核

    1 是正确的,但决定哪个选项更快取决于几个因素(#of executors vs # of executor-cores)。

Spark-提交内存参数,例如“执行程序数”和“执行程序核心数”属性会影响 Spark 可以缓存的数据量,以及用于分组、聚合和连接的 shuffle 数据结构的最大大小。运行内存过多的执行程序通常会导致垃圾收集延迟过多。

cores 属性控制执行程序可以运行的并发任务数。已经观察到每个执行器五个任务可以实现完整的写入吞吐量。每个执行器的大量内核会导致HDFS I/O 吞吐量,从而显着降低应用程序的速度。

而运行具有单个内核和更少内存的执行程序会放弃在单个 JVM 中运行多个任务所带来的好处。例如,广播变量需要在每个 executor 上复制一次,因此许多小的 executor 将导致更多的数据副本。

为了优化 Spark 的内存消耗,确定你的数据集需要多少内存。为此你可以创建一个 DataFrame,缓存它并在 Spark UI 的存储选项卡中检查数据集大小。基于数据集大小和操作类型,你可以推导出最佳数量的执行器和内核。

或者- 您可以通过打开动态分配来避免设置所有这些内存属性使用 spark.dynamicAllocation.enabled 属性使 Spark 应用程序能够在有待处理任务积压时请求执行程序,并在空闲时释放执行程序。

Q3。如果只有地图任务,第二个会和第一个一样快吗?

也许是吧。根据 Cloudera 的建议。第二种选择比第一种好,但它取决于数据集的大小。

Q4.我可以说#executor 和#executor 核心之间的主要权衡是IO 吗?

对此不确定,但建议拥有与数据节点一样多的执行器以及从集群中获得的尽可能多的内核。