Scala 在RDD中查找元素的另一种更快的方法是什么
我是Scala和Spark的新手。这是我全部代码的一个简单示例: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)]] = {
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倍的分区值