Spark
概念
替代MapReduce的计算模型
MapReduce的缺点
shuffle 的IO操作
(但在hadoop3.0 有极大的优化, 不再单纯的依赖IO基于内存)
Spark特点
快: 基于内存
易用性
通用型: 流式处理 spark sql
兼容性
Spark缺点
没有对内存进行管理,内存的管理交给应用程序(容易出现OOM)
Spark核心
SparkCore: 内核 相当于MapReduce
RDD: 弹性分布式数据集 由分区组成
SparkSQL: 相当于Hive 将sql/DSL 转化为spark任务 对RDD操作的任务 提交到Spark集群中运行处理
SparkStreaming: 相当于Storm 流式计算引擎,本质把连续的数据,把他转化成不连续的数据(DStream 离散流 本质RDD)
体系架构
https://spark.apache.org/docs/latest/cluster-overview.html
主从架构
主节点 cluster manager
职责 相当于YARN中的ResourceManager
- 管理调度集群的资源和任务
- 接受客户端的任务请求
- 部署方式: standalone(master节点), yarn, mesos
部署方式:
standalone(这种方式下称为master)
yarn
mesos
从节点 worker
任务执行者
从节点上资源和任务的管理者
Executor 线程形式
worker默认行为
- 占用该节点的所有资源(耗费内存的原因)
客户端 Driver Program
本质上通过创建一个sc对象来连接到Spark (sc = Spark Context)
启动的方式 spark-submit spark-shell
单点故障
HA(高可用)
- zookeeper
- 基于文件目录(本地测试可以这么玩)
Spark任务提交流程
类似于YARN
- 通过SparkContext提交任务请求(不是提交任务)
- ClientManager将任务信息及任务资源分配给Worker
- Worker 启动Executors线程
- 客户端的Driver Program 真正提交要执行的任务(jar文件)
Executor执行任务的时候按阶段(stage)执行:
一个spark会被拆分为多个阶段执行,在每个阶段会产生新的RDD,后一个RDD会依赖前一个RDD
Spark算子(函数)
1. RDD(类)
弹性分布式数据集
基本的数据抽象集合
创建 RDD
val rdd1 = sc.parallelize(Array(1,2,3,4,5));
通过外部数据创建
val rdd2 = sc.textFile(“hdfs://hadoop01:9000/input/data.txt”)
2. RDD的算子
transformation 不会触发计算
map、filte、flatMap
action 触发计算
collect....
3. RDD特性
RDD缓存
RDD容错机制
RDD依赖关系
4. RDD缓存机制
主要为了提高效率
默认缓存在内存中(耗费内存的原因)
1 | def cache(): this.type = persist() |
rdd.cache
5. RDD容错机制
checkpoint 检查点机制
由于RDD 存在依赖关系,可能造成血统(lineage)过长, 如果血统越长越容易出错
检查点类型:
- 本地目录
- HDFS目录
rdd = sc.setCheckoutpointDir(“hdfs://xxxxxx”)
rdd.checkoutpoint
本质上是将rdd阶段性的结果保存在hdfs中
缺点:
性能问题:由于需要存储在HDFS中 所以需要进行IO操作所以会导致性能不高
6. RDD依赖关系
RDD 依赖关系 = 任务的stage 阶段
窄依赖: NarrowDependencies
(独生子女)
指每个父RDD的Partition(分区)最多被子RDD的一个Partition使用
宽依赖: WideDependencies
(超生)
指多个子RDD的一个Partition依赖同一个父RDD的Partition
Spark数据倾斜
数据在shuffle 过程中 分布不均匀导致部分节点计算量过大导致效率不高
- 从业务逻辑上解决
- 从技术方案上解决
- 从技术细节上解决
SparkSql
默认文件parquet文件 列式存储文件