摘要

四个部分, 难度递增

  1. Spark基础
  2. RDD基础
  3. job的生成和提交
  4. 常用算子, 重点在于ActionTransformation算子的区分, 以及是否触发shuffle

概述

Spark特点
  1. 速度快. 以Hadoop的MapReduce为基准, Spark比MR快100倍
  2. 易用. 提供了Java, Scala, Python的API, Python和Shell的交互式界面, 80多种算子
  3. 通用. 批处理, 交互式查询, 实时流处理, 机器学习和图计算
  4. 兼容性. 可以在Hadoop上运行Spark, Spark也有自己的集群
Spark核心组件

SparkCore: 数据抽象RDD, 提供了StandAlone模式
SparkStream: 实时流处理
SparkMLlib: 机器学习库
SparkGraphX: 图计算

Spark和MR
  1. MR只有简单的map和reduce逻辑, Spark有80多种算子, 而且Spark支持流式处理, 机器学习和图计算. 功能更为强大
  2. MR处理复杂数据需要设计多个MR, 依次进行; Spark借助多job在内存中依次进行
  3. MR计算结果会持久化到磁盘, Spark在内存中保留缓存. Spark速度更快
  4. Spark借助RDD实现了高容错性, MR遇到错误只能重新计算
  5. MR逻辑简单, 稳定性强, 适合后台长期运行; Spark需要调优
Spark启动
  1. start-all, 先启动Master, Master找到slaves配置文件, 依次启动Worker
  2. Worker到Master进行注册
  3. Master将Worker信息保存到磁盘和内存, 返回注册成功的信息
  4. Worker开始给Master发送心跳包, Master持续更新心跳信息
启动细节
  1. Spark和Hadoop的sbin包中都有start-all.shstop-all.sh, 在添加到环境变量时需要注意
  2. Spark分布式默认需要1G以上的内存, 所以搭建环境时, 对应的yarn节点内存必须2G及以上

RDD

概述: 处理大数据的核心思路就是分割.
spark不仅切分了数据, 而且将数据处理的流程也进行了切分
全部分区数据的每部分计算以及计算结果, 就是一个RDD

特性
  1. 数据抽象. 不实际存储数据
  2. 分布式. 数据存储位置, 以及计算过程都在分布式系统中
  3. 不可变. RDD一旦生成, 数据和依赖关系就不可更改
  4. 容错. 借助依赖关系, RDD出错时只需要重新计算出错的那部分数据
  5. 弹性. 存储位置可内存可硬盘, 高容错等
弹性体现
  1. 自动进行内存和磁盘数据存储的切换
  2. 基于血统的高效容错机制
  3. Task如果失败, 会自动进行特定次数的重试
  4. Stage如果失败会自动进行特定次数的重试
  5. Checkpoint可以主动或被动触发
  6. 数据调度弹性
属性
  1. 分区信息(计算哪部分数据)
  2. 该分区的计算规则(怎么计算)
  3. 对其它RDD的依赖(此次计算在整个流程中处于什么位置)
  4. [可选]分区器, 默认是HashPartitioner, 也可以自定义
  5. [可选]优先位置列表. 决定task在哪个节点上运行

Job生成和提交逻辑

  1. Action算子触发Job的生成; 根据RDD的依赖关系构建DAG(有向无环图)
  2. 以宽依赖作为分割依据, DAG被进一步细分为多个Stage. 每个Stage根据分区数生成对应数量的Task
  3. TaskScheduler(调度器)根据先到先得(FIFO), 或公平调度原则, 根据资源情况将Task调度到Executor
  4. Worker开启Executor进程, Executor进程将Task分配给线程池
Job提交
  1. 客户端作为Driver, 先启动SparkSubmit进程, 开始和Master通信, 此时也生成了SparkContext对象,
  2. Master收到请求, 寻找空闲的Worker, 并分配相应资源
  3. Worker领取任务, 并启动Executor. Exextor启动后反向注册到Dirver
  4. DriverExecxtor提交具体的计算规则, Execxtor进行计算
  5. Executor将计算结果返回Worker

常用算子

算子分为Transformation算子和Action算子
一般而言, 方法返回值为RDD的属于Transformation算子

Action算子会触发Job的生成, Action算子对应的RDD也会被封装为finalStage.
除了Action算子之外, 触发shuffleTransformation算子也会产生Stage划分

Action算子

名称

功能

reduce

聚合为单元素

aggregate

可以转换数据类型, 类似于combineByKey

count

计数

first

取首位元素

take

取指定位元素

collect

聚合为集合

foreach

遍历

foreachPartition

以分区为单位遍历

saveAsTextFile

存储为text文件

Transformation算子

Transformation算子大致上可以分为两类,

  1. map相关, 是对数据的重新映射, 底层调用了new MapPartitionsRDD. 不触发shuffle
  2. reduce相关, 是对数据的聚合, 底层调用了combineByKeyWithClassTag. 会触发shuffle
  3. join相关的方法, 一般都是调用了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