spark-submit 参数

1、基础:

spark基本的提交语句:

./bin/spark-submit \ --class <main-class> \ --master <master-url> \ --deploy-mode <deploy-mode> \ --conf <key>=<value> \ ... # other options <application-jar> \ [application-arguments]

参数的含义:

    --class: 主函数所在的类。
    --master: master的url,后面会解释 (e.g. spark://23.195.26.187:7077)
    --deploy-mode: 部署driver在本地还是集群的一个work节点上,这也是client模式与cluster模式的区别。默认是client的模式。
    --conf:用 key=value形式指定参数,如果包含空格那么要用双引号引起来,例如“key=value”
    application-jar:jar包的路径.该路径必须在集群内全局可见。 例如: hdfs:// path 或者 file:// 这个path必须是所有节点都存在。.
    application-arguments: 传递给main函数 参数,如java main方法中的args[].

 2、例子:

/usr/hdp/2.6.4.0-91/spark/bin/spark-submit 
--master yarn 
--deploy-mode cluster 
--class com.test.main.SparkCompute 
--executor-memory "25g" 
--driver-memory "4g" 
--executor-cores "5" 
--num-executors "4"  
--conf "spark.executor.extraClassPath=/usr/hdp/current/hadoop-yarn-client/lib/ojdbc6-11.2.0.3.0.jar:/usr/hdp/current/hadoop-yarn-client/lib/mysql-connector-java-5.1.27.jar:/usr/hdp/current/hive-server2/lib/hive-hbase-handler.jar:/usr/hdp/current/hbase-client/lib/guava-12.0.1.jar:/usr/hdp/current/hbase-client/lib/hbase-client.jar:/usr/hdp/current/hbase-client/lib/hbase-common.jar:/usr/hdp/current/hbase-client/lib/hbase-protocol.jar:/usr/hdp/current/hbase-client/lib/hbase-server.jar" 
--conf "spark.executor.extraJavaOptions=-server -XX:+UseG1GC -XX:MaxGCPauseMillis=50" 
--principal test001@COM  
--jars /usr/hdp/2.6.4.0-91/spark/lib/datanucleus-api-jdo-3.2.6.jar,/usr/hdp/2.6.4.0-91/spark/lib/datanucleus-core-3.2.10.jar,/usr/hdp/2.6.4.0-91/spark/lib/datanucleus-rdbms-3.2.9.jar 
--files /usr/hdp/2.6.4.0-91/spark/conf/hive-site.xml,/usr/hdp/current/hbase-client/conf/hbase-site.xml,/var/kerberos/krb5kdc/yg001-edt.keytab 
--keytab /var/kerberos/krb5kdc/test001.keytab 

/home/cktest/test-compute-1.1.0-SNAPSHOT.jar 

--driver-memory 4g 
--executor-memory 25g 
--executor-cores 5 
--num-executors 4 
--partitions "20" 
--jumpProcessor "true" 
--jumpReader "false" 
--jumpTransfer "true" 
--startMonth "201904" --kbIndexName "dwfx_test_mx_dwkb0531-1" --esNode "10.121.8.12" --jumpWriter "true" --esPort "9200" --nameSpace "dwcompute" --endMonth "201904" --ftIndexName "dwfx_test_mx_cbft-0531-1" --onlyIncludeMainData "false" --oracleUrl "jdbc:oracle:thin:dw_compute/[email protected]:1521:orcl" --useHbase "false" --oracleTableSpace "FMIS_TOP"

参数列表:

  • --master

 MASTER_URL, 可以是spark://host:port, mesos://host:port, yarn,  yarn-cluster,yarn-client, local

  • --deploy-mode

DEPLOY_MODE, Driver程序运行的地方,client或者cluster,默认是client。

  • --class

CLASS_NAME, 主类名称,含包名

  • --jars

逗号分隔的本地JARS, Driver和executor依赖的第三方jar包

  • --files

用逗号隔开的文件列表,会放置在每个executor工作目录中

  • --conf

spark的配置属性

  • --driver-memory

Driver程序使用内存大小(例如:1000M,5G),默认1024M

  • --executor-memory

每个executor内存大小(如:1000M,2G),默认1G

Spark standalone with cluster deploy mode only:

  • --driver-cores

Driver程序的使用core个数(默认为1),仅限于Spark standalone模式

Spark standalone or Mesos with cluster deploy mode only:

  • --supervise

失败后是否重启Driver,仅限于Spark  alone或者Mesos模式

Spark standalone and Mesos only:

  • --total-executor-cores

executor使用的总核数,仅限于SparkStandalone、Spark on Mesos模式

Spark standalone and YARN only:

  • --executor-cores

每个executor使用的core数,Spark on Yarn默认为1,standalone默认为worker上所有可用的core。

YARN-only:

  • --driver-cores

driver使用的core,仅在cluster模式下,默认为1。

  • --queue

QUEUE_NAME  指定资源队列的名称,默认:default

  • --num-executors

一共启动的executor数量,默认是2个。

 

重点说明1、conf:动态加载Spark属性

在某些场景下,你可能需要避免将属性值写死在 SparkConf 中。例如,你可能希望在同一个应用上使用不同的master或不同的内存总量。Spark允许你简单地创建一个空的SparkConf对象:

val sc = new SparkContext(new SparkConf())

然后在运行时设置这些属性:

./bin/spark-submit --name "My app" --master local[4] --conf spark.eventLog.enabled=false
  --conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" myApp.jar

Spark shell和spark-submit工具支持两种动态加载配置的方法。第一种,通过命令行选项,如:上面提到的–master(设置master URL)。spark-submit可以在启动Spark应用时,通过–conf标志接受任何属性配置,同时有一些特殊配置参数同样可用(如,–master)。运行./bin/spark-submit –help可以展示这些选项的完整列表。

Spark任务提交jar包依赖解决方案

通常我们将spark任务编写后打包成jar包,使用spark-submit进行提交,因为spark是分布式任务,如果运行机器上没有对应的依赖jar文件就会报ClassNotFound的错误。
下面有三个解决方法:

重点说明2、spark-submit –jars

根据spark官网,在提交任务的时候指定–jars,用逗号分开。这样做的缺点是每次都要指定jar包,如果jar包少的话可以这么做,但是如果多的话会很麻烦。

spark-submit --master yarn-client --jars ***.jar,***.jar(你的jar包,用逗号分隔) mysparksubmit.jar

如果你使用了sbt的话,并且在build.sbt中配置好了依赖并下载完成,那么你可以直接去用户home目录下的.ivy/cache/中拷贝你的jar需要的jar包

重点说明3、extraClassPath

提交时在spark-default中设定参数,将所有需要的jar包考到一个文件里,然后在参数中指定该目录就可以了,较上一个方便很多:

spark.executor.extraClassPath=/home/hadoop/wzq_workspace/lib/*
spark.driver.extraClassPath=/home/hadoop/wzq_workspace/lib/*

需要注意的是,你要在所有可能运行spark任务的机器上保证该目录存在,并且将jar包考到所有机器上。这样做的好处是提交代码的时候不用再写一长串jar了,缺点是要把所有的jar包都拷一遍。

 

方法三:sbt-assembly或maven-assembly

        如果你还是觉得第二种麻烦,这种方法是将所有依赖的jar包,包括你写的代码全部打包在一起。使用sbt工具或者maven工具打包,这种方法打包后会使得jar包很大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章