数分-理论-大数据7-Spark(大数据框架)
(数据分析系列)
文章目录
1知识点
- 概述
- 编程模型
- 架构原理
- 实战应用
2具体内容
2.1概述
2.1.1起源
- 内存(进出仓库的通道):存储正在使用的资源
- 磁盘(仓库):存储暂时用不到的资源
- MapReduce:每一步在内存中,但产生的中间值(溢写文件)写入磁盘,下一步将中间值merge到内存,循环到最终完成计算
- spark:每一步在内存中,产生的中间值直接写入下一个步骤,至所有步骤完成后将最终结果保存进磁盘(适合计算步骤多)
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.依赖关系
- 依赖关系列表构建RDD
- 容错机制,出错可重建RDD
4.k-v数据的RDD分区器
- Partitioner分区器决定分区策略 - Hash分区- Range分区- 自定义分区
- 针对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架构原理
- 移动计算而非移动数据
- 通过DAG来实现计算
2.3.1计算阶段
- 根据应用的复杂程度,将过程分割成更多的计算阶段(stage),这些计算阶段组成一个有向无环图(DAG),Spark任务调度器根据DAG的依赖关系执行计算阶段(stage)
- Spark快:大量的迭代计算,产生数万个计算阶段,这些计算阶段在一个应用中处理完成
- 有向无环图,即是说不同阶段的依赖关系是有向的- 计算过程沿着依赖关系方向- 依赖关系不是环形依赖,否则死循环- 执行阶段1和阶段2后,再执行阶段3
- Spark大数据应用的计算过程:1. 根据程序初始化DAG2. 由DAG再建立依赖关系3. 根据依赖关系顺序执行各个计算阶段
- Spark 作业调度执行核心是DAG- DAG可以得出 整个应用就被切分成哪些阶段以及每个阶段的依赖关系- 每个阶段要处理的数据量生成相应的任务集合(TaskSet)- 每个任务都分配一个任务进程去处理
- DAGScheduler组件负责应用DAG的生成和管理- 根据程序代码生成DAG- 将程序分发到分布式计算集群- 按计算阶段的先后关系调度执行
2.3.2划分计算阶段
#上图DAG
rddB = rddA.groupBy(key)
rddD = rddC.map(func)
rddF = rddD.union(rddE)
rddG = rddB.join(rddF)#4个函数,三个阶段
- 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参考
- https://github.com/shenhao-stu/Big-Data/
- Spark SQL的基本使用
- Spark的Scala API介绍
版权归原作者 yxyibb 所有, 如有侵权,请联系我们删除。