Spark原理
1. Spark概述
1.1 Spark简介
Spark几个主要特点:
运行速度快:
- 基于内存
- 采用DAG(有向无环图),能够对相关作业进行优化
容易使用:
- 支持scala,java,python,R语言进行编程
- 通过SparkShell进行交互式编程
通用型:
- 提供了SQL查询,流式计算,机器学习,图算法组件
运行模式多样:
- 运行独立集群模式(LOCAL)
- 运行hadoop中(集群模式)
- 运行在云环境中
- 访问HDFS,CASSANDRA,hbase,hive等多种数据源
1.2 Spark与Hadoop的对比
Hadoop缺点:
- 表达能力有限:MapReduce,只能通过map(),reduce()两大函数处理业务逻辑,有时候可能无法处理
- 磁盘IO开销大:map和reduce两个阶段的溢写和shuffle阶段,都会涉及多次的IO读写,磁盘开销较大
- 延迟高:两阶段执行,任务之间键值对的传递,磁盘的读写,以及reduce必须等map执行为完成才能执行等因素,导致执行时间较长
相比于Hadoop Mapreduce,Spark主要具有以下优点:
- 计算模型基于MapReduce,不只是map和reduce两大操作,还提供了多种数据集操作类型(函数),编程模型更灵活
- 基于内存计算,中间结果放到内存中,迭代运算效率更高
- spark基于DAG(有向无环图)任务调度机制,优于Hadoop MapReduce的迭代执行机制
Spark执行效率时Hadoop的100倍
1.3 总结与思考⭐
1)Spark主要特点
2)Hadoop缺点
Hadoop缺点:
- 表达能力有限:MapReduce,只能通过map(),reduce()两大函数处理业务逻辑,有时候可能无法处理
- 磁盘IO开销大:map和reduce两个阶段的溢写和shuffle阶段,都会涉及多次的IO读写,磁盘开销较大
- 延迟高:两阶段执行,任务之间键值对的传递,磁盘的读写,以及reduce必须等map执行为完成才能执行等因素,导致执行时间较长
3)Spark优点
相比于Hadoop Mapreduce,Spark主要具有以下优点:
- 计算模型基于MapReduce,不只是map和reduce两大操作,还提供了多种数据集操作类型(函数),编程模型更灵活
- 基于内存计算,中间结果放到内存中,迭代运算效率更高
- spark基于DAG(有向无环图)任务调度机制,优于Hadoop MapReduce的迭代执行机制
Spark执行效率时Hadoop的100倍
4)思考
优势可总结为两点,一是速度快,二是组件多,适用不同场景
2.Spark生态系统
2.1 Spark应用场景
- 复杂批量数据处理:时间跨度十分钟到数小时
- 基于历史数据的交互式查询:时间跨度数十秒到数分钟
- 基于实时数据流的数据处理:数百毫秒到数秒
同时存在以上三种场景时,需要同时部署三种软件:
比如:MapReduce / Impala / Storm
带来的问题:
- 不同场景的数据无法共享,通常需要进行转换
- 不通框架需要不同的开发维护团队,成本较高
- 难以对同一个集群中各个系统,进行统一的资源协调和分配(yarn不可以吗??YARN只能对同一个系统中的资源进行调度)
Spark优势
- 同时满足多种业务场景,SQL即席查询/实时流式计算/机器学习/图计算
- 可以部署到yarn上,进行统一资源调度
2.2 BDAS架构图
Mesos:调度器
S3:亚马逊的分布式文件存储系统
Tachyon:基于内存的分布式存储系统
访问接口:
Spark Streaming/Structured Streaming : 流式计算
Spark SQL:SQL即席查询
GraphX: 图计算
MLlib:机器学习
Strom:推特
S4:亚马逊
2.3 总结与思考⭐
1)Spark的应用场景
2)Spark优势
- 同时满足多种业务场景,SQL即席查询/实时流式计算/机器学习/图计算
- 可以部署到yarn上,进行统一资源调度
3)BDAS架构图
4)一点思考
CDH也可以集成spark-sql模块,并通过hue进行查询
3.Spark运行结构⭐⭐⭐
3.1 基本概念
RDD:Resillient Distributed Dataset(弹性分布式数据集)的简称,是分布式内存的抽象概念,共享内存模型,通俗比喻:大麻袋
DAG: Directed Acyclic Grapg(有向无环图),反映RDD之间的依赖关系
Executor:运行再工作节点(WorkerNode)的一个进程,负责运行Task
应用(Application):用户编写的Spark程序
任务(Task):运行再Executor上的工作单元
作业(Job):一个作业包含多个RDD及作用于相应RDD上的各种操作
阶段(STAGE):是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为阶段,或者也被称为任务集合,代表了一组关联的,相互之间没有Shuffle依赖关系的任务组成的任务集
3.2 架构设计
3.3 Spark运行基本流程
通过创建SparkContext对象,获取和一个集群的连接(SparkShell中默认创建好了)
3.4 RDD运行原理
3.4.1 RDD设计背景
序列化开销:内存文件写到磁盘会产生序列化的过程
实现管道化,一个结果的输出成为另外一个数据集的输入,避免中间写磁盘
3.4.2 RDD概念
RDD高度受限的共享内存模型,只读
例如加10分的业务场景:需要给RDD进行转换,转换过程中加10分 ,形成新的RDD
RDD提高了两种类型的数据运算:
1)Action
2)Transformation,并不会实际发生转换,只有执行Action转换时,才发生转换(惰性机制),接口简单,类似map,filter,groupby,join等粗粒度的数据转换操作
Spark用Scala实现RDD的API,效率最高
Spark的优点
惰性调用,管道化---》避免同步等待---》不需要保存中间结果
3.4.3 RDD特性
1)容错性,具有清晰的数据血缘关系图,方便数据追溯
2)中间结果存储在内存当中,避免了读写磁盘
3)避免了读写磁盘,就避免了序列化和反序列化
3.4.4 RDD之间的依赖关系
Shuffle:把键相同的键值对,通过shffle(洗牌)机制,洗到一个reduce任务中,shuffle过程会涉及大量的网络数据分发!
是否涉及Shuffle是判断宽窄依赖的重要依据
包含Shuffle就是宽依赖
窄依赖:平行线
宽依赖:交叉线,发生了shuffle
3.4.5 Stage阶段的划分
窄依赖不涉及shuffle操作,对作业的优化更有利。
在划分Stage的过程中:
1)反向解析,遇到宽依赖断开
2)遇到窄依赖就把当前RDD加入STAGE中
3)把窄依赖尽量划分到同一个STAGE中
Stage2中的任务都是并行执行
3.4.6 RDD运行过程
3.5 思考与总结⭐
1)Spark速度快的原因
- 中间结果存储在内存当中,减少了与磁盘的读写
- 惰性机制,只在执行Action算子时,才发生实际的计算
- 管道化,不需要保留中间结果,
2)shuffle洗牌⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
- Spark中的 Shuffle 是一种用于重新分配 RDD 中数据的操作,它可以将 RDD 中的数据根据某种特征进行分组,然后将这些分组的数据分配到不同的节点上进行计算,从而提高计算效率。
- 可以通过调整shffule相关的参数来优化Spark程序性能
- 通过是否发生shuffle,来判断宽窄依赖,根据宽窄依赖来划分stage阶段;遇到宽依赖就断开,遇到窄依赖,就把当前的RDD加入到stage当中,将窄依赖划分到一个Stage当中,可以实现流水线计算
3)RDD运行过程
4.Spark的部署方式
Spark和Mesos是同一个团队开发的,具有更好的血缘关系
5.Spark和FLink的对比
Flink:面向流数据处理思维
Spark:面向批数据处理思维
Flink(林子雨):网易云课堂教学视频
Flink优于Spark和Hadoop最主要的原因:Flink支持增量迭代,具有对迭代自动优化的功能。
5.1 思考与总结⭐
1)Spark和Flink的区别
-
Spark基于批计算模拟流计算,Flink基于流计算模拟批计算
-
批计算分割的再细,也不能小于1s,有很大的局限性,flink可以实现毫秒级别计算
-
FLink更契合Yarn,同时支持增量迭代,具有对迭代自动优化的功能。
-
批处理用Spark,流处理用Flink,不用Storm
6.Spark基础编程⭐⭐⭐⭐⭐
6.1 RDD编程
6.1.1 转换操作
6.1.2 行动操作
6.1.3 实例1
6.1.4 实例2
6.2 DataFrame编程
6.2.1 DataFrame简介
DataFrame对RDD的拆解,基于RDD
最终都会通过Catalyst转换为底层的RDD(Spark Core)
6.2.2 DataFrame的优点
6.2.3 基于DataFrame的Spark SQL
SparkSQL基于DATAFrame和DATASet
不管是SQL/DataFrame/Dataset,都会通过Catalyst组件,转换为底层的RDD(Spark Core)
而Structured Streaming和MLlib都是基于DataFrame表达查询
6.2.4 DataFrame常用操作
1)DSL语法风格
2)SQL语法风格
6.3 DataSet编程
6.3.1 DataFrame / DataSet / RDD的区别
1)DataFrame / DataSet / RDD关系
DataSet是对DataFrame的扩展
Spark2.0,DataSet包含了DataFrame功能
面向DataSet,DataFrame编程,无论是SQL/DSL,本质都会转换为RDD操作
2)DataFrame / DataSet / RDD具体数据
3)DataFrame / DataSet / RDD 优化
DataFrame和DataSet的查询计划可以通过SparkSQL进行优化。
RDD本身不具备查询优化功能。
DataFrame和DataSet底层都是基于RDD实现的。
4)DataFrame / DataSet / RDD优缺点
5)DataFrame/DataSet/RDD的适用场景
企业级开发,更多使用高层的DataFrame,DataSet
如果需要更多控制功能,使用RDD
DataFrame 和 DataSet 自动优化,提升开发效率。
RDD处理非结构化数据,例如文本流数据,具有优势。
6.3.2 DataFrame/DataSet/RDD的相互转换
6.3.3 DataSet编程实例
6.4 思考与总结⭐⭐⭐⭐⭐⭐
1)RDD编程
- 转换算子:不发生实际计算,只记录轨迹
- 执行算子:发生实际计算的地方,会加载文件,通过一次次的转换,到计算出最后的结果
2)DataFrame编程
- DataFrame是对RDD更详细的描述
- 性能优越,具备更好的表达能力(就像RDD只能描述到车,但DataFrame可以描述到小车/客车/货车)
- 基于DataFrame的Spark SQL
SparkSQL基于DATAFrame和DATASet
不管是SQL/DataFrame/Dataset,都会通过Catalyst组件,转换为底层的RDD(Spark Core)
而Structured Streaming和MLlib都是基于DataFrame表达查询
- DataFrame常用操作:DSL语法风格和SQL风格
3)DataSet编程实例
-
DataSet是对DataFrame的扩展
-
Spark2.0,DataSet包含了DataFrame功能
-
面向DataSet,DataFrame编程,无论是SQL/DSL,本质都会转换为RDD操作