数分-理论-大数据7-Spark(大数据框架)
(数据分析系列)
1知识点
2具体内容
2.1概述
2.1.1起源
2.1.2诞生
2.1.3Spark与Hadoop、MapReduce、HDFS的关系
1.hadoop:
- HDFS读取输入data
- Map使用用户定义的mapper func,结果写入磁盘
- Reduce从各Maping机器读取Map计算的中间结果,使用reduce func,结果写会HDFS
2.Spark
- 基于性能更高的内存存储来进行数据存储和读写
- 缺乏对数据存储的支持,没有分布式文件系统(HDFS),只能依赖外部数据源
3.异同
- 都是大数据框架
- hadoop
- 分布式数据基础措施,将巨大的数据集分派到一个集群中的多个节点进行存储
- 计算处理的功能
- spark
- 对分布式存储的大数据进行处理的工具
- SparkCore看做是MapReduce的竞品
- 不会分布式存储
2.1.4生态体系
Spark是一个用来实现快速且通用的集群计算平台
- 速度:在内存中进行计算,可以面向海量数据进行分析处理;
- 通用:针对任何业务类型分析进行处理
- SparkCore离线批处理
- SparkSQL交互式分析,支持SQL语句
- SparkStreaming,实时流数据处理
- MLlib,支持机器学习
- GraphX,支持图计算
- StructuredStreamig流式处理
2.2编程模型-核心
2.2.1RDD概述
弹性数据集(Resilient Distributed Datasets)的缩写
- mr,面向过程的大数据计算,如何将计算逻辑用Map和Reduce实现,输入输出是什么
- spark,面向对象(大数据抽象为一个RDD对象)编程,在RDD上计算至最后的结果
2.2.2RDD定义
- 分布式内存
- 只读的记录分区集合
- 横跨集群所有节点进行并行计算
- spark建立在抽象RDD上,统一算子进行运算
2.2.3RDD五大特性
1.分区
- 计算以分区为单位,分配到多个机器并行计算
- 从HDFS取数,spark使用位置信息,将计算工作就近发机器减少跨网络传输数据量
2.可并行计算
- 一个分区一个计算任务Task
- 每个分区有计算函数(计算算子)
- 以分片为基本单位并行计算
- RDD的分区数决定着并行计算的数量
3.依赖关系
4.k-v数据的RDD分区器
- Partitioner分区器决定分区策略
- 针对k-v形式,从0到 numPartitions-1区间内映射每一个key到partition ID上
5.每个分区有一个优先位置列表
- 分区位置列表会存储每个Partition的优先位置,如果读取的是HDFS文件,这个列表保存的就是每个分区所在的block块的位置
- 尽可能将任务分配到处理数据的数据块位置
2.2.4RDD操作函数
-
转换transformation,返回值是RDD
- map(func)计算
- filter(func)过滤
- union(otherDataset)合并
- reduceByKey(func, [numPartitions])根据key聚合
- join(otherDataset, [numPartitions])连接数据集
- groupByKey([numPartitions])分组
-
执行action,不返回RDD -
spark以RDD为单位,对大数据分片计算,每个RDD分片分到一个执行进程处理 -
转换操作
- 转换操作产生的RDD不会出现新的分片情况:
- RDD数据分片,经过map或者filter转换操作后,其结果还在当前的分片中
- 物理上,Spark只有在产生新的RDD分片时候,才会真的生成一个RDD,Spark的这种特性也被称作惰性计算;
- 转换操作产生的RDD会产生新的分片情况:
- reduceByKey,来自不同分片的相同key 必须聚合在一起进行操作,这样就会产生新的RDD分片
- 是否会产生新的RDD分片,并不是根据转换函数名就能判断出来的
2.3架构原理
2.3.1计算阶段
-
根据应用的复杂程度,将过程分割成更多的计算阶段(stage),这些计算阶段组成一个有向无环图(DAG),Spark任务调度器根据DAG的依赖关系执行计算阶段(stage) -
Spark快:大量的迭代计算,产生数万个计算阶段,这些计算阶段在一个应用中处理完成 -
有向无环图,即是说不同阶段的依赖关系是有向的
- 计算过程沿着依赖关系方向
- 依赖关系不是环形依赖,否则死循环
-
Spark大数据应用的计算过程:
- 根据程序初始化DAG
- 由DAG再建立依赖关系
- 根据依赖关系顺序执行各个计算阶段
-
Spark 作业调度执行核心是DAG
- DAG可以得出 整个应用就被切分成哪些阶段以及每个阶段的依赖关系
- 每个阶段要处理的数据量生成相应的任务集合(TaskSet)
- 每个任务都分配一个任务进程去处理
-
DAGScheduler组件负责应用DAG的生成和管理
- 根据程序代码生成DAG
- 将程序分发到分布式计算集群
- 按计算阶段的先后关系调度执行
2.3.2划分计算阶段
rddB = rddA.groupBy(key)
rddD = rddC.map(func)
rddF = rddD.union(rddE)
rddG = rddB.join(rddF)
- RDD之间的转换连接线呈现多对多交叉连接的时候,就会产生新的阶段
- 一个RDD表示一个数据集,一个数据集中的多个数据分片需要进行分区传输,写入到另一个数据集的不同分片中
- Spark中计算阶段划分的依据是Shuffle
- 从数据集跨越,由多个分区传输的过程,叫做Shuffle
- Shuffle将数据进行重新组合,把相同key的数据放一起,因为新的聚合、关联,产生新的计算阶段
- 不需要Shuffle的依赖,称为窄依赖。需要Shuffle的依赖,称为宽依赖。
MR与Spark效率比较:
- 本质:
- MapReduce根据Shuffle将大数据计算分为Map和Reduce两个阶段
- Spark将前一个的Reduce和后一个的Map进行连接,当作一个阶段进行计算,从而形成了一个更高效流畅的计算模型
- 本质是Map和Reduce,但多个计算阶段依赖执行的方案可以有效减少对HDFS的访问(落盘),减少作业的调度执行次数
- 存储方式:
- 使用磁盘存储Shuffle过程的数据
- Spark优先使用内存进行数据存储(RDD也优先存于内存)
2.3.3作业管理
- DAGScheduler遇到Shuffle时,会生成一个计算阶段
- 遇到action函数时,会生成一个作业(Job)
- RDD里的每个数据分片,Spark都会创建一个计算任务进行处理,一个计算阶段会包含多个计算任务(Task)
- 一个作业至少包含一个计算阶段
- 每个计算阶段由多个任务组成
- 这些任务(Task)组成一个任务集合
- DAGScheduler根据代码生成DAG图,Spark的任务调度以任务为单位进行分配,将任务分配到分布式集群的不同机器上执行。
2.3.4执行过程
- spark支持多种部署方案(Standalone、Yarn、Mesos等)
- 不同的部署方案核心功能和运行流程基本一样,只是不同组件角色命名不同。
-
JVM启动应用程序(Driver进程)
- Driver调用SparkContext初始化执行配置和输入数据
- SparkContext启动DAGScheduler构造执行的DAG图,切分成计算任务这样的最小执行单位
-
Driver向Cluster Manager请求计算资源,用于DAG的分布式计算
- ClusterManager收到请求以后,将Driver的主机地址等信息通知给集群的所有计算节点Worker Node
-
Worker收到信息
- 根据Driver的主机地址,向Driver通信并注册,然后根据自己的空闲资源向Driver通报可以领用的任务数
- Driver根据DAG图向注册的Worker分配任务
2.4实战应用
- spark local模式安装
- WordCount为例,查看SparkRDD执行流程
3参考
|