(数据分析系列)
数分-理论-大数据7-Spark(大数据框架)
1知识点2具体内容
2.1概述
2.1.1起源2.1.2诞生2.1.3Spark与Hadoop、MapReduce、HDFS的关系2.1.4生态体系 2.2编程模型-核心
2.2.1RDD概述2.2.2RDD定义2.2.3RDD五大特性2.2.4RDD操作函数 2.3架构原理
2.3.1计算阶段2.3.2划分计算阶段2.3.3作业管理2.3.4执行过程 2.4实战应用 3参考
1知识点概述编程模型架构原理实战应用 2具体内容 2.1概述 2.1.1起源
内存(进出仓库的通道):存储正在使用的资源
磁盘(仓库):存储暂时用不到的资源
MapReduce:每一步在内存中,但产生的中间值(溢写文件)写入磁盘,下一步将中间值merge到内存,循环到最终完成计算
spark:每一步在内存中,产生的中间值直接写入下一个步骤,至所有步骤完成后将最终结果保存进磁盘(适合计算步骤多)
1.hadoop:
HDFS读取输入dataMap使用用户定义的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分片,并不是根据转换函数名就能判断出来的
移动计算而非移动数据通过DAG来实现计算 2.3.1计算阶段
根据应用的复杂程度,将过程分割成更多的计算阶段(stage),这些计算阶段组成一个有向无环图(DAG),Spark任务调度器根据DAG的依赖关系执行计算阶段(stage)
Spark快:大量的迭代计算,产生数万个计算阶段,这些计算阶段在一个应用中处理完成
有向无环图,即是说不同阶段的依赖关系是有向的
计算过程沿着依赖关系方向依赖关系不是环形依赖,否则死循环
执行阶段1和阶段2后,再执行阶段3
Spark大数据应用的计算过程:
- 根据程序初始化DAG由DAG再建立依赖关系根据依赖关系顺序执行各个计算阶段
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从数据集跨越,由多个分区传输的过程,叫做ShuffleShuffle将数据进行重新组合,把相同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的任务调度以任务为单位进行分配,将任务分配到分布式集群的不同机器上执行。
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分配任务
- spark local模式安装WordCount为例,查看SparkRDD执行流程
https://github.com/shenhao-stu/Big-Data/Spark SQL的基本使用Spark的Scala API介绍



