由于之前因为毕业设计、答辩以及其他一些原因,耽搁了复习笔记很久了,导致迟迟没有更新;当然,这段时间学习还是不能落下的,依旧需要每天敲敲代码、学习一点新知识来巩固提高自己的知识水平,最近几篇我就会重点去介绍Spark。
一、Spark初始
Spark与MapReduce的区别
都是分布式计算框架,Spark基于内存,MR基于HDFS。Spark处理数据的能力一般是MR的十倍以上,Spark中除了基于内存计算外,还有DAG有向无环图来切分任务的执行先后顺序。
Spark运行模式
- Local:多用于本地测试,如在idea中写程序测试等。
- Standalone:是Spark自带的一个资源调度框架,支持完全分布式。
- Yarn:Hadoop生态圈中的一个资源调度框架,并且Spark是基于Yarn来计算的。
- Mesos:也是一种资源调度框架,了解不多。
二、Spark Core
1、RDD
定义:弹性分布式数据集。
五大特性:
-
RDD是由一系列的partition组成的.
-
函数是作用在每一个partition(split)上的。
-
RDD之间有一系列的依赖关系(宽依赖和窄依赖)。
-
分区器是作用在K,V格式的RDD上。
-
RDD提供一系列最佳的计算位置
-
textFile方法底层封装的是读取MR读取文件的方式,读取文件之前先split,默认split大小是一个block大小。
-
RDD实际上不存储数据,这里方便理解,暂时理解为存储数据。
-
什么是K,V格式的RDD?
如果RDD里面存储的数据都是二元组对象,那么这个RDD我们就叫做K,V格式的RDD。 -
哪里体现RDD的弹性(容错)?
partition数量,大小没有限制,体现了RDD的弹性。
RDD之间依赖关系,可以基于上一个RDD重新计算出RDD。 -
哪里体现RDD的分布式?
RDD是由Partition组成,partition是分布在不同节点上的。
RDD提供计算最佳位置,体现了数据本地化。体现了大数据中“计算移动数据不移动”的理念。
三、Spark提交任务原理
1、Spark基于Standalone-client模式提交任务
图中可以看出大致的流程,简单的不做过多讲解。一些提交指令我这也暂不给出,指令学习死记硬背意义不大,还需要结合现实进行学习手敲。
总结:
client模式适用于测试调试程序。Driver进程是在客户端启动的,这里的客户端就是指提交应用程序的当前节点。在Driver端可以看到task执行的情况。生产环境下不能使用client模式,是因为:假设要提交100个application到集群运行,Driver每次都会在client端启动,那么就会导致客户端100次网卡流量暴增的问题。
2、Spark基于Standalone-cluster模式提交任务
同上图client模式相差不大,这里可以明显看出来是在worker节点中启动Driver,并且是随机分散在集群中任意一台,不会造成过大的网卡流量暴增的情况。
总结:
Driver进程是在集群某一台Worker上启动的,在客户端是无法查看task的执行情况的。假设要提交100个application到集群运行,每次Driver会随机在集群中某一台Worker上启动,那么这100次网卡流量暴增的问题就散布在集群上。
3、Spark基于Yanr-client模式提交任务
执行流程
- 客户端提交一个Application,在客户端启动一个Driver进程。
- 应用程序启动后会向RS(ResourceManager)发送请求,启动AM(ApplicationMaster)的资源。
- RS收到请求,随机选择一台NM(NodeManager)启动AM。
- AM启动后,会向RS请求一批container资源,用于启动Executor.
- RS会找到一批NM返回给AM,用于启动Executor。
- AM会向NM发送命令启动Executor。
- Executor启动后,会反向注册给Driver,Driver发送task到Executor,执行情况和结果返回给Driver端。
总结:
Yarn-client模式同样是适用于测试,因为Driver运行在本地,Driver会与yarn集群中的Executor进行大量的通信,会造成客户机网卡流量的大量增加.
Hadoop2.x之后出现了Yarn的概念,ResourceManager,NodeManager和NodeManager都是Yarn中的名词,作为一个资源调度的框架。
4、Spark基于Yarn-cluster模式提交任务
同理于Standalone Cluster 的模式里,RM随着找一台NM节点启动AM(相当于是Driver),省去了与客户端频繁通信的网络IO暴增的情况。
总结:
Yarn-Cluster主要用于生产环境中,因为Driver运行在Yarn集群中某一台nodeManager中,每次提交任务的Driver所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能通过yarn查看日志。
四、Spark的算子
算子这东西不要想着一口气吃成个胖子,平时遇到一个记住一个,在敲代码的同时一定要理解其中的意义。
Spark算子可以大体上分为三类:Transformation算子、Action算子和持久化算子。(严格划分的话是分为两类,持久化算子是基于transformation和aciton算子的)
1、Transformation算子
定义:是一类算子(函数)叫做转换算子,如map,flatMap,RduceByKey等。Transformation算子是延迟执行,所以也叫做懒执行。
– filter
过滤符合条件的记录数,true保留,false过滤掉。
– map
将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。
特点:输入一条,输出一条数据。
– flatMap
先map后flat。与map类似,每个输入项可以映射为0到多个输出项。
– sample
随机抽样算子,根据传进去的小数按比例进行又放回或者无放回的抽样。
– reduceByKey
将相同的Key根据相应的逻辑进行处理。
– sortByKey/sortBy
作用在K,V格式的RDD上,对key进行升序或者降序排序。
2、Action行动算子
定义:Action类算子也是一类算子(函数)叫做行动算子,Transformations类算子是延迟执行,Action类算子是触发执行。一个application应用程序中有几个Action类算子执行,就有几个job运行。
– count
返回数据集中的元素数。会在结果计算完成后回收到Driver端。
– take(n)
返回一个包含数据集前n个元素的集合。
– first
first=take(1),返回数据集中的第一个元素。
– foreach
循环遍历数据集中的每个元素,运行相应的逻辑。
– collect
将计算结果回收到Driver端。
3、控制算子
定义:控制算子有三种,cache,persist,checkpoint,以上算子都可以将RDD持久化,持久化的单位是partition。cache和persist都是懒执行的。必须有一个action类算子触发执行。checkpoint算子不仅能将RDD持久化到磁盘,还能切断RDD之间的依赖关系。