topByKey可扩展吗?

时间:2015-08-03 14:02:15

标签: scala apache-spark rdd

当我使用topByKey与不同的群集时,我有相同的时间来执行此代码,与我使用的从属数量无关。 RDD_distance大小介于10 ^ 8和10 ^ 12个单位之间。

        parsedData.cache

        for( ind <- 1 to maxIterForYstar  ) {

        var rdd_distance = rdd_temp.cartesian(parsedData).map{ case (x,y) => (x.get_id,(y.get_vector,-Vectors.sqdist(x.get_vector,y.get_vector))) }

        var rdd_knn_bykey = rdd_distance.topByKey(k)(Ordering[(Double)].on(x=>x._2))
    }

所以我的问题是知道topByKey是否可扩展,或者我的代码是否有问题。

1 个答案:

答案 0 :(得分:1)

以下是topByKey的实际代码:

@DeveloperApi
class MLPairRDDFunctions[K: ClassTag, V: ClassTag](self: RDD[(K, V)]) extends Serializable {
  /**
   * Returns the top k (largest) elements for each key from this RDD as defined by the specified
   * implicit Ordering[T].
   * If the number of elements for a certain key is less than k, all of them will be returned.
   *
   * @param num k, the number of top elements to return
   * @param ord the implicit ordering for T
   * @return an RDD that contains the top k values for each key
   */
  def topByKey(num: Int)(implicit ord: Ordering[V]): RDD[(K, Array[V])] = {
    self.aggregateByKey(new BoundedPriorityQueue[V](num)(ord))(
      seqOp = (queue, item) => {
        queue += item
      },
      combOp = (queue1, queue2) => {
        queue1 ++= queue2
      }
    ).mapValues(_.toArray.sorted(ord.reverse))  // This is an min-heap, so we reverse the order.
  }
}

所以这是MLPairRDDFunctions中唯一的方法。这是一个效率更高的groupByKey,只保留了每个密钥的前k个元素。

要考虑的几个问题,您可以通过研究Spark Web控制台来回答:

  • 实际执行了多少个并行任务?你可能不会使用一些额外的奴隶。
  • 真正花在哪里的时间?例如,cartesian产品实际上最贵吗?你能更有效地使用缓存吗?此外,看起来rdd_distance可以在for表达式之前计算一次,或者这只是一个简化的示例?