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)
我的源文件号为48,大小为871.5M。这是文件信息:
这是我的“火花壳”设置:
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
实际上,该程序的运行时间很长,最多5分钟。 这是Spark Web UI的DAG可视化:
如何通过Scala优化我的Spark程序? 帮助和感谢!
答案 0 :(得分:0)
据我所知,我很确定,花费您最多时间的任务实际上是reduceByKey而不是并集,这是有道理的,因为它是随机播放的(如果您不知道随机播放的工作方式,请在评论中问我)。您可以看到在第8阶段已设置了reduce操作。 据我所知,至少与减少工会相比,工会应该真的非常快。
P.S。如果您有足够的执行程序,则应该研究treeReduce。