BigData-Notes/notes/Spark部署模式与作业提交.md
2019-05-19 21:31:36 +08:00

11 KiB
Raw Blame History

Spark部署模式与作业提交

一、作业提交
二、Local模式
三、Standalone模式
三、Spark on Yarn模式

一、作业提交

1.1 spark-submit

Spark所有模式均通过使用 spark-submit提交作业,其命令格式如下:

./bin/spark-submit \
  --class <main-class> \        # 应用程序主入口类
  --master <master-url> \       # 集群的Master Url
  --deploy-mode <deploy-mode> \ # 部署模式
  --conf <key>=<value> \        # 可选配置       
  ... # other options    
  <application-jar> \           # Jar包路径 
  [application-arguments]       #传递给主入口类的参数  

需要注意的是:在集群环境下,application-jar必须能被集群中所有节点都能访问可以是HDFS上的路径也可以是本地文件系统路径如果是本地文件系统路径则要求集群中每一个节点上的相同路径都存在该Jar包。

1.2 deploy-mode

deploy-mode有clusterclient两个可选参数,默认为client。这里以Spark On Yarn模式对两者的区别进行说明

  • 在cluster模式下Spark Drvier在应用程序Master进程内运行该进程由群集上的YARN管理提交作业的客户端可以在启动应用程序后关闭
  • 在client模式下Spark Drvier在提交作业的客户端进程中运行应用程序Master服务器仅用于从YARN请求资源。

1.3 master-url

master-url的所有可选参数如下表所示

Master URL Meaning
local 使用一个线程本地运行Spark
local[K] 使用 K 个 worker 线程本地运行 Spark
local[K,F] 使用 K 个 worker 线程本地运行 , 第二个参数为Task的失败重试次数
local[*] 使用与CPU核心数一样的线程数在本地运行Spark
local[*,F] 使用与CPU核心数一样的线程数在本地运行Spark
第二个参数为Task的失败重试次数
spark://HOST:PORT 连接至指定的standalone 集群的 master节点。端口号默认是 7077。
spark://HOST1:PORT1,HOST2:PORT2 如果standalone集群采用Zookeeper实现高可用则必须包含由zookeeper设置的所有master主机地址。
mesos://HOST:PORT 连接至给定的Mesos集群。端口默认是 5050。对于使用了 ZooKeeper 的 Mesos cluster 来说,使用 mesos://zk://...来指定地址,使用 --deploy-mode cluster模式来提交。
yarn 连接至一个YARN 集群,集群由配置的 HADOOP_CONF_DIR 或者 YARN_CONF_DIR 来决定。使用--deploy-mode参数来配置clientcluster 模式。

接下来主要介绍三种常用部署模式的配置及作业的提交。

二、Local模式

Local模式下提交作业最为简单不需要进行任何配置提交命令如下

# 本地模式提交应用
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100   # 传给SparkPi的参数

这里的spark-examples_2.11-2.4.0.jar在Spark安装包里默认就有是Spark官方提供的测试用例SparkPi用于计算Pi值执行成功后可以在输出中看到计算出的Pi值。

三、Standalone模式

Standalone是Spark提供的一种内置的集群模式采用内置的资源管理器进行管理。

下面按照如图所示演示1个Mater和2个Worker节点的集群配置这里使用两台主机进行演示

  • hadoop001 由于只有两台主机所以hadoop001既是Master节点也是Worker节点;
  • hadoop002 Worker节点。

3.1 环境配置

首先需要保证Spark已经解压在两台主机的相同路径上。然后进入hadoop001的${SPARK_HOME}/conf/目录下,拷贝配置样本并进行相关配置:

# cp spark-env.sh.template spark-env.sh

spark-env.sh中配置JDK的目录完成后将该配置使用scp命令分发到hadoop002上

# JDK安装位置
JAVA_HOME=/usr/java/jdk1.8.0_201

3.2 集群配置

${SPARK_HOME}/conf/目录下,拷贝集群配置样本并进行相关配置:

# cp slaves.template slaves

指定所有Worker节点的主机名

# A Spark Worker will be started on each of the machines listed below.
hadoop001
hadoop002

这里需要注意以下三点:

  • 主机名与IP地址的映射必须在/etc/hosts文件中已经配置否则就直接使用IP地址
  • 每个主机名必须独占一行;
  • Spark的Master主机是通过ssh访问所有的Worker节点所以需要预先配置免密登录。或者通过设置环境变量SPARK_SSH_FOREGROUND并为每个Worker节点指定密码。

3.3 启动

使用start-all.sh代表启动Master和所有Worker服务。

./sbin/start-master.sh 

访问8080端口查看Spark的Web-UI界面,,此时应该显示有两个有效的工作节点:

3.4 提交作业

# 以client模式提交到standalone集群 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop001:7077 \
--executor-memory 2G \
--total-executor-cores 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100

# 以cluster模式提交到standalone集群 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \  # 配置此参数代表开启监督如果主应用程序异常退出则自动重启Driver
--executor-memory 2G \
--total-executor-cores 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100

3.5 可选配置

在虚拟机上提交作业时经常出现一个的问题是作业无法申请到足够的资源:

Initial job has not accepted any resources; 
check your cluster UI to ensure that workers are registered and have sufficient resources

这时候可以查看Web UI我这里是内存空间不足提交命令中要求作业的executor-memory是2G但是实际的工作节点的Memory只有1G这时候你可以修改--executor-memory,也可以修改 Woker 的Memory其默认值为主机所有可用内存值减去1G。

关于Master和Woker节点的所有可选配置如下可以在spark-env.sh进行对应的配置:

Environment Variable环境变量 Meaning含义
SPARK_MASTER_HOST master 节点地址
SPARK_MASTER_PORT master 节点地址端口默认7077
SPARK_MASTER_WEBUI_PORT master 的 web UI 的端口默认8080
SPARK_MASTER_OPTS 仅用于 master 的配置属性,格式是 "-Dx=y"默认none,所有属性可以参考官方文档:spark-standalone-mode
SPARK_LOCAL_DIRS spark 的临时存储的目录用于暂存map的输出和持久化存储RDDs。多个目录用逗号分隔
SPARK_WORKER_CORES spark worker节点可以使用CPU Cores的数量。默认全部可用
SPARK_WORKER_MEMORY spark worker节点可以使用的内存数量默认全部的内存减去1GB
SPARK_WORKER_PORT spark worker节点的端口默认 random随机
SPARK_WORKER_WEBUI_PORT worker 的 web UI 的 Port端口默认8081
SPARK_WORKER_DIR worker运行应用程序的目录这个目录中包含日志和暂存空间defaultSPARK_HOME/work
SPARK_WORKER_OPTS 仅用于 worker 的配置属性,格式是 "-Dx=y"默认none。所有属性可以参考官方文档spark-standalone-mode
SPARK_DAEMON_MEMORY 分配给 spark master 和 worker 守护进程的内存。(默认: 1G
SPARK_DAEMON_JAVA_OPTS spark master 和 worker 守护进程的 JVM 选项,格式是 "-Dx=y"默认none
SPARK_PUBLIC_DNS spark master 和 worker 的公开 DNS 名称。默认none

三、Spark on Yarn模式

Spark支持将作业提交到Yarn上运行此时不需要启动Master节点也不需要启动Worker节点。

3.1 配置

spark-env.sh中配置hadoop的配置目录的位置可以使用YARN_CONF_DIRHADOOP_CONF_DIR进行指定:

YARN_CONF_DIR=/usr/app/hadoop-2.6.0-cdh5.15.2/etc/hadoop
# JDK安装位置
JAVA_HOME=/usr/java/jdk1.8.0_201

3.2 启动

必须要保证Hadoop已经启动这里包括Yarn和HDFS都需要启动因为在计算过程中Spark会使用HDFS存储临时文件如果HDFS没有启动则会抛出异常。

# start-yarn.sh
# start-dfs.sh

3.3 提交应用

#  以client模式提交到yarn集群 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--executor-memory 2G \
--num-executors 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100

#  以cluster模式提交到yarn集群 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--executor-memory 2G \
--num-executors 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100