Apache spark 如何在spark中高效地分发和使用分区?

Apache spark 如何在spark中高效地分发和使用分区?,apache-spark,load-balancing,rdd,partitioning,wise,Apache Spark,Load Balancing,Rdd,Partitioning,Wise,这是我的例子 val arr = Array((1,2), (1,3), (1,4), (2,3), (4,5)) val data = sc.parallelize(arr, 5) data.glom.map(_length).collect Array[Int] = Array(1, 1, 1, 1, 1) val agg = data.reduceByKey(_+_) agg.glom.map(_.length).collect Array[Int] = Array(0, 1, 1,

这是我的例子

val arr = Array((1,2), (1,3), (1,4), (2,3), (4,5))
val data = sc.parallelize(arr, 5)

data.glom.map(_length).collect
Array[Int] = Array(1, 1, 1, 1, 1)

val agg = data.reduceByKey(_+_)
agg.glom.map(_.length).collect
Array[Int] = Array(0, 1, 1, 0, 1)

val fil = agg.filter(_._2 < 4)
fil.glom.map(_.length).collect
Array[Int] = Array(0, 0, 1, 0, 0)

val sub = data.map{case(x,y) => (x, (x,y))}.subtractByKey(fil).map(_._2)
Array[(Int, Int)] = Array((1,4), (1,3), (1,2), (4,5))

sub.glom.map(_.length).collect
Array[Int] = Array(0, 3, 0, 0, 1)
经过几次
转换操作后
,只使用分配给
子变量的五个分区中的两个

sub
变量由五个分区组成,但并非所有数据都是均匀分区的

ex)par1: (1,2)
   par2: (1,3)
   par3: (1,4)
   par4: (2,3)
   par5: (4,5)
ex)par1: empty
   par2: (1,2),(1,3),(1,4)
   par3: empty
   par4: empty
   par5: (4,5)
如果我向
sub
变量添加另一个
transformation操作
,则将有5个可用分区,但操作只使用2个分区

ex)sub.map{case(x,y) => (x, x, (x,y))}
所以我想在操作数据时使用所有可用的分区

我使用了
重新分区
方法,但并不便宜

ex) sub.repartition(5).glom.map(_.length).collect
Array[Int] = Array(0, 1, 1, 2, 0)
因此,我正在寻找一种明智的方法来尽可能多地利用分区


有什么好办法吗?

所以
重新分区
绝对是一条好办法:)

您的示例有点太简单,无法演示任何内容,因为Spark的构建是为了处理数十亿行,而不是5行<代码>重新分区
不会将完全相同数量的行放入每个分区,但会均匀地分布数据。尝试用1.000.000行来重做您的示例,您将看到数据在
重新分区后确实是均匀分布的

在处理大量数据的转换时,数据倾斜通常是一个大问题,重新划分数据确实需要额外的时间,因为它需要重新排列数据。不过,有时候值得接受惩罚,因为这会使以下转换阶段运行得更快