一、Spark概述:
Spark模块:
Core
SQL
Streaming
MLlib
Graphx
Spark VS MapReduce:
Spark比MapReduce更适合迭代式多任务计算:
MapReduce多个作业间的数据通信是基于磁盘, 而Sparke多个作业间的数据通信是基于内存
一个MapReduce程序只有map+reduce, 而Spark程序可以有多个算子
MapReduce是批处理, 而Spark是批处理 & 微批准实时处理
Shuffle中Spark不用落盘, 而MapReduce要磁盘
Spark有丰富的RDD算子, SQL操作, Streaming流处理, 还可以处理机器学习, 而MapReduce只有Mapper和Reducer
Spark有容错机制可以切断血缘, 避免失败后从源头数据开始全部重新计算
Spark 不能完全替代 MapReduce, 因为内存不充足时, Spark就无法工作了
架构:
Driver
是程序的入口, 是任务的调度者
功能:
将用户程序转化为Job作业
调度Task, 分配哪个Task由哪个Executor执行
向Yarn申请Container资源
监控Executor的执行情况
Executor
执行Task
对于Standalone独立部署模式, Master(相当于ResourceManager)和Worker(相当于NodeManager)来负责资源的管理调度
整个集群并行执行任务的数量称之为并行度
DAG 有向无环图, 是高度抽象后的 单向无闭环的任务流程图, 用于表示程序的拓扑结构
向Yarn提交Job:
Yarn Client模式(用于测试)
Driver模块的计算运行在本地
Yarn Cluster模式(生产环境)
Driver模块的计算运行在Yarn
客户端向ResourceManager申请启动Driver(ApplicationMaster)
ResourceManager分配Container, 在合适的NodeManager上启动Driver(ApplicationMaster)
Driver(ApplicationMaster)向ResourceManager申请Executor需要的内存; ResourceManager进行分配Container, 然后在合适的NodeManager上启动Executor
Executor进程启动后会向Driver反向注册, 当所有Executor全部注册完成后Driver开始执行main函数
执行到Action算子时触发一个Job, 并根据宽依赖划分stage, 并生成对应的TaskSet, 之后将Task分配给Executor执行
二、Spark-Core:
概述:
三大数据结构:
RDD 弹性分布式数据集
累加器 分布式共享只写变量
广播变量 分布式共享只读变量
RDD算子的特点:
弹性
容错的弹性, 有持久化机制, 数据丢失后可以自动恢复; 且可以切断血缘避免对父级的依赖, 减少重复计算
计算的弹性, 计算失败后自动重试
存储的弹性: 自动切换 内存和磁盘 去存储数据
分片的弹性:可根据需要重新分片
先将数据集分片, 然后将各个分片放到各个分区
分布式
数据集:RDD封装了计算逻辑,并不保存数据
数据抽象:RDD是一个抽象类,需要子类具体实现
不可变:RDD是不可变的, 要想改变只能产生新的RDD
可分区、各分区间是并行计算的
算子类型:
转换(Transform)算子, 并不会触发Job的执行
Value类型
双Value类型
Key-Value类型
行动(Action)算子, 真正触发Job的执行
一、RDD算子:
算子以外的代码都是在Driver端执行, 算子里面的代码都是在Executor端执行
转换算子:
单Value类型:
map
以每条数据为单位将数据发到Executor端
rdd.map(num => num * 2)
1
mapPartitions
以每个分区为单位将数据发到Executor端
rdd.mapPartitions(datas => datas.fi