Scala 在RDD中查找元素的另一种更快的方法是什么

Scala 在RDD中查找元素的另一种更快的方法是什么,scala,apache-spark,rdd,lookup,Scala,Apache Spark,Rdd,Lookup,我是Scala和Spark的新手。这是我全部代码的一个简单示例: package trouble.something import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object Stack { def ExFunc2(looku: RDD[(Int, List[(Double, Int)])], ke: Int): Seq[List[(Double, Int)]] = {

我是Scala和Spark的新手。这是我全部代码的一个简单示例:

package trouble.something

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Stack {
  def ExFunc2(looku: RDD[(Int, List[(Double, Int)])], ke: Int): Seq[List[(Double, Int)]] = {
    val y: Seq[List[(Double, Int)]] = looku.lookup(ke)
    val g = y.map{x =>
      x
      /* some functions here
      .
      .
       */
    }
    g
  }

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("toy")
    val sc = new SparkContext(conf)

    val pi: RDD[(Int, List[(Double, Int)])] = sc.parallelize(Seq((1, List((9.0, 3), (7.0, 2))), (2, List((7.0, 1), (1.0, 3))), (3, List((1.0, 2), (9.0, 1)))))
    val res = ExFunc2(pi, 1)
    println(res)
  }
}
我运行的数据足够大,需要更快的性能。通过查看Spark的web UI和软件探查器。最耗时的是
lookup()
函数:

 val y: Seq[List[(Double, Int)]] = looku.lookup(ke)
在RDD中查找元素而不是
lookup()
函数的替代方法是什么


有一个与这个问题有关的讨论。但是,它没有给我任何想法。

如果您仔细地使用和缩放查找功能,它不应该有性能问题

def查找(键:K):Seq[V]

返回RDD中键的值列表。如果RDD有一个已知的分区器,则只需搜索键映射到的分区,即可有效地完成此操作

默认情况下,生成PairRdd的函数使用HashPartitioner。因此,请检查您的
spark.default.parallelism
值设置为多少,因为这是所需的分区数。您可以调整该参数,使其与正在使用的每个执行器的内核数相匹配

您应该确认pairdd确实有一个已知的分区器,如果没有,请使用
partitionBy
创建一个分区器,或者在创建pairdd时修改现有代码以使用HashPartitioner

let parallelismFactor=#执行器的数量*#每个执行器的内核数量

然后,如果查找函数仍然太慢,则需要增加正在使用的
parallelismFactor
。现在spark将知道在哪个分区中查找,并且随着您增加
parallelismFactor
,您将减少每个分区的大小,这将提高查找的速度

请记住,您可能希望拥有比
executors*cores
多出许多倍的分区,您必须自己对用例进行基准测试,尝试比
executors*cores
多出1-10倍的分区值