一、Spark逻辑处理流程
1、spark逻辑处理流程概览
一个典型的逻辑处理流程主要包含四个部分
-
数据源
:Data blocks -
数据模型
:对输入、输出和中间数据进行抽象表示,使得程序能够识别处理。
比MR的数据模型<k,v>record,更高层的抽象:RDD
RDD只是一个逻辑概念,在内存中并不会为RDD分配存储空间(除非该RDD需要被缓存)。RDD中的数据只会在计算中产生,并且在计算完成后就会消失。
RDD可以包含多个分区,不同分区可以由不同的任务(task)在不同节点进行处理。 -
数据操作
操作类型 | 描述 |
---|---|
action()操作 | 对数据结果产生后处理, 会产生数据结果;会触发spark提交job,真正执行数据处理任务 |
transform()操作 | 数据操作是单向操作,不可变模型 |
计算处理结果
:根据是否需要汇集到driver进行计算划分为两类:需要driver汇总计算和直接落盘
2、Spark逻辑处理流程生成方法
2.1、根据应用程序如何产生RDD,产生什么样的RDD
spark RDD的个数以及类型与transform()的计算逻辑有关,如map生成的RDD个数与父RDD一致,而比如join和distinct需要对中间数据进行一系列操作,那么一个transform操作会生成多个RDD。
2.2、如何建立RDD之间的数据以来关系
窄依赖v.s.宽依赖:child RDD的各个分区是否完全依赖
parent RDD的各个分区。
宽依赖即shuffle dependency,parent RDD分区中的一部分
流入子Rdd的一个分区,另一部分流入另外分区。
RDD的内部数据如何分区?
常用的分区方法
- 水平划分:按照record的索引进行划分,比如HDFS自动对输入数据进行水平划分,128M为单位的小数据块。
- Hash划分:Shuffle
- Range划分:排序
2.3、如何计算RDD中的数据
根据计算方式和控制流:
- 一对一输出:map、filter等
- 处理完一个分区中的数据再输出:mapPartitions等