Spark之四:Spark提交任务

/ spark / 200浏览

Spark任务提交

专业术语

术语 含义
application 基于用户编写的spark程序。
cluster manager 集群资源管理器。如YARN。
deploy mode 部署模式,有三个可选值:local、client、cluster。用来区分driver程序运行的位置。cluster模式,driver程序在集群内部被执行,client模式,driver程序在集群外部执行。也就是为啥client模式下,连接断开后任务便停止,因为driver程序被停止了。
driver 用来运行driver程序的jvm,被称为driver 。
executor 用来运行task程序的jvm,被称为executor
task 任务运行的最小单元
stage 任务的运行阶段,通常以shuffer来划分。例如:shuffer前是stage1,shuffer后是stage2。一个stage会被分成n个task来同时运行,即一个stage由多个task组成。stage可以理解为代码中的一个片段代码,task则是将这个片段拷贝了n份,同时运行

集群节点上提交应用

在集群的某个节点上提交任务是最简单的一种提交方式。例如集群共三个节点,node1、node2、node3。在三个节点中的期中一个节点上提交。提交方式如下:

spark-submit \
  --name TestSparkApp \
  --master yarn \
  --deploy-mode cluster \
  --queue root \
  --driver-memory 2G \
  --num-executors 50 \
  --executor-memory 10g \
  --executor-cores 2 \
  --class com.wdzaslzy.TestSparkApp \
  --jars /jars/xx.jar,/jars/yyy.jar \
 ./bigdata-test.jar params

deploy-mode选择可以随意,可以是client,也可以是cluster。

该方式提交的优点在于,Driver程序和Executor程序都在集群内部运行,Driver程序向Executor分发任务比较容易。

集群节点外提交应用

除了在集群节点上提交spark应用之外,集群节点外也可以进行提交(外部节点和集群节点网络想通)。一般在集群节点外提交spark应用时,选择cluster模式。如果选择client,driver程序向executor程序分发任务时会有网络IO,程序执行效率偏低。

spark-submit \
  --name TestSparkApp \
  --master spark://207.184.161.138:7077 \
  --deploy-mode cluster \
  --queue root \
  --driver-memory 2G \
  --num-executors 50 \
  --executor-memory 10g \
  --executor-cores 2 \
  --class com.wdzaslzy.TestSparkApp \
  --jars /jars/xx.jar,/jars/yyy.jar \
 ./bigdata-test.jar params

重点关注:master选项。

向不同集群提交任务

从上面的提交命令可以看出,spark应用提交在什么集群,主要由master选项控制。master具有以下可选值:

master url 说明
local 在本地模式以单线程形式运行
local[k] 在本地模式以多线程形式运行
local[K,F] 在本地以多线程运行,允许最多失败F次
local[*] 运行的线程数由本地计算机配置决定
local[*,F] 同上
spark://HOST:PORT 提交到远程spark集群上
spark://HOST1:PORT1,HOST2:PORT2 发送到spark集群中指定的几个节点
mesos://HOST:PORT 发送到mesos集群
yarn 提交到yarn集群上。yarn集群的位置通过变量:HADOOP_CONF_DIR 和YARN_CONF_DIR 来确定
k8s://HOST:PORT 提交到 Kubernetes 集群

spark提交任务时,所有的配置都由conf/spark-defaults.conf来配置,如果在spark-submit时指定了一些参数,则优先使用指定参数,如未指定,则从该配置文件中获取。后面会详细介绍该配置文件的配置。

提交任务时添加依赖

在提交spark任务时,如果发现有部分依赖的jar没有打包进来,可以通过参数 --jars来添加依赖。--jars不支持目录,只支持确定的某个jar,多个jar之间以","隔开。

jars的传入方式可以是多种