import org.apache.spark.rdd.RDD
val lines: RDD[String] = sc.parallelize(List("A B C","A B D"),3)
//切分压平
val words: RDD[String] = lines.flatMap(_.split(" "))
//将单词和1组合
val wordAndOne: RDD[(String, Int)] = words.map((_, 1))
val reduced: RDD[(String, Int)] = wordAndOne.reduceByKey((x, y) => {
val z = x + y
z
})
//排序
val sorted: RDD[(String, Int)] = reduced.sortBy(_._1, true)
// val sorted: RDD[(String, Int)] = reduced.sortByKey(true)
val array = sorted.collect();
惊讶发现执行sortBy就开始工作了,所以sortBy也是action
先看第一个job 即job-0,sortByKey触发的
job-0分成两个阶段,由于reduceByKey宽依赖来划分的(是否宽依赖都会shuffle?),阶段一用时2s,shuffle 写入,阶段二0.2s,shuffle读,阶段1执行完才会执行阶段2
job-0 -- stage-0
executor上的task time是所执行task的总和,不代表executor的实际运行时间
job-0 -- stage-1
各阶段总耗时在下图可以看到
第二个job 及collect action
由于第一个阶段,在前一个job执行时阶段结果已经write到磁盘中,所以直接跳过,初始rdd时给了三个分片,后续没有做重分区,所以每个阶段都是三个分片,对应三个任务