1、基本概念
1.1 什么是处理框架?
大多数情况我们将处理框架定义为**“一系列组件”**。其中包括负责数据存储的组件(Hdfs)、负载计算的组件(mapreduce-批处理计算引擎、spark-流处理计算引擎)、负责资源管理和任务调度的组件(Yarn)
Hadoop可以看做以Hdfs作为数据存储和以mapreduce作为计算引擎的批处理框架,如果将spark纳入Hadoop替换MapReduce计算引擎的话,这样就构成了流处理框架。
1.2 什么是计算引擎?处理框架和计算引擎是什么关系?
计算引擎属于处理框架的一部分,只负责数据的计算。
MapReduce是磁盘计算引擎,将中间结果保存到磁盘中,减少了内存占用,牺牲了计算性能。
Spark是内存计算引擎,将计算的中间结果保存到内存中,可以反复利用,提高了处理数据的性能。
2、Spark是什么
spark是一个可以快速处理数据的计算引擎,拥有mapreduce批计算引擎的所有优点,同时比mapreduce更好的是中间输出结果保存在内存中,不需要反复读写Hdfs,减少了I/O读写
3、MapReduce、Spark区别
MapReduce:从集群中读取数据,进行计算,得到中间结果并写入集群中,再从集群中读取中间结果进行下一次计算,如此循环直至处理完成将最终结果写入集群。
Spark:从内存中接近实时完成所有数据计算,从集群中读取数据,完成所有必须的分析处理,将结果写入集群。
4、Spark重要概念
4.1 RDD
4.1.1 含义
RDD,弹性分布式集群集,Resilient(弹性的) Distributed(分布式) Datasets(数据集)。
弹性:数据存储是弹性的,可存储在内存,也可存储在磁盘,可以自由切换存储的模式。优先存储在内存中的,如果存不下了,就写入到本地磁盘中,这叫做溢写,或者溢出。RDD中的partition大小不同,数量不定。
分布式:数据分布在集群的不同节点
4.1.2 包含内容
包含只读分区集合、对数据计算的函数、计算数据的位置、分区器、依赖的RDD信息
4.1.3 概念
本质上 RDD是不存数据的,存的是计算逻辑。移动数据不如移动计算。
有一个流水线工厂里面有工人RDD1、RDD2、RDD3,当一个工件下来的时候,RDD1做的是flatMap()加工,做完之后,被加工后的工件传到RDD2,然后RDD2做map()加工,之后再传给RDD3做一些其他加工。最后,直到工件加工完成出货为止。
注1:从前到后的加工顺序可以理解为 DAG有向无环图
RDD之间有两种依赖关系,窄依赖narrow dependence,宽依赖wide dependence。
窄依赖:父rdd的一个分区,只能被子rdd的一个分区使用 宽依赖:父rdd的一个分区,可以被子rdd的多个分区使用。 一般来说,窄依赖不会发生洗牌(shuller),宽依赖会发生洗牌,shuller。
4.2 DAG
有向无环图,有方向,没有闭环。对比MapReduce,Spark支持DAG,能够缓存中间数据,减少数据落盘次数,不用频繁对磁盘进行IO操作
4.3 RDD与DAG的关系
多个RDD相连,最后RDD组成一个有向无环图(DAG)。
4.4 partition分区
4.4.1 概念
partition是RDD中最小单位。RDD由集群中各个节点的各个partition组成,同一个RDD中partition大小不一,不同RDD的partition数量也不同,根据application的算子和分布式文件存储系统读入的数块数量决定的
4.4.2 为什么分区
数据量大,将数据分配到多个partition能够提高并行度,提升处理速度
4.4.3 分区类型
HashPartitioner:通过Key计算出HashCode后跟分区数取余出来的数值决定分区。缺点:数据不均匀,容易造成数据倾斜,极端情况可能几个分区拥有RDD所有数据
RangePartitioner:对Key进行排序,将Key划分成分区数Key集合。特点:分区数据量均匀且分区之间有序。
CustomPartitioner:自定义分区,开发者自己定义规则
注:Spark默认分区数为Hdfs文件的块数blocks, 如果我们上传一个30GB的非压缩的文件到HDFS,HDFS默认的块容量大小128MB,因此该文件在HDFS上会被分为235块(30GB/128MB)。 Spark读取SparkContext.textFile()读取该文件,默认分区数等于块数即235。
4.4.4 分区数量太多或太少有什么影响
分区数过多意味着任务Task过多,每次调度任务耗时增加造成总体耗时增加
分区数过少会导致部分节点没有分配任务(空闲),并且分配了任务的节点由于需要处理的数据量较大会导致内存要求提高,处理性能下降,分区出现数据倾斜的问题。
4.4.5 合理的分区数计算
总核数=executor-cores * num-executor
一般合理的分区数设置为总核数的2~3倍
4.5 算子
分为转换算子、action算子(动作算子)
4.6 SparkContext类
连接spark集群的类,通过这个类实例化对象能够创建连接spark集群,相当于创建了一个环境
意义:主入口
作用:连接Spark集群
4.7 SparkConf
创建环境时,指定一些参数。
5、数据倾斜
5.1 概念
数据倾斜,简单来说就是数据分配不均匀,集群中有的节点分的多,有的节点分的少。 从而导致分的多的节点需要更多的时间才能完成task,所以整个job的计算时间也就随着增多。
5.2 现象
①大部分task快速执行完成,发生数据倾斜的task需要执行很长的时间
②数据倾斜直接报OOM(JVM Out Of Memory)内存溢出错误,没有更多内存处理,导致spark job挂掉
5.3 处理方案
①过滤倾斜key优化法:空值、不重要的Key直接过滤掉
②提升shuffle操作的并行度优化法,人为指定并行度:手动增加(shuffle read task)数量,将原本分配到一个task的Key数据重新划分给多个task,通过提升并行度的方式再次分散task处理的数据量,缓解和减轻数据倾斜的影响。
③加随机数,及先聚合一次,再聚合一次:采用两段聚合优化,将相同的数据打乱成不同的局部数据进行局部聚合,局部聚合完再进行全局聚合。
6、算子
transform-转换算子:分为Value、Key-Value两个类型算子,不触发提交作业,Key-Value会把数据分布到不同分区
action-动作算子:触发提交作业。
7、Spark ml、Spark mllib区别
ml和mllib都是spark机器学习库(工具),常用机器学习功能两个库都能满足,官方推荐ml,因为ml更加灵活,mllib在spark2.0后进入只维护状态(只修复BUG不新增功能)
8、Spark集群管理Cluster manager
目前支持三种集群管理器:
①独立集群管理器(Standalone):简单的集群管理器,基于Spark自带的Master-Worker集群,搭建简单
②Apache Mesos:一种能够运行MapReduce和服务应用的集群管理器
③Hadoop Yarn:Spark可以和Hadoop集成,利用Yarn进行资源调度
如果在集群中仅有Spark程序,那么可以使用Spark独立的集群管理器。 如果有其他的mapreduce程序,那么需要使用Yarn或者Mesos管理器。 其中基于Yarn有两种提交模式,一种是基于Yarn的yarn-cluster模式,一种是基于Yarn的yarn-client模式。