一、Spark是什么?
Spark是基于DAG(有向无环图)的内存计算引擎.
二、Spark的安装部署
Spark和MapReduce效率不同的原因:
Spark把运算的中间数据存放在内存,迭代计算效率更高;
MapReduce的中间结果需要落地,需要保存到磁盘,这样必然会有磁盘io操作,影响性能。
Standalone模式
单机(Master+Worker同时运行)
ly@hadoop00 spark-2.2.0-bin-hadoop2.7 % echo $SPARK_HOME
/Users/ly/apps/spark-2.2.0-bin-hadoop2.7
$SPARK_HOME/sbin/start-all.sh
ly@hadoop00 spark-2.2.0-bin-hadoop2.7 % jps
19984 Master
20015 Worker
ly@hadoop00 spark-2.2.0-bin-hadoop2.7 % netstat -an|grep 7077
tcp4 0 0 192.168.237.1.7077 192.168.237.1.61730 ESTABLISHED
tcp4 0 0 192.168.237.1.61730 192.168.237.1.7077 ESTABLISHED
tcp4 0 0 192.168.237.1.7077 *.* LISTEN
ly@hadoop00 spark-2.2.0-bin-hadoop2.7 % netstat -an|grep 8080
tcp46 0 0 *.8080 *.* LISTEN
tcp4 0 0 10.9.70.214.61305 109.244.128.37.8080 ESTABLISHED
Spark Standalone Master : spark://hadoop00:7077??
?webui http://hadoop00:8080
?多机(1个Master+N个Worker)
Master节点配置:
# spark-env.sh
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home
#使spark运行在yarn上,必配,否则连不上YARN,并访问不了HDFS
export HADOOP_HOME=${HADOOP_HOME:-/Users/ly/apps/hadoop}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/Users/ly/apps/hadoop/etc/hadoop}
# slaves
hadoop00
hadoop01
Slave节点配置:
# spark-env.sh
export JAVA_HOME=${JAVA_HOME:-/opt/jdk1.8.0_251}
export SPARK_MASTER_HOST=hadoop00
?在Master上运行sbin/start-all.sh
ly@hadoop00 spark-2.2.0-bin-hadoop2.7 % sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /Users/ly/apps/spark-2.2.0-binhadoop2.7/logs/spark-ly-org.apache.spark.deploy.master.Master-1-hadoop00.out
hadoop00: starting org.apache.spark.deploy.worker.Worker, logging to /Users/ly/apps/spark-2.2.0-
bin-hadoop2.7/logs/spark-ly-org.apache.spark.deploy.worker.Worker-1-hadoop00.out
hadoop01: starting org.apache.spark.deploy.worker.Worker, logging to /Users/ly/apps/spark-2.2.0-
bin-hadoop2.7/logs/spark-ly-org.apache.spark.deploy.worker.Worker-1-hadoop01.out
ly@hadoop00 spark-2.2.0-bin-hadoop2.7 % jps
20320 Jps
20304 Worker
20263 Master
[ly@hadoop01 spark-2.2.0-bin-hadoop2.7]$ jps
14464 Jps
14403 Worker
?webui: hadoop00:8080
?Demo:运行一个SparkPi
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop00:7077 \
/Users/ly/apps/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 100
?history server配置:
# 修改spark-default.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://qianfeng01:8020/directory
spark.eventLog.compress true
# 修改spark-env.sh文件,添加如下配置
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=4000 -Dspark.history.retainedApplications=10
-Dspark.history.fs.logDirectory=hdfs://qianfeng01:8020/directory"
# 启动start-history-server.sh (start-all.sh先启动)
ly@hadoop00 spark-2.2.0-bin-hadoop2.7 % jps
21234 HistoryServer
# 访问hadoop00:4000
集群架构
?Yarn 模式
集群搭建
1 在Hadoop配置下的yarn-site.xml?件中增加以下两项:
# 这两项判断是否启动?个线程检查每个任务正使?的物理内存量/虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true
# 如果不配置这两个选项,在spark-on-yarn的client模式下,可能会报错,导致程序被终?。
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
?2 修改Spark-env.sh 添加:
HADOOP_CONF_DIR=/Haodop路径/hadoop-2.7.3/etc/hadoop
YARN_CONF_DIR=/Haodop路径/hadoop-2.7.3/etc/hadoop
YARN-Client?
在Yarn-client中,Driver运?在Client上,通过ApplicationMaster向RM获取资源。本地Driver负责与所有的 executor container进?交互,并将最后的结果汇总。结束掉终端,相当于kill掉这个spark应?。
启动命令
./bin/spark-submit
--class org.apache.spark.examples.SparkPi
--master yarn
--deploy-mode client
--driver-cores 1
--driver-memory 600M
--executor-memory 800M
--executor-cores 2
--num-executors 1
/usr/local/spark-2.2.0/examples/jars/spark-examples_2.11-2.2.0.jar 100
因为Driver在客户端,所以可以通过webUI访问Driver的状态,默认是http://hadoop1:4040访问,?YARN通过 http:// hadoop1:8088访问。
YARN-client的工作流程
- Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContent初始化中将创建DAGScheduler和TASKScheduler等,由于我们选择的是Yarn-Client模式,程序会选择YarnClientClusterScheduler和YarnClientSchedulerBackend
- ResourceManager收到请求后,在集群中选择?个NodeManager,为该应?程序分配第?个
- Container,要求它在这个Container中启动应?程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运?SparkContext,只与SparkContext进?联系进?资源的分派
- Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container)
- ?旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task
- Client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运?Task并向Driver汇报运?的状态和进度,以让Client随时掌握各个任务的运?状态,从?可以在任务失败时重新启动任务应?程序运?完成后,Client的SparkContext向ResourceManager申请注销并关闭自己
- 客户端的Driver将应?提交给Yarn后,Yarn会先后启动ApplicationMaster和executor,另外ApplicationMaster 和executor都 是装载在container?运?,container默认的内存是1G,ApplicationMaster分配的内存是driver-memory,executor分配的内存是executor-memory。同时,因为Driver在客户端,所以程序的运?结果可以在客 户端显 示,Driver以进程名为SparkSubmit的形式存在。
注意:因为是与Client端通信,所以Client不能关闭。
YARN-Cluster
- Spark Yarn Client向YARN中提交应?程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运?的程序等
- ResourceManager收到请求后,在集群中选择?个NodeManager,为该应?程序分配第?个Container,要求它在这个Container中启动应?程序的ApplicationMaster,其中ApplicationMaster进?SparkContext等的初始化
- ApplicationMaster向ResourceManager注册,这样?户可以直接通过ResourceManage查看应?程序的运?状态,然后它将采?轮询的?式通过RPC协议为各个任务申请资源,并监控它们的运?状态直到运?结束
- ?旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,?Executor对象的创建及维护是由CoarseGrainedExecutorBackend负责的,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这?点和Standalone模式?样,只不过SparkContext在Spark Application中初始化时,使?CoarseGrainedSchedulerBackend配合YarnClusterScheduler进?任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的?个简单包装,增加了对Executor的等待逻辑等
- ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运?Task并向ApplicationMaster汇报运?的状态和进度,以让ApplicationMaster随时掌握各个任务的运?状态,从?可以在任务失败时重新启动任务?
- ?应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己
YARN-Cluster和YARN-Client的区别
- 理解YARN-Client和YARN-Cluster深层次的区别之前先清楚?个概念:Application Master。在YARN中,每 个Application实例都有?个ApplicationMaster进程,它是Application启动的第?个容器。它负责和 ResourceManager打交道并请求资源,获取资源之后告诉NodeManager为其启动Container。从深层次的含义讲YARN-Cluster和YARN-Client模式的区别其实就是ApplicationMaster进程的区别
- YARN-Cluster模式下,Driver运?在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而YARN-Cluster模式不适合运行交互类型的作业
- YARN-Client模式下,Application Master仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们?作,也就是说Client不能离开
总结
- Yarn Cluster的Driver是在集群的某?台NM上,但是Yarn-Client就是在RM的机器上
- 而Driver会和Executors进行通信,所以Yarn cluster在提交App之后可以关闭Client,而Yarn Client 不可以
- Yarn-Cluster适合生产环境,Yarn-Client适合交互和调试。
三、Spark作业提交原理?
Demo:Spark提供的利用蒙特·卡罗算法求π值的案例,100这个参数是计算因子
在spark的安装目录bin目录执行:
./spark-submit --class org.apache.spark.examples.SparkPi \
--master spark://qianfeng01:7077 \
/usr/local/spark-2.2.0/examples/jars/spark-examples_2.11-2.2.0.jar 100
注: 我们可以自行访问WebUI界面查看其过程,在命令行查看结果即可?。
启动任务的时候并没有指定分配资源,而是有多少资源就使用了多少资源。跑任务的时候是可以指定资源的, 可以指定使用核数和内存资源。
./spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://qianfeng01:7077 \
--executor-memory 512m \
--total-executor-cores 2 \
/usr/local/spark-2.2.0/examples/jars/spark-examples_2.11-2.2.0.jar 100
--executor-memory 设置内存
--total-executor-cores 核数
原理如图所示:
名词解释
1.Standalone模式下存在的角色
- Client:客户端进程,负责提交作业到Master。
- Master:Standalone模式中主控节点,负责接收Client提交的作业,管理Worker,并命令Worker启动Driver和Executor。
- Worker:Standalone模式中slave节点上的守护进程,负责管理本节点的资源,定期向Master汇报心跳,接收Master的命令,启动Driver和Executor。
- Driver: ?个Spark作业运行时包括?个Driver进程,也是作业的主进程,负责作业的解析、?成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。
- Executor:即真正执行作业的地方,?个集群?般包含多个Executor,每个Executor接收Driver的命令LaunchTask,?个Executor可以执??到多个Task。
2.作业相关的名词解释
- Stage:一个Spark作业一般包含一至多个Stage。
- Task:一个Stage包含一至多个Task,通过多个Task实现并行运行的功能。
- DAGScheduler: 实现将Spark作业分解成?到多个Stage,每个Stage根据RDD的Partition个数决定Task的个数,然后生成相应的Task set放到TaskScheduler中。
- TaskScheduler:实现Task分配到Executor上执行。
四、Spark Shell
spark-shell是Spark自带的交互式Shell程序,?便?户进?交互式编程,?户可以在该命令?下?Scala编写Spark程序。
spark-shell程序?般?作Spark程序测试练习来?。spark-shell属于Spark的特殊应?程序,我们可以在这个特殊的应?程序中提交应?程序。
spark-shell启动有两种模式,分别为local模式和cluster模式。
Local模型
启动命令:spark-shell
local模式仅在本机启动?个SparkSubmit进程,没有与集群建立联系,虽然进程中有SparkSubmit但是不会被提交到集群。
Cluster模式(集群模式)
spark-shell \
--master spark://hadoop01:7077 \
--executor-memory 512m \
--total-executor-cores 1
# 后两个命令不是必须的 --master这条命令是必须的(除?在jar包中已经指可以不指定,不然就必须指定)
注: 启动spark-shell若是集群模式,在webUI会有?个?直执行的任务。
退出shell
注意:不要使用ctrl+c退出spark-shell
正确方法:使用?:quit 退出
若使用了ctrl+c退出,使用命令查看监听端口 netstat -anp | grep 4040 ,再使用kill -9 pid杀死即可。
|