摘要
四个部分, 难度递增
-
Spark
基础 -
RDD
基础 -
job
的生成和提交 - 常用算子, 重点在于
Action
和Transformation
算子的区分, 以及是否触发shuffle
概述
Spark特点
- 速度快. 以Hadoop的MapReduce为基准, Spark比MR快100倍
- 易用. 提供了Java, Scala, Python的API, Python和Shell的交互式界面, 80多种算子
- 通用. 批处理, 交互式查询, 实时流处理, 机器学习和图计算
- 兼容性. 可以在Hadoop上运行Spark, Spark也有自己的集群
Spark核心组件
SparkCore: 数据抽象RDD, 提供了StandAlone模式
SparkStream: 实时流处理
SparkMLlib: 机器学习库
SparkGraphX: 图计算
Spark和MR
- MR只有简单的map和reduce逻辑, Spark有80多种算子, 而且Spark支持流式处理, 机器学习和图计算. 功能更为强大
- MR处理复杂数据需要设计多个MR, 依次进行; Spark借助多job在内存中依次进行
- MR计算结果会持久化到磁盘, Spark在内存中保留缓存. Spark速度更快
- Spark借助RDD实现了高容错性, MR遇到错误只能重新计算
- MR逻辑简单, 稳定性强, 适合后台长期运行; Spark需要调优
Spark启动
- start-all, 先启动Master, Master找到slaves配置文件, 依次启动Worker
- Worker到Master进行注册
- Master将Worker信息保存到磁盘和内存, 返回注册成功的信息
- Worker开始给Master发送心跳包, Master持续更新心跳信息
启动细节
- Spark和Hadoop的sbin包中都有
start-all.sh
和stop-all.sh
, 在添加到环境变量时需要注意 - Spark分布式默认需要1G以上的内存, 所以搭建环境时, 对应的yarn节点内存必须2G及以上
RDD
概述: 处理大数据的核心思路就是分割.
spark不仅切分了数据, 而且将数据处理的流程也进行了切分
全部分区数据的每部分计算以及计算结果, 就是一个RDD
特性
- 数据抽象. 不实际存储数据
- 分布式. 数据存储位置, 以及计算过程都在分布式系统中
- 不可变. RDD一旦生成, 数据和依赖关系就不可更改
- 容错. 借助依赖关系, RDD出错时只需要重新计算出错的那部分数据
- 弹性. 存储位置可内存可硬盘, 高容错等
弹性体现
- 自动进行内存和磁盘数据存储的切换
- 基于血统的高效容错机制
- Task如果失败, 会自动进行特定次数的重试
- Stage如果失败会自动进行特定次数的重试
- Checkpoint可以主动或被动触发
- 数据调度弹性
属性
- 分区信息(计算哪部分数据)
- 该分区的计算规则(怎么计算)
- 对其它RDD的依赖(此次计算在整个流程中处于什么位置)
- [可选]分区器, 默认是HashPartitioner, 也可以自定义
- [可选]优先位置列表. 决定
task
在哪个节点上运行
Job
生成和提交逻辑
-
Action
算子触发Job
的生成; 根据RDD
的依赖关系构建DAG
(有向无环图) - 以宽依赖作为分割依据,
DAG
被进一步细分为多个Stage
. 每个Stage
根据分区数生成对应数量的Task
-
TaskScheduler
(调度器)根据先到先得(FIFO
), 或公平调度原则, 根据资源情况将Task
调度到Executor
-
Worker
开启Executor
进程,Executor
进程将Task
分配给线程池
Job
提交
- 客户端作为
Driver
, 先启动SparkSubmit
进程, 开始和Master
通信, 此时也生成了SparkContext
对象, -
Master
收到请求, 寻找空闲的Worker
, 并分配相应资源 -
Worker
领取任务, 并启动Executor
.Exextor
启动后反向注册到Dirver
-
Driver
向Execxtor
提交具体的计算规则,Execxtor
进行计算 -
Executor
将计算结果返回Worker
常用算子
算子分为Transformation
算子和Action
算子
一般而言, 方法返回值为RDD
的属于Transformation
算子
Action
算子会触发Job
的生成, Action
算子对应的RDD
也会被封装为finalStage
.
除了Action
算子之外, 触发shuffle
的Transformation
算子也会产生Stage
划分
Action
算子
名称 | 功能 |
| 聚合为单元素 |
| 可以转换数据类型, 类似于 |
| 计数 |
| 取首位元素 |
| 取指定位元素 |
| 聚合为集合 |
| 遍历 |
| 以分区为单位遍历 |
| 存储为text文件 |
Transformation
算子
Transformation
算子大致上可以分为两类,
-
map
相关, 是对数据的重新映射, 底层调用了new MapPartitionsRDD
. 不触发shuffle
-
reduce
相关, 是对数据的聚合, 底层调用了combineByKeyWithClassTag
. 会触发shuffle
-
join
相关的方法, 一般都是调用了cogroup
, 进而调用了mapValues
.
总而言之, 重新映射的方法底层都是map
. 但是像join
类这样, 可以在参数中直接指定partitioner
的, 都视为可以触发shuffle
触发shuffle
values聚合方法
名称 | 功能 |
| |
| 唯一一个在分区内部不聚合的, 避免使用 |
| 无初始值, 聚合values |
| 指定初始值, 初始值必须和values类型保持一致 |
| 可以分别指定分区聚合逻辑和整体聚合逻辑 |
| 更为底层的聚合算子, 可以变换数据类型 |
连接查询
名称 | 功能 |
| 左外连接 |
| 右外连接 |
| 内连接 |
| 全外连接 |
| 求交集, 去重 |
| 重新分区, 默认开启shuffle |
| 分区多变少可以不shuffer |
| 移除一个RDD中的内容 |
其它
名称 | 功能 |
|
|
|
|
不触发shuffle
map相关方法
名称 | 功能 |
| 映射, 转换数据集 |
| 以分区为单位的 |
| 自带分区信息 |
| 映射( |
| 只映射转换 |
| 指定键 |
| 过滤 |
其它
名称 | 底层 |
|
|