apache-spark - 增加 spark.executor.cores 会加快洗牌速度吗

标签 apache-spark

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

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

这是我的问题:

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

谢谢

最佳答案

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

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

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

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

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

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

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

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

要优化 Spark 的内存消耗,请确定您的数据集需要多少内存。为此,您可以创建一个 DataFrame,将其缓存并在 Spark UI 的“存储”选项卡中检查数据集大小。基于数据集大小和类型操作,您可以获得最佳数量的执行器和内核。

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

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

可能是的。根据 Cloudera 的建议。第二个选项比第一个好,但它取决于数据集大小。

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

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

关于apache-spark - 增加 spark.executor.cores 会加快洗牌速度吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40689193/

相关文章:

apache-spark - Spark 提交无法连接

java - 如何正确处理 spark.sql.AnalysisException

apache-spark - 如何将稀疏向量的 Spark DataFrame 列转换为密集向量列?

apache-spark - Spark RDD 上的惰性 foreach

scala - 如何在 Scala 中从 Spark 检索和更新 HBase 表

java - 包含 Spark 以避免巨大的依赖关系

caching - 持久化/缓存 RDD 上的 Spark RDD 检查点执行 DAG 两次

scala - Spark 斯卡拉: Pass a sub type to a function accepting the parent type

apache-spark - Spark-Shell 启动错误

java - Spark : Merging 2 columns of a DataSet into a single column