从Spark的粗粒度功能来看,当运行包含Join或Reduce by key等的Spark作业时,最好将spark.default.parallelism更改为一个大数字,以便许多线程可以在单个上运行并发分区?
根据我的理解,这应该没事,对吧?但缺点是这可能会使网络I / O流量繁忙。默认值是所有可用内核的数量
任何人都可以对此发表评论吗?提前谢谢
答案 0 :(得分:3)
这样许多线程可以同时在单个分区上工作
分区是Spark中最小的并发单位。它表示每个分区一个线程。您当然可以在mapPartitions
内使用并行处理,但它不是标准Spark逻辑的一部分。
当没有指定分区数时,更高的并行性意味着更多的分区。通常它是一个理想的结果,但它带来了价格。这意味着记账成本不断增加,聚合效率降低,一般而言,可以在没有序列化/反序列化和网络流量的情况下在本地处理的数据更少。当分区数量与数据量和可用核心数量相比非常高时,当分区数量增加时,它可能会成为一个严重的问题(参见Spark iteration time increasing exponentially when using join)。
增加并行性是有意义的:
如果增加并行性没有意义:
groupBy
,reduce
,agg
)。一般来说,我认为spark.default.parallelism
不是一个非常有用的工具,因此根据具体情况调整并行性更有意义。如果并行性太高,则在数据加载和简单转换以及性能/次优资源使用情况下,可能导致空分区。如果它太低,则在执行可能需要大量分区(连接,联合)的转换时会导致问题。