Spark分布式计算原理

一、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

作者主页:https://blog.csdn.net/wsjslient


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值