目录
SparkCore
一、什么是Spark?二、Spark与MapReduce比较三、Spark运行模式四、Spark分区方式?五、RDD五大属性六、Spark系统架构七、算子(单文件)八、算子(多文件)九、窄依赖和宽依赖的认识十、stage切割规则十一、SparkShuffle机制十二、Spark资源调度和任务调度流程十三、谈谈广播变量和累加器
一、什么是Spark?
Spark专门为大规模数据进行快速处理的计算引擎,主要分为SparkCore、SparkSql、SparkStreaming,SparkStreaming可以做到准实时,Spark由Scala编写
二、Spark与MapReduce比较
三、Spark运行模式Spark对于数据的计算方式,是一次性执行全部的逻辑,并且依赖内存,一次性将结果得出,MapReduce计算方式,是通过数据的一次计算后存于磁盘,再从磁盘读取再次计算,这也是MapReduce没有Spark快的主要原因之一
Local:便于测试环境,比如再IDEA等编辑器中使用Standalone集群模式:是Spark自带的资源掉丢框架,支持完全分布式Yarn集群模式:Hadoop生态圈提供,Spark也可通过Yarn进行计算Mesos:资源调度框架
注意:Spark为什么可以使用Yarn框架?
是因为如果使用Yarn,满足条件就是必须实现ApplicationMaster接口,而Spark实现了这个接口,所有可以基于Yarn
四、Spark分区方式?
首先Spark提出了RDD的概念,一种数据集,也就是由多个分区组合而成,且分区大小不一,数量由任务里算子和最初的读入的数据块数量决定的
两种分区方式:
① HashPartitioner哈希分区:对K-V格式的数据进行hash后和分区数进行求余获取数据应该存放的分区号
② RangetPartitioner范围分区:针对于hash分区会造成数据倾斜,也就数据分布不均匀的情况的补充,其方式针对于抽样的方式进行数据的分区
五、RDD五大属性
首先RDD是一个弹性分布式数据集(弹性体现在每个RDD内的分区数大小不固定,分布式体现在,分区分布在不同的节点上),RDD内不存数据,只是pipeline的一段计算
五大 属性:
① RDD由多个分区组成
② RDD之间互相依赖(血缘关系)
③ 分区器用于(k,v)格式的RDD上
④ 函数作用再每个分区或切片上
⑤ RDD会计算出最佳的计算位置
注意:
1、文件的读取方式是MR的方式,读取文件之前先进行切片,模式一个切片是一个block快的大小
2、什么是k,v格式的RDD?
即数据格式是(k,v)二元组数据类型格式的RDD
RDD提供计算的最佳位置,体现了**计算移动数据不移动的思想**
六、Spark系统架构
整体架构于Yarn类似,整体流程:
首先提交JOB任务,Worker(监控当前节点的资源情况)开始会将资源情况汇报给主节点Master,Driver接受到JOB后,向主节点询问资源情况,获取资源后将任务分发至指定节点上的executor执行器,执行器启动内部的task任务,任务执行完毕汇报情况给Driver,再由Driver汇报给主节点,最后退出本次任务
七、算子(单文件)
Spark中RDD之间互相依赖,故此再启动后,会产生一个有向无环图DAG
转换算子(Transformations):对数据进行切分合并等操作,就是一个函数,惰性加载
例如:filter:过滤满足条件的(true:保留,false:过滤掉)
map于flatMap的区别?
虽然都是转换函数并且极其相似,细微不同于map函数后,RDD的值为 Array(Array(“a”,“b”),Array(“c”,“d”),Array(“e”,“f”)),flatMap函数处理后,RDD的值为 Array(“a”,“b”,“c”,“d”,“e”,“f”),也就是flatMap会将数组的进行拆解合并成一个数组
reduceBykey和groupBykey的区别?【看之前文章】
行动算(Action):触发算子,通过此算子启动控制算子和转换算子,一个任务中,有几个Action算子执行,就有几个job运行
常见算子:count(),take(n)返回前n个元素集合,first=take(1)返回第一个数据元素,foreach,collect收集结果
控制算子:也是RDD的持久化,主要就三种:cache,persist,checkpoint,三者皆是懒执行
谈谈cache、persist、checkpoint三者的区别
cache:将RDD数据集持久化到内存中,persist(xxx)通过不同的参数,可以进行内存持久化,磁盘持久化等,较为全面,checkpoint则是进行持久化到磁盘,cache=persist(Memory_Only),三者中checkpoint持久化会切断RDD之间的联系,但都是为了防止数据后期出错时,快速恢复数据
八、算子(多文件)
转换算子:
leftOuterJoin/rightOuterJoin/fullOuterJoin这些算子都是作用在k,v格式的RDD上的,根据key值进行连接(注意 join后的分区数于RDD数据多的那个相同)
union:合并两个数据集,两个数据集的类型要一致
intersection:取两个数据集的交集
subtract:取两个数据集的差集
mapPartitions:mapPartition于map类似,单位是每个partition上的数据
distinct(map+reduceByKey+map):对RDD内数据去重
cogroup:当调用类型(k,v)和(k,w)的数据上时,返回一个数据集(k,(v,w))
行动算子:
foreachPartition:遍历的数据时每个partition的数据
九、窄依赖和宽依赖的认识
窄依赖
RDD之间父RDD与子RDD之间的分区数时一对一或者多对一的关系时是窄依赖,窄依赖不会产生shuffle洗牌
宽依赖父RDD与子RDD的关系是一对多的关系,便是宽依赖,会产生shuffle
(注意Stage划分也是根据宽依赖划分的)
十、stage切割规则
stage是一个逻辑概念
切割规则:从后往前,遇到宽依赖就切割stage,总结由于spark中stage的划分是根据shuffle来划分的,而宽依赖必定会有shuffle的产生,因此可以说spark是根据款窄依赖划分的,并且stage内只有窄依赖
十一、SparkShuffle机制
HashShuffle
普通机制:
每个任务都有一个Buffer缓存,都会产生一个中间结果,然后分布给下面的子RDD合并机制:
再父RDD中的缓存中对数据先进行了一次合并,使得到子RDD时大大降低传输的压力
SortShuffle:
普通机制:
map执行中会有一个监控机制取定时监控内存的大小,内存结构中的数据超过5M则会申请新的*2-5的内存,如果申请失败则进行溢写,reduce拉取则通过解析索引文件拉取对应文件数据bypass机制:
此机制触发条件是:shuffle reduce task数量小于200,或者不需要map端预聚合,产生的磁盘小文件为2*M时都会触发
十二、Spark资源调度和任务调度流程
注意:再流程中,task发送到执行器失败会重试三次,三次失败则task这次任务失败,而stage包含多个任务,stage失败会重试4次,stage失败代表此次job失败流程:具体流程与系统架构流程一致,只是此图具体细化了Driver内的进程
十三、谈谈广播变量和累加器
广播变量:再Driver端定义一个变量,然后广播到每个Executor中,类似公共变量(此变量之能再Driver端定义,并且只有Driver端能够修改广播变量的值,Executor不能修改广播变量的值)
累加器:在Driver声明一个变量,在Executor更新,如果不设置累加器,则在Executor端更新后,可能导致多个Executor执行结果不准