Spark YARN> spark.default.parallelism>从粗粒度来看,更大或更小

时间:2015-11-04 23:34:09

标签: configuration apache-spark

从Spark的粗粒度功能来看,当运行包含Join或Reduce by key等的Spark作业时,最好将spark.default.parallelism更改为一个大数字,以便许多线程可以在单个上运行并发分区?

根据我的理解,这应该没事,对吧?但缺点是这可能会使网络I / O流量繁忙。默认值是所有可用内核的数量

任何人都可以对此发表评论吗?提前谢谢

1 个答案:

答案 0 :(得分:3)

  

这样许多线程可以同时在单个分区上工作

分区是Spark中最小的并发单位。它表示每个分区一个线程。您当然可以在mapPartitions内使用并行处理,但它不是标准Spark逻辑的一部分。

当没有指定分区数时,更高的并行性意味着更多的分区。通常它是一个理想的结果,但它带来了价格。这意味着记账成本不断增加,聚合效率降低,一般而言,可以在没有序列化/反序列化和网络流量的情况下在本地处理的数据更少。当分区数量与数据量和可用核心数量相比非常高时,当分区数量增加时,它可能会成为一个严重的问题(参见Spark iteration time increasing exponentially when using join)。

增加并行性是有意义的:

  • 您拥有大量数据和大量备用资源(建议分区数是可用内核数量的两倍)。
  • 您希望减少处理单个分区所需的内存量。
  • 执行计算密集型任务。

如果增加并行性没有意义:

  • 并行度>>可用核心数量。
  • 与数据量相比,并行度较高,并且您希望当时处理多个记录(groupByreduceagg)。

一般来说,我认为spark.default.parallelism不是一个非常有用的工具,因此根据具体情况调整并行性更有意义。如果并行性太高,则在数据加载和简单转换以及性能/次优资源使用情况下,可能导致空分区。如果它太低,则在执行可能需要大量分区(连接,联合)的转换时会导致问题。