将rdd均匀分配在spark中

时间:2018-08-25 13:51:37

标签: scala apache-spark apache-spark-sql rdd partitioning

我在HDFS中有一个文本文件,其中有大约1000万条记录。我正在尝试读取文件,对该数据进行一些转换。我正在尝试对数据进行统一分区,然后再对其进行处理。这是示例代码

var myRDD = sc.textFile("input file location")

myRDD = myRDD.repartition(10000)

当我对这个重新分区的数据进行转换时,我看到一个分区的异常大量记录,而另一个分区的数据却很少。 (image of the distribution

因此,只有一名执行者负担很重 我也尝试过并得到相同的结果

myRDD.coalesce(10000, shuffle = true)

有没有一种方法可以在分区之间均匀地分配记录。

附带的是该特定执行程序上的随机读取大小/记录数 圈出的记录要比其他记录更多

任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

要解决倾斜问题,您可以使用distribution by(或使用以前的重新分区)对数据进行重新分区。对于要分割的表达式,请选择您知道将均匀分布数据的内容。

您甚至可以使用DataFrame(RDD)的主键。

即使这种方法也不能保证数据将在分区之间均匀分布。这完全取决于我们分发的表达式哈希Spark : how can evenly distribute my records in all partition

可以使用

Salting ,其中包括添加新的“假”密钥,并与当前密钥一起使用,以更好地分配数据。 (here is link for salting