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包很大。