如何在RDD分区上平衡负载?

时间:2019-05-25 07:50:55

标签: scala apache-spark

我正在从文件中读取附加了ID的元素,并将其放入RDD中。然后,我将该RDD划分为多个部分,这些部分等于我发现的不同键的数量。每个键代表分区号: [(k1, v1), (k2, v2), (k3, v3), (k1, v4), (k1, v5), (k1, v6)]-> 3个不同的键,然后是3个分区:分区1有4个元素,分区2和3有1个元素。 数据分布不均,因此我想设置一个阈值来指示何时必须将数据发送到另一个分区,例如treshold = 3,则分区1最多可以包含3个元素,因此一个元素必须发送到另一个分区。我该如何实现?

我想避免完全重新分区,因为在我的应用程序中,具有相同键的元素必须属于同一分区,这一点很重要。但是,某些键非常频繁,而另一些则很少。这些严重不平衡的分区并不方便。

这就是我的分区方式

val partitionedRDD = rdd.partitionBy(new PointPartitioner(
     rdd.keys.distinct().count().asInstanceOf[Int]))

这是PoinPartitioner类

class PointPartitioner(numParts: Int) extends org.apache.spark.Partitioner{

import org.apache.spark.Partitioner
  override def numPartitions: Int = numParts

  override def getPartition(key: Any): Int = {
    key.hashCode % numPartitions
  }

  override def equals(other: Any): Boolean = other match
  {
    case dnp: PointPartitioner =>
      dnp.numPartitions == numPartitions
    case _ =>
      false
  }
}

0 个答案:

没有答案