Apache spark 200个默认分区的spark.sql.shuffle.partitions难题

Apache spark 200个默认分区的spark.sql.shuffle.partitions难题,apache-spark,Apache Spark,在许多帖子中都有这样一种说法——如下所示,以某种形式出现——这是由于一些关于洗牌、分区、加入、AGGR等的问题: 。。。通常,每当您执行sparksql聚合或join来洗牌数据时,这是结果分区的数量=200。 这是由spark.sql.shuffle.partitions设置的 所以,我的问题是: 我们的意思是,例如,如果我们将DF的分区设置为765, 处理是针对765个分区进行的,但输出是合并/重新分区的,标准为200-这里指的是单词结果 还是在合并/重新分区到200个分区之后,在加入AG

在许多帖子中都有这样一种说法——如下所示,以某种形式出现——这是由于一些关于洗牌、分区、加入、AGGR等的问题:

。。。通常,每当您执行sparksql聚合或join来洗牌数据时,这是结果分区的数量=200。 这是由spark.sql.shuffle.partitions设置的

所以,我的问题是:

  • 我们的意思是,例如,如果我们将DF的分区设置为765,
    • 处理是针对765个分区进行的,但输出是合并/重新分区的,标准为200-这里指的是单词结果
    • 还是在合并/重新分区到200个分区之后,在加入AGGR之前使用200个分区进行处理
我问,因为我从来没有看到一个明确的观点

我做了以下测试:

// genned ad DS of some 20M short rows
df0.count
val ds1 = df0.repartition(765)
ds1.count
val ds2 = df0.repartition(765)
ds2.count

sqlContext.setConf("spark.sql.shuffle.partitions", "765")
// The above not included on 1st run, the above included on 2nd run.

ds1.rdd.partitions.size
ds2.rdd.partitions.size

val joined = ds1.join(ds2, ds1("time_asc") === ds2("time_asc"), "outer") 
joined.rdd.partitions.size
joined.count
joined.rdd.partitions.size
在第1次测试中-未定义sqlContext.setConf(“spark.sql.shuffle.partitions”,“765”),处理和num分区的结果是200。即使45704156后声明它可能不适用于DFs-这是DS


在第二次测试中,定义sqlContext.setConf(“spark.sql.shuffle.partitions”,“765”),得到的处理和num分区数是765。即使45704156后声明它可能不适用于DFs-这是DS

Spark.sql.shuffle.partitions是一个参数,它决定在执行诸如连接或聚合之类的混洗时的分区数量,即数据在节点之间的移动位置。另一部分spark.default.parallelism将根据您的数据大小和最大块大小进行计算,以HDFS为单位为128mb。因此,如果您的作业不做任何洗牌,它将考虑默认的并行性值,或者如果您使用RDD,则可以自行设置。当洗牌发生时,需要200

Val df=sc.parallelize(列表(1,2,3,4,5),4).toDF() df.count()//这将使用4个分区

Val df1=df
df1.except(df).count//将生成200个具有两个阶段的分区

这是两种猜测的组合

假设您有一组具有M个分区的输入数据,并将shuffle分区设置为N

执行连接时,spark读取所有M个分区中的输入数据,并根据N个分区的键重新洗牌数据。想象一个普通的hashpartitioner,应用在键上的hash函数看起来很像a=hashcode(key)%N,然后这些数据被重新分配给负责处理Ath分区的节点。每个节点可以负责处理多个分区

洗牌后,节点将在其负责的分区中聚合数据。由于此处不需要进行额外的洗牌,因此节点可以直接生成输出


总之,您的输出将合并到N个分区,但是合并是因为它是在N个分区中处理的,而不是因为spark应用了一个额外的洗牌阶段来专门将您的输出数据重新分区到N。

但我给出了765个分区的示例。我提到这一点是因为在许多帖子中都有含糊不清的地方,而且这个问题一再出现。今晚我将运行一个测试,它将返回。让我试试765。我用同样的示例尝试了765个分区,第一个实例使用减号查询,它生成了766个任务。每个分区765个任务,另外一个用于合并最终结果。然后,使用except生成了1166个任务。765个任务映射分区,200个任务分别用于另外2个阶段的洗牌和1个阶段的组合,这是一个更好的洞察。我会做一个额外的测试,晚饭后回来。当然,请让我知道你的观察765只是我决定的一个数字。什么是45704156stackoverflow post 4。。。。