spark是一个非常好用的大数据分布式计算框架。套话不多说,直接进入正题。spark的开发和测试中经常会使用spark submit脚本将编写好的spark应用(比如java和scala编写并打包好的jar包)提交给spark集群进行处理。为了方便调试,经常需要向main方法传递参数,但是目前很多博文介绍的大多都是关于spark-submit参数调优方面的。那么如何在spark submit脚本中向main方法传递参数呢?如果参数中包含空格该如何处理呢?
另外除了spark submit脚本之外,还可以使用SparkLauncher向spark集群提交应用,具体可以参考博客:
https://www.jianshu.com/p/36193b394a50
object TestMain{
def main(args: Array[String]):Unit {
......
}
}
先来看一个spark submit脚本示例:
spark2-submit \ # 第1行
--class com.google.datalake.TestMain \ #第2行
--master yarn \ # 第3行
--deploy-mode client \ # 第4行
--driver-memory 3g \ # 第5行
--executor-memory 2g \ # 第6行
--total-executor-cores 12 \ # 第7行
--jars /home/jars/test-dep-1.0.0.jar,/home/jars/test-dep2-1.0.0.jar,/home/jars/test-dep3-1.0.0.jar \ # 第8行
/home/release/jars/test-sql.jar \ # 第9行
para1 \ # 第10行
para2 \ # 第11行
"test sql" \ # 第12行
parax # 第13行
示例分析:
- 第1行:指定该脚本是一个spark submit脚本(spark老版本是spark-submit,新版本spark2.x是spark2-submit);
- 第2行:指定main类的路径;
- 第3行:指定master(使用第三方yarn作为spark集群的master);
- 第4行:指定deploy-mode(应用模式,driver进程运行在spark集群之外的机器,从集群角度来看该机器就像是一个client);
- 第5行:分配给driver的内存为3g,也可用m(兆)作为单位;
- 第6行:分配给单个executor进程的内存为2g,也可用m(兆)作为单位;
- 第7行:分配的所有executor核数(executor进程数最大值);
- 第8行:运行该spark application所需要额外添加的依赖jar,各依赖之间用逗号分隔;
- 第9行:被提交给spark集群执行的application jar;
- 第10~13行:传递给main方法的参数,按照添加顺序依次传入,如果某个参数含有空格则需要使用双引号将该参数扩起来;
spark submit脚本中各参数顺序的注意事项:
- 每个参数(最后一个参数除外)后需要先空格再使用\表示结尾;
- spark2-submit必须写在最前面;
- class、master yarn、deploy-mode client等使用了--标注的参数的顺序可以相互调整;
- application jar名这个参数必须写在使用了--标注的参数后;
- 向main方法传递的参数必须写在application jar之后。
网友评论