我在HDFS中有一个文本文件,其中有大约1000万条记录。我正在尝试读取文件,对该数据进行一些转换。我正在尝试对数据进行统一分区,然后再对其进行处理。这是示例代码
var myRDD = sc.textFile("input file location")
myRDD = myRDD.repartition(10000)
当我对这个重新分区的数据进行转换时,我看到一个分区的异常大量记录,而另一个分区的数据却很少。 (image of the distribution)
因此,只有一名执行者负担很重 我也尝试过并得到相同的结果
myRDD.coalesce(10000, shuffle = true)
有没有一种方法可以在分区之间均匀地分配记录。
附带的是该特定执行程序上的随机读取大小/记录数 圈出的记录要比其他记录更多
任何帮助,谢谢。
答案 0 :(得分:0)
要解决倾斜问题,您可以使用distribution by(或使用以前的重新分区)对数据进行重新分区。对于要分割的表达式,请选择您知道将均匀分布数据的内容。
您甚至可以使用DataFrame(RDD)的主键。
即使这种方法也不能保证数据将在分区之间均匀分布。这完全取决于我们分发的表达式哈希。 Spark : how can evenly distribute my records in all partition
可以使用Salting ,其中包括添加新的“假”密钥,并与当前密钥一起使用,以更好地分配数据。 (here is link for salting)