概述
- Spark 的运行模式有 Local(也称单节点模式),Standalone(集群模式),Spark on Yarn(运行在Yarn上),Mesos以及K8s等常用模式,本文介绍前三种模式。
Spark-shell 参数
- Spark-shell 是以一种交互式命令行方式将Spark应用程序跑在指定模式上,也可以通过Spark-submit提交指定运用程序,Spark-shell 底层调用的是Spark-submit,二者的使用参数一致的,通过- -help 查看参数:
- -master: 指定运行模式,spark://host:port, mesos://host:port, yarn, or local[n].
- -deploy-mode: 指定将driver端运行在client 还是在cluster.
- -class: 指定运行程序main方法类名,一般是应用程序的包名+类名
- -name: 运用程序名称
- -jars: 需要在driver端和executor端运行的jar,如mysql驱动包
- -packages: maven管理的项目坐标GAV,多个以逗号分隔
- -conf: 以key=value的形式传入sparkconf参数,所传入的参数必须是以spark.开头
- -properties-file: 指定新的conf文件,默认使用spark-default.conf
- -driver-memory:指定driver端运行内存,默认1G
- -driver-cores:指定driver端cpu数量,默认1,仅在Standalone和Yarn的cluster模式下
- -executor-memory:指定executor端的内存,默认1G
- -total-executor-cores:所有executor使用的cores
- -executor-cores: 每个executor使用的cores
- -driver-class-path: driver端的classpath
- -executor-class-path:executor端的classpath
- sparkconf的传入有三种方式:
- 1.通过在spark应用程序开发的时候用set()方法进行指定
- 2.通过在spark应用程序提交的时候用过以上参数指定,一般使用此种方式,因为使用较为灵活
- 3.通过配置spark-default.conf,spark-env.sh文件进行指定,此种方式较shell方式级别低
Local模式
- Local 模式是最简单的一种Spark运行方式,它采用单节点多线程(cpu)方式运行,local模式是一种OOTB(开箱即用)的方式,只需要在spark-env.sh导出JAVA_HOME,无需其他任何配置即可使用,因而常用于开发和学习
- 方式:./spark-shell - -master local[n] ,n代表线程数
Standalone模式
- Spark可以通过部署与Yarn的架构类似的框架来提供自己的集群模式,该集群模式的架构设计与HDFS和Yarn大相径庭,都是由一个主节点多个从节点组成,在Spark 的Standalone模式中,主,即为master;从,即为worker.
- Standalone集群模式通过配置spark-env.sh和slaves文件来部署,可以通过以下配置
1. vi spark-env.sh
2. SPARK_MASTER_HOST=192.168.137.200 ##配置Master节点
3. SPARK_WORKER_CORES=2 ##配置应用程序允许使用的核数(默认是所有的core)
4. SPARK_WORKER_MEMORY=2g ##配置应用程序允许使用的内存(默认是一个G)
5. vi slaves
6. 192.168.137.200
7. 192.168.137.201
8. 192.168.137.202
- 启动集群
1. sbin/start-all.sh
Web UI:192.168.137.200:8080
Spark on Yarn
- 简而言之,Spark on Yarn 模式就是将Spark应用程序跑在Yarn集群之上,通过Yarn资源调度将executor启动在container中,从而完成driver端分发给executor的各个任务。将Spark作业跑在Yarn上,首先需要启动Yarn集群,然后通过spark-shell或spark-submit的方式将作业提交到Yarn上运行。
- 提交作业之前需要将HADOOP_CONF_DIR或YARN_CONF_DIR配置到Spark-env.sh中:
1. vi spark-env.sh
2. HADOOP_CONF_DIR=/opt/software/hadoop-2.6.0-cdh5.7.0/etc/hadoop
on Yarn的俩种模式
- Yarn的俩种模式:一种为 client;一种为 cluster,可以通过- -deploy-mode 进行指定,也可以直接在 - -master 后面使用 yarn-client和yarn-cluster进行指定
- 俩种模式的区别:在于driver端启动在本地(client),还是在Yarn集群内部的AM中(cluster)
Client 模式
- 客户端的Driver将应用提交给Yarn后,Yarn会先后启动ApplicationMaster和excutor,另外ApplicationMaster和executor都装在在container里运行,container默认的内存是1g,ApplicationMaster分配的内存是driver-memory,executor分配的内存是executor-memory.同时,因为Driver在客户端,所以程序的运行结果可以在客户端显示,Driver以进程名为SparkSubmit的形式存在。
Cluster 模式
- 1.由client向ResourceManager提交请求,并上传Jar到HDFS上
这期间包括四个步骤:
a).连接到RM
b).从RM ASM(applicationsManager)中获得metric,queue和resource等信息。
c).upload app jar and spark-assembly jar
d).设置运行环境和container上下文 - 2.ResourceManager向NodeManager申请资源,创建Spark ApplicationMaster(每个SparkContext都有一个ApplicationManager)
- 3.NodeManager启动Spark App Master,并向ResourceManager ASM注册
- 4.Spark ApplicationMaster从HDFS中找到jar文件,启动DAGScheduler和YARN Cluster Scheduler
- 5.ResourceManager向ResourceManager ASM注册申请container资源(INFO YarnClientImpl: Submitted application)
- 6.ResourceManager通知NodeManager分配Container,这是可以收到来自ASM关于container的报告。(每个container的对应一个executor)
- 7.Spark ApplicationMaster直接和container(executor)进行交互,完成这个分布式任务。
on Yarn 部分参数调优
- spark.yarn.jars/spark.yarn.archive
将本地jar包上传到hdfs,然后通过这个参数指定上传路径:
1. [hadoop@hadoop001 spark-2.2.0-bin-2.6.0-cdh5.7.0]$ hdfs dfs -mkdir -p /spark/jars
2. [hadoop@hadoop001 spark-2.2.0-bin-2.6.0-cdh5.7.0]$ hdfs dfs -put jars/ /spark/jars
3. vi spark-defaults.conf
4. spark.yarn.jars hdfs:///spark/jars/*
- spark.port.maxRetries 能够启动的最大程序数+1,根据实际业务设置
- *