我是Spark的新手。我有两个RDD,其中一个大小为9 GB(4亿行)(RDD1),另一个为110 KB(400万行)(RDD2)。我使用RDD2作为广播变量来减少混洗过程。我的代码可以工作,但对于reduceByKey部分来说,它太慢了。
我一直在玩分区号码。如果我为两个RDD设置了10,000个分区,它就会开始溢出。所以我把它增加到20K,30K和100K。它停止溢出,但它非常慢。另一方面,我用过 设置(“spark.akka.frameSize”,“1000”),但它没有成功。我怎么能改进这段代码?
这是我的代码:
val conf = new SparkConf().setAppName("abdulhay").setMaster("local[*]").set("spark.shuffle.spill", "true")
.set("spark.shuffle.memoryFraction", "0.4")
.set("spark.executor.memory","128g")
.set("spark.driver.memory","128g")
val sc = new SparkContext(conf)
val emp = sc.textFile("\\.txt",30000)...RDD1
val emp_new = sc.textFile("\\.txt",10000)...RDD2
val emp_newBC = sc.broadcast(emp_new.groupByKey.collectAsMap)
val joined = emp.mapPartitions(iter => for {
(k, v1) <- iter
v2 <- emp_newBC.value.getOrElse(k, Iterable())
} yield (s"$v1-$v2", 1))
val olsun = joined.reduceByKey((a,b) => a+b)