Scala 火花接头很重

Scala 火花接头很重,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我的源文件号是48,大小是871.5M。这是文件的信息: 这是我的spark shell设置: val billRDD = sc.textFile("file/cdr/*/2018/07/27/20/*").map(line => line.split("\\|")) val areaCodeAll: RDD[((String, String, String), List[List[String]])] = billRDD.repartition(24).map(x=>((x(76

我的源文件号是48,大小是871.5M。这是文件的信息:

这是我的spark shell设置:

val billRDD = sc.textFile("file/cdr/*/2018/07/27/20/*").map(line => line.split("\\|"))
val areaCodeAll: RDD[((String, String, String), List[List[String]])] = billRDD.repartition(24).map(x=>((x(76),x(77),x(78)),List(x(3),x(53),x(54),x(20),x(44),x(61),x(62),x(22),x(63),x(24),x(64),x(65),x(47),x(48),x(60),x(68),x(67))))
  .combineByKey(
    (v: List[String]) => List(v),
    (c:List[List[String]],v:List[String]) => v +: c,
    (c1:List[List[String]],c2:List[List[String]]) => List.concat(c1,c2)
  )
areaCodeAll.cache()
val provinceAll = areaCodeAll.map(x => (x._1._1,x._2)).filter(_._1!="-1").reduceByKey(_:::_)
val cityAll = areaCodeAll.map(x => (x._1._2,x._2)).filter(_._1!="-1").reduceByKey(_:::_)
val countyAll = areaCodeAll.map(x => (x._1._3,x._2)).filter(_._1!="-1")
val dataByAreaCode = provinceAll.union(cityAll).union(countyAll)
实际上,这个程序的运行时间很长,最长可达5分钟 这是Spark web UI中的DAG可视化:

程序始终停留在最后一个任务:

如何使用scala优化我的spark程序
帮帮忙,谢谢

据我所见,我很确定你花时间最多的任务实际上是reduceByKey,而不是工会,这是有道理的,因为这是一种洗牌(如果你不知道洗牌是如何工作的,请在评论中问我)。您可以看到reduce操作设置在第8阶段。 据我所知,工会应该真的很快,至少当与减少相比

另外,如果你有足够的遗嘱执行人,你应该调查treeReduce

spark-shell --master yarn-client spark.default.parallelism=600 --conf spark.rdd.compress=true  --queue=queue_qoezy --num-executors 48 --executor-cores 4 --executor-memory 16g --driver-memory 8g --conf spark.serializer=org.apache.spark.serializer.KryoSerializer