摘要
四个部分, 难度递增
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调度到ExecutorWorker开启Executor进程,Executor进程将Task分配给线程池
Job提交
- 客户端作为
Driver, 先启动SparkSubmit进程, 开始和Master通信, 此时也生成了SparkContext对象, Master收到请求, 寻找空闲的Worker, 并分配相应资源Worker领取任务, 并启动Executor.Exextor启动后反向注册到DirverDriver向Execxtor提交具体的计算规则,Execxtor进行计算Executor将计算结果返回Worker
常用算子
算子分为Transformation算子和Action算子
一般而言, 方法返回值为RDD的属于Transformation算子
Action算子会触发Job的生成, Action算子对应的RDD也会被封装为finalStage.
除了Action算子之外, 触发shuffle的Transformation算子也会产生Stage划分
Action算子
| 名称 | 功能 |
|---|---|
reduce | 聚合为单元素 |
aggregate | 可以转换数据类型, 类似于combineByKey |
count | 计数 |
first | 取首位元素 |
take | 取指定位元素 |
collect | 聚合为集合 |
foreach | 遍历 |
foreachPartition | 以分区为单位遍历 |
saveAsTextFile | 存储为text文件 |
Transformation算子
Transformation算子大致上可以分为两类,
map相关, 是对数据的重新映射, 底层调用了new MapPartitionsRDD. 不触发shufflereduce相关, 是对数据的聚合, 底层调用了combineByKeyWithClassTag. 会触发shufflejoin相关的方法, 一般都是调用了cogroup, 进而调用了mapValues.
总而言之, 重新映射的方法底层都是map. 但是像join类这样, 可以在参数中直接指定partitioner的, 都视为可以触发shuffle
触发shuffle
values聚合方法
| 名称 | 功能 |
|---|---|
distinct | |
groudByKey | 唯一一个在分区内部不聚合的, 避免使用 |
reduceByKey | 无初始值, 聚合values |
flotByKey | 指定初始值, 初始值必须和values类型保持一致 |
aggregateByKey | 可以分别指定分区聚合逻辑和整体聚合逻辑 |
combineByKey | 更为底层的聚合算子, 可以变换数据类型 |
连接查询
| 名称 | 功能 |
|---|---|
leftOuterJoin | 左外连接 |
rightOuterJoin | 右外连接 |
join | 内连接 |
cogroup | 全外连接 |
intersection | 求交集, 去重 |
repartition | 重新分区, 默认开启shuffle |
coalesce | 分区多变少可以不shuffer |
subtract | 移除一个RDD中的内容 |
其它
| 名称 | 功能 |
|---|---|
sortByKey | new ShuffledRDD |
sortBy | keyBy + sortByKey + values |
不触发shuffle
map相关方法
| 名称 | 功能 |
|---|---|
map | 映射, 转换数据集 |
mapPartition | 以分区为单位的map, 速度快但是耗费内存 |
mapPartitionWhitIndex | 自带分区信息 |
flatMap | 映射(map)并压平flatten |
mapValues | 只映射转换values |
keyBy | 指定键 |
filter | 过滤 |
其它
| 名称 | 底层 |
|---|---|
union | new UnionRDD |
最后
以上就是谦让大米最近收集整理的关于spark-core相关知识点的全部内容,更多相关spark-core相关知识点内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复