一、Spark是什么
Spark系统是分布式批处理系统可分析挖掘引擎
二、Spark支持的运行模式
1、Local(学习、测试)
2、Standalone模式(自带的集群模式使用spark自带的调度方式)
3、Yarn
4、mesos(类似yarn的资源调度框架)
三、Spark on yarn运行流程
dirver在client端:
1、客户端启动后直接运行应用程序,直接启动driver并初始化
2、客户端将job发布到yarn上
3、RM为job在某个NM上分配一个AM
4、AM向RM申请资源,RM返回Executer信息
5、AM通过RPC启动相应的Executer
6、Driver生成DAG图,DAG Scheduler将DAG拆分成stage(TaskSet)发动给 Task Scheduler
7、Driver向Executer分配task
8、Executer执行task并将结果写入第三方存储系统或者Driver端
driver在集群中(cluster模式):
1、client向yarn提交一个job
2、RM为job在某个NM上分配一个AM(applicationMater),NM启动AM,AM启动driver(sparkContext)
3、AM启动后完成初始化作业,driver生成DAG图,DAG Scheduler将DAG拆分成stage(TaskSet)发动给 Task Scheduler
4、AM向RM申请资源,RM返回Executer信息
5、AM通过RPC启动相应的Executer
6、Executer想driver申请task,TaskScheduler将task发送给Executer
7、Executer执行task将结果写入外部或者返回到driver
四、client和cluster运行模式的区别
1、SparkContext初始化不同,这也导致了Driver所在位置的不同,Yarn-Cluster的Driver是在集群的某一台NM上,Yarn-Client 的Driver运行在客户端
2、Driver会和Executors进行通信,这也导致了Yarn-Cluster在提交App之后可以关闭Client,而Yarn-Client不可以
3、Yarn-Cluster适合生产环境,Yarn-Client适合交互和调试
五、RDD
概念:只读的、可分区的分布式数据集
1、Spark计算的高容错性
血统容错机制;有一个RDD挂掉了以后spark会获取上一个RDD
2、RDD的产生
RDD的产生scala集群或者是外部文件
3、算子
转换算子(transformation):
map,filter,flatmap,union,join,mapvalues,partitionBy
行动算子(action):
count,collect,reduce,lookup,take,first,saveAsTextFile() 、saveAsSquenceFile()
控制算子:也是行动算子;eg:cache(),会计算控制算子之前的转换算子
六、Spark分区
一份待处理的原始数据会按照相应的逻辑划分为n份,每份对应到RDD中的Partition;Partition的数量决定着task的数量
1、获取RDD的partition数量
getNumPartitions();
2、如何设置分区数:
(1)在SparkConf中设置setMaster的值可以改变RDD的分区数;local==一个分区;local[2]==两个分区;local[*]==cpu核数决定
(2)创建RDD的时候可以指定分区数;sc.makeRDD(1 to 10,5)(5是分区数)
(3)通过repartition修改某个RDD的值;sc.makeRDD(1 to 10).repartition(5)
(4)自定义分区【spark自定义分区】
在使用某一个文件夹或者是很多小文件时,会采用(没有指定分区)
<1>如果从文件夹中读取会将一个文件作为一个分区
<2>如果从hdfs中读取,会将一个块作为一个分区
分区数在spark中会被对应成task任务,分区数越多处理的速度会越快但是占用的服务器资源会越多。分区数少执行速度会变慢,但是服务器占用资源少
七、宽依赖和窄依赖【spark核心概念】
窄依赖指的是父RDD的每个分区最多被一个子RDD的分区所用;宽依赖指的是子RDD依赖于父RDD的所有分区
八、stage
一个application会有一个或者多个stage,stage就是包含一组task任务的组合
spark是根据DAG来分配stage的