sparkStandalone
集群资源管理和任务调度的框架(类似mapreduce)
主节点:Master
从节点:Worker
spark Application运行的过程
spark程序包含2部分(Driver和Executor都是JVM进程)
Driver program:程序Main,创建sparkContext对象
Executor s:相当于线程池(有很多线程,每个线程可以运行一个Task,需要1core cpu)
spark历史服务器
spark也有历史服务器,监控已经运行完成的spark application
如何实现的:将application运行的日志信息保存起来(MapReduce运行的时候,启动了日期聚集功能:将日志信息 上传到HDFS目录),启动一个服务读取日志信息,以便前端页面展示(MrHistoryServer)
数据倾斜
hive中某个MapReduce程序可能出现数据倾斜的问题
解决问题的具体方案
第一个阶段:局部聚合
在key上添加指定返回的随机数
第二个阶段
将key前缀随机数给删除
spark性能优化
(1)相邻2个Map可以合并
(2)top N ,可以在各个分区先进行topn
例:找出年级前三,如果你还是班里第四,跟你没关系
(3)聚合函数
spark application运行Yarn上
过程:
1.启动Yarn集群
- ResourceManager/nodeManager
- 向Yarn集群提交应用,找到的是ResourceManager服务(8032),告知应用运行RM的运行的主机。
2.配置spark
配置文件:conf/spark-env.sh
配置内容:
JAVA_HOME
SCALA_HOME
HADOOP_CONF_DIR
提交应用的时候,将会去读取该目录下所有的属性文件
-a.HDFS集群的位置,读写HDFS数据
-b.Yarn集群的位置,提交应用到Yarn上运行。
3.提交应用
部署模式
–deploy-mode DEPLOY_MODE
Whether to launch the driver program locally (“client”)
or
on one of the worker machines inside the cluster (“cluster”)
(Default: client).
(1)client(默认值)
- 表示Driver程序(JVM进程)运行在本地客户端,不是运行在集群的从节点上(worker或Nodemanager)
- 本地提交之后,可以看到相关日志的输出
- 官方给我们提供spark-shell 只能运行在client端
- 在交互式命令行中编写代码,就相当于*.scala文件中main方法的代码
(2)cluster
- 表示将Driver进程运行在集群的从节点上,就是运行在worker或者Nodemanager
spark on yarn架构
job调度(面试题,重点)
整个程序sparkContext调度的
DAGScheduler
DAG调度
DAG:有向无环图
每个job划分为多个stage(阶段)
a)倒推法划分 -栈
从Job的最后一个RDD向前推依赖关系
b)判定子RDD和父RDD之间的依赖关系
宽依赖,产生shuffle,划分stage
TaskScheduler
task的调度
调度各个Stage中Task的执行,按照从前往后顺序执行stage中的task即可,
task放到executor中执行。
stage分成2种
- shuffleMapStage
除去最后一个Stage中其他stage
每个stage中的task产生的结果,类似于MapTask一样 - resultStage
job 中的最后一个,产生结果数据,类似于MapReduce中reduceTask