1、什么是Spark
spark是专门为大数据处理而设计的计算引擎。
2、Spark和MR的区别
都是分布式计算框架,Spark是基于内存,MR基于HDFS。Spark处理数据的速度是MR的十倍以上,Spark处理基于内初计算外,还有DAC有向无环图来切分任务的执行先后顺序。
3、Spark的运行模式
Local:多用于本地测试
Standalone:自带的资源调度框架。
yarn:
Mesos
注意:要用yarn来进行资源调度器,要实现AppalicationMaster 接口,Spark 实现 了这个接口,所以可以基于 Yarn。
4、什么是RDD
弹性分布式数据集
RDD的特点:
1、由一系列partition组成的。
2、函数是作用在每个partition上的
3、RDD之间有依赖关系
4、分区器是作用在KV格式的RDD上
5、RDD提供一系列最佳的计算位置。
5、RDD的注意事项
1、RDD不储存数据,RDD是一个迭代器。
2、textFile方法底层封装的实MR读取文件方式。
3、RDD里面处理的数据是二元组对象
4、partition的数量和大小没有限制
5、RDD是由partition组成,partition分布在不同节点上。
6、创建RDD的方式
7、Spark算子分类
RDD的算子分为:
转换算子:map,flatMap、reduceBy。Transformations 算子是延迟执行, 也叫懒加载执行。
行动算子:foreach、count。
8、Spark 代码流程
1、 创建 SparkConf 对象
可以设置 Application name。
可以设置运行模式
可以设置 Spark applicatiion 的资源需求。
2、创建 SparkContext 对象
3、基于 Spark 的上下文创建一个 RDD,对 RDD 进行处理。
4、应用程序中要有 Action 类算子来触发 Transformation 类算子执行。
5、关闭 Spark 上下文对象 SparkContext。
9、持久化算子
控制算子有三种,cache,persist,checkpoint,以上算子都可以将 RDD 持久化,持久化的单位是 partition。cache 和 persist 都是懒执行的。 必须有一个 action 类算子触发执行。checkpoint 算子不仅能将 RDD 持久化到磁盘,还能切断 RDD 之间的依赖关系。
10、Standalone提交任务两种流程及特点
Standalone-client 适用于测试调试程序
1、client提交任务后再客户端启动Driver进程。
2、Driver向Master申请资源
3、Master收到请求后再对应的worker节点上启动Executor
4、Executor启动后反向注册给Driver端
5、Driver端将task发送到work端执行,work端也将执行结果返回给Driver端
Standalone-cluster
1、cluster提交APP后向Master请求启动Driver。
2、Master接收到请求后,在集群中的随机一个节点启动Driver。
3、Driver启动后申请资源
4、Driver发送task到work节点上执行
5、work将结果返回给Driver
总结 Standalone 两种方式提交任务,Driver 与集群的通信包括:
- Driver 负责应用程序资源的申请
- 任务的分发。
- 结果的回收。
- 监控 task 执行情况。
11、yarn提交任务的两种方式
yarn-client client、ResourceManager、NodeManager
1、client提交一个APP,在client启动一个Driver进程
2、APP方RS发送请求启动AM(ApplicationMaster)的资源
3、RS收到请求,随机选择一台NM启动AM
4、AM启动后向RS申请资源,用来启动Executor
5、RS返回资源给AM
6、AM向NM发送命令启动Executor
7、Executor启动后反向注册给Driver,Driver发送task给Executor,同时executor把执行情况和结果返回给Driver
yarn-cluster
1、client提交APP发送给RS请求启动AM
2、RS收到请求在随机的NM上启动AM
3、AM启动后向RS请求资源
4、RS返回资源给AM
5、AM发送命令给NM启动executor
6、executor反向注册到AM所在的Driver,Driver发送task给Executor
Yarn-Cluster 主要用于生产环境中
ApplicationMaster 的作用:
-
为当前的 Application 申请资源
-
给 NameNode 发送消息启动 Excutor。
-
任务调度。
停止集群任务命令:yarn application -kill applicationID
理解 Spark 宽窄依赖及计算模式
窄依赖:父RDD和子RDD partition之间的关系是 一 对一 ,不会有shuffle的产生。
宽依赖:父 RDD 与子 RDD partition 之间的关系是一对多。会有 shuffle 的产生。
pipeline 管道计算模式,pipeline 只是一种计算思想,模式。
Spark 资源调度和任务调度流程
资源调度=========================================
1、启动Master和备用Master(如果是高可用集群需要启动备用Master,否则没有备用Master)。
2、启动Worker节点。Worker节点启动成功后会向Master注册。在works集合中添加自身信息。
3、在客户端提交Application,启动spark-submit进程。伪代码:spark-submit --master --deploy-mode cluster --class jarPath
4、Client向Master为Driver申请资源。申请信息到达Master后在Master的waitingDrivers集合中添加该Driver的申请信息。
5、当waitingDrivers集合不为空,调用schedule()方法,Master查找works集合,在符合条件的Work节点启动Driver。启动Driver成功后,waitingDrivers集合中的该条申请信息移除。Client客户端的spark-submit进程关闭。
(Driver启动成功后,会创建DAGScheduler对象和TaskSchedule对象)
6、当TaskScheduler创建成功后,会向Master会Application申请资源。申请请求发送到Master端后会在waitingApps集合中添加该申请信息。
7、当waitingApps集合中的元素发生改变,会调用schedule()方法。查找works集合,在符合要求的worker节点启动Executor进程。
8、当Executor进程启动成功后会将waitingApps集合中的该申请信息移除。并且向TaskSchedule反向注册。此时TaskSchedule就有一批Executor的列表信息。
=任务调度===
9、根据RDD的宽窄依赖,切割job,划分stage。每一个stage是由一组task组成的。每一个task是一个pipleline计算模式。
10、TaskScheduler会根据数据位置分发task。(taskScheduler是如何拿到数据位置的???TaskSchedule调用HDFS的api,拿到数据的block块以及block块的位置信息)
11、TaskSchedule分发task并且监控task的执行情况。
12、若task执行失败或者挣扎。会重试这个task。默认会重试三次。
13、若重试三次依旧失败。会把这个task返回给DAGScheduler,DAGScheduler会重试这个失败的stage(只重试失败的这个stage)。默认重试四次。
14、告诉master,将集群中的executor杀死,释放资源。