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行来重做您的示例,您将看到数据在重新分区后确实是均匀分布的
在处理大量数据的转换时,数据倾斜通常是一个大问题,重新划分数据确实需要额外的时间,因为它需要重新排列数据。不过,有时候值得接受惩罚,因为这会使以下转换阶段运行得更快