一、RDD依赖与DAG原理
Spark根据计算逻辑中的 RDD的转换与动作生成 RDD的依赖关系,同时这个计算链也形成了逻辑上的 DAG。
1.1 RDD的转换
e.g.(以wordcount为例)
package spark
import org.apache.spark.{SparkConf,SparkContext}
object WordCount{
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("WordCount").setMaster("local[1]")
val sc = new SparkContext(conf)
val rdd = sc.textFile("hdfs://192.168.182.130:9000/test/word.txt")
val result=rdd.flatMap(_.split("\\s")).map((_, 1)).reduceByKey(_ + _)
result.collect().foreach(println)
println("--------------------------")
println(result.toDebugString)
}
}
"C:\Program Files\Java\jdk1.8.0_231\bin\java.exe" ...
(scala,2)
(hadoop,1)
(python,2)
(word,2)
(hello,2)
(class,1)
(java,1)
--------------------------
(1) ShuffledRDD[4] at reduceByKey at WordCount.scala:18 []
+-(1) MapPartitionsRDD[3] at map at WordCount.scala:18 []
| MapPartitionsRDD[2] at flatMap at WordCount.scala:18 []
| hdfs://192.168.182.130:9000/test/word.txt MapPartitionsRDD[1] at textFile at WordCount.scala:16 []
| hdfs://192.168.182.130:9000/test/word.txt HadoopRDD[0] at textFile at WordCount.scala:16 []
Process finished with exit code 0
- 首先从HDFS中读取文件,产生一个HadoopRDD;然后进行RDD转换,转换结果为MapPartitionsRDD。也就是说,rdd实际上是一个MapPartitionsRDD,其父RDD是HadoopRDD;
- flatMap操作将 lines中的所有行,以空格切分 ,然后返回一个单词列表,以每个单词为元素的列表保存到新的 MapPartitionsRDD;
- 将第二行生成的MapPartitionsRDD再次经过map操作将每个单词 word转化为 (word,1)的二元组,返回一个新的 MapPartitionsRDD包含这些元组;
- reduceByKey操作会生成一个ShuffledRDD;
- collect动作将提交Job开始执行,到此Application结束;
Tips:result.toDebugString”实现了上述 RDD转换过程的验证
PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!
原创作者:wsjslient |