maven依赖 spark sql_Spark基础:应用提交

0acfba33291491c97e85d43100575ce2.png

往期链接:

Spark基础:Spark SQL入门 Spark基础:数据读写 Spark基础:读写Parquet Spark基础:读写Hive Spark基础:读写JDBC Spark基础:Spark SQL优化 Spark基础:分布式SQL查询引擎 Spark基础:Hive特性兼容 Spark基础:集群运行

在Spark的bin目录下有一个spark-submit脚本,它可以向所有支持的资源调度系统中提交应用而无需特殊的配置(如Standalone, yarn, mesos, k8s等)。这个spark-submit非常重要,无论是开源调度框架Oozie还是Spark Rest管理系统livy,底层都是基于这个spark-submit来进行作业提交的。

1 构建应用依赖

如果你的代码依赖于其他的项目,需要将他们跟应用代码一起打包,这样可以分发到spark集群中。这种既包含应用代码又包含依赖资源的jar也叫做uber jar(也叫胖jar)。sbt和maven都有对应的插件可以进行构建。如果使用maven管理依赖时,需要把spark和hadoop相关的引用配置成provided,这样在打包的时候不会把它们一起打包进去,因为这些jar一般都是集群统一进行管理的。一旦打包好就可以使用spark-submit脚本提交应用了。如果是python,可以使用--py-files添加python文件或zip包。如果依赖多个python文件,一般建议打包成zip或者egg。

2 启动应用程序

一旦打包好就可以使用spark-submit提交了,脚本会自动根据配置添加spark及相关的依赖,并支持提交到不同的资源管理系统中。

./bin/spark-submit \
--class \
--master \
--deploy-mode \
--conf = \
... # other options \
[application-arguments]

经常使用的选项有:

--class,应用的主类,比如org.apache.spark.examples.SparkPi

--master, spark集群的url,比如spark://10.10.10.10:7077

--deploy-mode, driver程序以cluster模式部署到远程,还是client模式部署到本地

--conf, key=value格式的spark配置。

application-jar,应用Jar,url需要是全路径,比如hdfs://或file://

application-arguments, 应用参数

关于部署模式的选择可以参考:如果提交应用执行spark-submit命令的机器也在其他的工作节点集群中,此时适合用client模式。在client模式中,driver程序直接由spark-submit进程启动,该进程将作为客户端与集群进行沟通。输入和输出的内容可以直接通过console控制台,这种模式非常适合类似spark-shell这种交互式编程程序。如果提交应用的机器与工作节点不在一起(比如不在一个本地集群),那么一般则推荐使用cluster模式。这样driver程序会在工作节点中启动,从而降低driver与其他工作节点的网络延迟。

目前standalone模式,不支持python应用以cluster模式运行。对于python应用,使用python文件代替,通过--py-files添加zip文件或者egg。针对不同的资源管理系统,有一些特殊的选项。比如standalone模式下,可以使用--supervise保证driver自动重启。想要查看所有的参数可以使用--help命令。

# 启动本地8核的应用
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
# 以client模式在standalone集群上运行
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
# 以cluster模式在standalone上运行,并开启supervise选项
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
# 使用yarn cluster模式
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \ # can be client for client mode
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
# 在standalone集群中启动python
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000
# 在mesos中启动cluster模式
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master mesos://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 20G \
--total-executor-cores 100 \
http://path/to/examples.jar \
1000
# 在k8s中启动cluster模式
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master k8s://xx.yy.zz.ww:443 \
--deploy-mode cluster \
--executor-memory 20G \
--num-executors 50 \
http://path/to/examples.jar \
1000

3 Master URL

master选项可以配置spark应用在哪种资源管理系统中运行,它的配置方法有很多:

local,在本地单线程启动 local[K],在本地启动K个线程 local[K, F],在本地启动K个线程,并允许F次失败 local[*], 在本地启动,线程数等于你的机器core的数量 lcoal[*, F], 在本地启动,并允许F次失败 spark://HOST:PORT, 连接到standalone集群中 spark://HOST1:PORT1,HOST2:PORT2, 连接到standalone集群,该集群使用zk做高可用 mesos://HOST:PORT, 连接到mesos yarn, 连接到yarn集群,可以通过--deploy-mode配置启动模式 k8s://HOST:PORT, 连接到k8s,目前仅支持cluster模式。

4 通过文件加载配置

spark-submit脚本可以加载配置文件并传入应用程序,默认spark会读取conf/spark-defaults.conf中的配置。加载默认的配置可以帮助spark-submit忽略掉一些提交参数,比如如果在配置文件中配置了spark.master,那么脚本就不需要再加上--master配置了。一般在代码中配置的conf具有最高优先级,其次是spark-submit中添加的参数,最后是默认配置文件中的参数。如果你不太清楚都传递了什么参数,那么可以通过启动的时候增加--verbose选项,打印详细的配置信息。

5 高级管理配置

当使用spark-submit时,应用jar和其他的依赖jar可以通过--jars自动上传到集群中。--jars可以使用逗号分隔,这个列表包含了driver和executor的classpath。不支持目录展开(directory expansion)。spark使用下面几种URL模式:file, hdfs, http, https, ftp, local 等。注意jar包和文件会被sparkContext拷贝到每个executor节点,这可能会消耗大量的时间,并需要后续进行清理操作。如果使用yarn,那么清理操作是自动的;如果使用standalone,需要配置 spark.worker.cleanup.appDataTtl 属性才能自动清理。

PS: 一般为了避免每次提交应用都在集群中上传一大堆的jar,可以配置hdfs统一缓存依赖,这样提交应用的时候可以避免再次把全部依赖上传到hdfs。如:

spark.yarn.jars = hdfs://nameservice1/user/spark/*.jar

也可以使用--packages参数指定maven依赖,通过--repositories指定仓库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值