3. Spark逻辑处理流程

1. 逻辑处理流程概览

1).  数据模型

  1. RDD只是一个逻辑概念,在内存中并不会真正为RDD 分配存储空间(除非这个RDD 需要被缓存)。RDD 只会在计算中产生,计算结束后就会消失。
  2. RDD 可以包含多个分区,不同分区的数据由不同的任务(task) 在不同的节点上产生。

Spark 将RDD 的操作分为两种:transformation() 操作和 action() 操作。两者的区别是: action() 是一种后处理(post-processing), 产生输出结果,而且会触发Spark 提交job 真正执行数据处理任务。transformation 隐含了一种单向操作,也就是RDD 使用了 transformation 操作后,只能生成新的RDD, 而不能修改原RDD。

如何确定新生成RDD 的分区个数呢?新生成RDD 的分区个数,由用户和 parent RDD 共同决定,在一些 transformation() 操作中,如 join() 操作,用户可以指定RDD 的分区个数,如果不指定的话,就取parent RDD 的最大分区数。还有一些操作,如 map() 操作,其生成RDD 的分区个数跟源RDD 的分区个数相同。

RDD 分区中数据的依赖关系:分为窄依赖和宽依赖

窄依赖:指的是新生成的RDD 中的每个分区都依赖parent RDD 中的一部分分区。

窄依赖可进一步分为4种:

一对一依赖:表示 child RDD 和 parent RDD 分区个数相同,并存在一对一映射关系

区域依赖:表示 child RDD 和 parent RDD 的分区经过区域化后,存在一一映射关系

多对一依赖:表示 child RDD 中的一个分区同时依赖多个 parent RDD 中的分区

多对一依赖:表示child RDD 中的一个分区依赖parent RDD 中的多个分区,parent RDD 中的一个分区被child RDD 的多个分区依赖

宽依赖:表示新生成的 child RDD 中的分区依赖 parent RDD 中的每个分区的一部分。如果parent RDD 中的一个分区或者多个分区中的数据需要全部流入child RDD 中的一个或者多个分区中,则是窄依赖。如果parent RDD 分区中的数据需要一部分流入 child RDD 中的某一个分区,另外一部分流入其它分区中,则是宽依赖。

常用的数据分区方法为:

1). 水平划分:按照 record 索引划分。例如,我们经常使用的 sparkContext.parallelize(list(1,2,3,4,5,6,7,8,9), 3), 就是按照元素的下标划分,(1,2,3) 为一组,(4,5,6) 为一组,(7,8,9) 为一组。

2). Hash 划分:使用 record 的hash 值对数据进行划分,该划分方法的优点是,只要知道分区个数,就能准确的将数据划分到某个分区中。

3). Range 划分:该划分方法一般适用于排序任务,其核心思想是,按照数据的大小关系将数据划分到不同分区中,每个分区代表某一个数据范围。

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值