Spark分布式计算原理

RDD依赖以及DAG原理

1.RDD的转换

val lines=sc.textFile("/data/words.txt") //①
val count=lines.flatMap(line=>line.split(" ")) //②
.map(word=>(word,1)) //③
.reduceByKey(_+_) //④
count.collect //⑤

(1)首先从 HDFS 中读取文件,产生一个 HadoopRDD,然后进行RDD 转换,转换结果为 MapPartitionsRDD。
lines 实际上是一个MapPartitionsRDD,其父 RDD 是 HadoopRDD。
(2)flatMap 操作将 lines 中的所有行,以空格切分 ,然后返回一个单词列表,以每个单词为元素的列表保存到新的 MapPartitionsRDD。
(3)将第二行生成的 MapPartitionsRDD 再次经过 map 操作将每个单词 word 转化为(word,1)的二元组,返回一个新的 MapPartitionsRDD 包含这些元组。
(4)reduceByKey 操作会生成一个 ShuffledRDD。
(5)collect 动作将提交 Job 开始执行,到此 Application 结束

2.RDD的依赖关系
,根据子 RDD 依赖父 RDD 的分区的不同,将这种关系划分为两种:窄依赖和宽依赖
(1)窄依赖
①定义:
窄依赖指的是每一个父 RDD 的分区最多被子 RDD 的一个分区使用
②map和filter
它们只是将各个分区的数据根据转换的规则进行转化
③union
只是将多个 RDD 合并成一个,父 RDD 的分区不会有任务的变化。
④join
如果每个分区仅仅和已知的、特定的分区进行 join,那么这个依赖关系是窄依赖。
(2)宽依赖
宽依赖指的是多个子 RDD 的分区会依赖同一个父 RDD 的分区。
①join
对于需要父 RDD 的所有分区进行 join 的转换,这类 join 的依赖就是宽依赖了。
②groudByKey
子 RDD 的所有分区会依赖父 RDD 的所有分区,子 RDD 的分区是父 RDD 的所有分区 Shuffle 的结果,因此这两个 RDD 是不能通过一个计算任务来完成的。
(3)窄依赖的实现
①OneToOneDependency:一对一依赖
map、filter 操作。
②RangeDependency:范围依赖
如 union 操作。
union 操作返回 UnionRDD,UnionRDD 是把多个 RDD 合并成一个 RDD。

(4)窄依赖的实现:
ShuffleDependency

(5)宽窄依赖的对比
①宽依赖对应shuffle操作,需要在运行时将同一个父RDD的分区传入到不同的子RDD分区中,不同的分区可能位于不同的节点,就可能

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值