spark submit参数及调优
生活随笔
收集整理的這篇文章主要介紹了
spark submit参数及调优
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
spark submit參數(shù)及調(diào)優(yōu)
原文地址
spark submit參數(shù)介紹
你可以通過(guò)spark-submit --help或者spark-shell --help來(lái)查看這些參數(shù)。
使用格式:?
./bin/spark-submit \
? --class <main-class> \
? --master <master-url> \
? --deploy-mode <deploy-mode> \
? --conf <key>=<value> \
? ... # other options
? <application-jar> \
? [application-arguments]
參數(shù)名 格式 參數(shù)說(shuō)明
--master MASTER_URL 如spark://host:port, mesos://host:port, yarn, ?yarn-cluster,yarn-client, local
--deploy-mode DEPLOY_MODE Client或者master,默認(rèn)是client
--class CLASS_NAME 應(yīng)用程序的主類(lèi)
--name NAME ? ? ? ? 應(yīng)用程序的名稱(chēng)
--jars JARS 逗號(hào)分隔的本地jar包,包含在driver和executor的classpath下
--packages 包含在driver和executor的classpath下的jar包逗號(hào)分隔的”groupId:artifactId:version”列表
--exclude-packages 用逗號(hào)分隔的”groupId:artifactId”列表
--repositories 逗號(hào)分隔的遠(yuǎn)程倉(cāng)庫(kù)
--py-files PY_FILES 逗號(hào)分隔的”.zip”,”.egg”或者“.py”文件,這些文件放在python app的PYTHONPATH下面
--files FILES 逗號(hào)分隔的文件,這些文件放在每個(gè)executor的工作目錄下面
--conf PROP=VALUE 固定的spark配置屬性,默認(rèn)是conf/spark-defaults.conf
--properties-file FILE 加載額外屬性的文件
--driver-memory MEM Driver內(nèi)存,默認(rèn)1G
--driver-java-options 傳給driver的額外的Java選項(xiàng)
--driver-library-path 傳給driver的額外的庫(kù)路徑
--driver-class-path 傳給driver的額外的類(lèi)路徑
--executor-memory MEM 每個(gè)executor的內(nèi)存,默認(rèn)是1G
--proxy-user NAME ? ? ? ?模擬提交應(yīng)用程序的用戶(hù)
--driver-cores NUM ? ? ? ?Driver的核數(shù),默認(rèn)是1。這個(gè)參數(shù)僅僅在standalone集群deploy模式下使用
--supervise ? ? ? Driver失敗時(shí),重啟driver。在mesos或者standalone下使用
--verbose ? ? ? 打印debug信息
--total-executor-cores NUM ? ? ? ?所有executor總共的核數(shù)。僅僅在mesos或者standalone下使用
--executor-core NUM ? ? ? ?每個(gè)executor的核數(shù)。在yarn或者standalone下使用
--driver-cores NUM ? ? ? ?Driver的核數(shù),默認(rèn)是1。在yarn集群模式下使用
--queue QUEUE_NAME 隊(duì)列名稱(chēng)。在yarn下使用
--num-executors NUM 啟動(dòng)的executor數(shù)量。默認(rèn)為2。在yarn下使用
試?yán)?#xff1a;
# Run application locally on 8 cores(本地模式8核)
./bin/spark-submit \
? --class org.apache.spark.examples.SparkPi \
? --master local[8] \
? /path/to/examples.jar \
? 100
# Run on a Spark standalone cluster in client deploy mode(standalone client模式)
./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
# Run on a Spark standalone cluster in cluster deploy mode with supervise(standalone cluster模式使用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
# Run on a YARN cluster(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
# Run on a Mesos cluster in cluster deploy mode with supervise(Mesos cluster模式使用supervise)
./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
—————————————————————————————————————————————————————————————
在公司使用最多的是spark on yarn模式,下面主要講spark on yarn
資源參數(shù)調(diào)優(yōu)
所謂的Spark資源參數(shù)調(diào)優(yōu),其實(shí)主要就是對(duì)Spark運(yùn)行過(guò)程中各個(gè)使用資源的地方,通過(guò)調(diào)節(jié)各種參數(shù),來(lái)優(yōu)化資源使用的效率,從而提升Spark作業(yè)的執(zhí)行性能。
以下參數(shù)就是Spark中主要的資源參數(shù),每個(gè)參數(shù)都對(duì)應(yīng)著作業(yè)運(yùn)行原理中的某個(gè)部分,我們同時(shí)也給出了一個(gè)調(diào)優(yōu)的參考值。
1、num-executors
參數(shù)說(shuō)明:
該參數(shù)用于設(shè)置Spark作業(yè)總共要用多少個(gè)Executor進(jìn)程來(lái)執(zhí)行。Driver在向YARN集群管理器申請(qǐng)資源時(shí),YARN集群管理器會(huì)盡可能按照你的設(shè)置來(lái)在
集群的各個(gè)工作節(jié)點(diǎn)上,啟動(dòng)相應(yīng)數(shù)量的Executor進(jìn)程。這個(gè)參數(shù)非常之重要,如果不設(shè)置的話(huà),默認(rèn)只會(huì)給你啟動(dòng)少量的Executor進(jìn)程,此時(shí)你的Spark作業(yè)的運(yùn)行速度是非常慢的。
參數(shù)調(diào)優(yōu)建議:
每個(gè)Spark作業(yè)的運(yùn)行一般設(shè)置50~100個(gè)左右的Executor進(jìn)程比較合適,設(shè)置太少或太多的Executor進(jìn)程都不好。設(shè)置的太少,無(wú)法充分利用集群資源;設(shè)置的太多的話(huà),大部分隊(duì)列可能無(wú)法給予充分的資源。
2、executor-memory
參數(shù)說(shuō)明:
該參數(shù)用于設(shè)置每個(gè)Executor進(jìn)程的內(nèi)存。Executor內(nèi)存的大小,很多時(shí)候直接決定了Spark作業(yè)的性能,而且跟常見(jiàn)的JVM OOM異常,也有直接的關(guān)聯(lián)。
參數(shù)調(diào)優(yōu)建議:
每個(gè)Executor進(jìn)程的內(nèi)存設(shè)置4G~8G較為合適。但是這只是一個(gè)參考值,具體的設(shè)置還是得根據(jù)不同部門(mén)的資源隊(duì)列來(lái)定。可以看看自己團(tuán)隊(duì)的資源隊(duì)列的最大內(nèi)存限制是多少,num-executors乘以executor-memory,是不能超過(guò)隊(duì)列的最大內(nèi)存量的。此外,如果你是跟團(tuán)隊(duì)里其他人共享這個(gè)資源隊(duì)列,那么申請(qǐng)的內(nèi)存量最好不要超過(guò)資源隊(duì)列最大總內(nèi)存的1/3~1/2,避免你自己的Spark作業(yè)占用了隊(duì)列所有的資源,導(dǎo)致別的同學(xué)的作業(yè)無(wú)法運(yùn)行。
3、executor-cores
參數(shù)說(shuō)明:
該參數(shù)用于設(shè)置每個(gè)Executor進(jìn)程的CPU core數(shù)量。這個(gè)參數(shù)決定了每個(gè)Executor進(jìn)程并行執(zhí)行task線程的能力。因?yàn)槊總€(gè)CPU core同一時(shí)間只能執(zhí)行一個(gè)task線程,因此每個(gè)Executor進(jìn)程的CPU core數(shù)量越多,越能夠快速地執(zhí)行完分配給自己的所有task線程。
參數(shù)調(diào)優(yōu)建議:
Executor的CPU core數(shù)量設(shè)置為2~4個(gè)較為合適。同樣得根據(jù)不同部門(mén)的資源隊(duì)列來(lái)定,可以看看自己的資源隊(duì)列的最大CPU core限制是多少,再依據(jù)設(shè)置的Executor數(shù)量,來(lái)決定每個(gè)Executor進(jìn)程可以分配到幾個(gè)CPU core。同樣建議,如果是跟他人共享這個(gè)隊(duì)列,那么num-executors * executor-cores不要超過(guò)隊(duì)列總CPU core的1/3~1/2左右比較合適,也是避免影響其他同學(xué)的作業(yè)運(yùn)行。
4、driver-memory
參數(shù)說(shuō)明:
該參數(shù)用于設(shè)置Driver進(jìn)程的內(nèi)存。
參數(shù)調(diào)優(yōu)建議:
Driver的內(nèi)存通常來(lái)說(shuō)不設(shè)置,或者設(shè)置1G左右應(yīng)該就夠了。唯一需要注意的一點(diǎn)是,如果需要使用collect算子將RDD的數(shù)據(jù)全部拉取到Driver上進(jìn)行處理,那么必須確保Driver的內(nèi)存足夠大,否則會(huì)出現(xiàn)OOM內(nèi)存溢出的問(wèn)題。
5、spark.default.parallelism
參數(shù)說(shuō)明:
該參數(shù)用于設(shè)置每個(gè)stage的默認(rèn)task數(shù)量。這個(gè)參數(shù)極為重要,如果不設(shè)置可能會(huì)直接影響你的Spark作業(yè)性能。
參數(shù)調(diào)優(yōu)建議:
Spark作業(yè)的默認(rèn)task數(shù)量為500~1000個(gè)較為合適。很多同學(xué)常犯的一個(gè)錯(cuò)誤就是不去設(shè)置這個(gè)參數(shù),那么此時(shí)就會(huì)導(dǎo)致Spark自己根據(jù)底層HDFS的block數(shù)量來(lái)設(shè)置task的數(shù)量,默認(rèn)是一個(gè)HDFS block對(duì)應(yīng)一個(gè)task。通常來(lái)說(shuō),Spark默認(rèn)設(shè)置的數(shù)量是偏少的(比如就幾十個(gè)task),如果task數(shù)量偏少的話(huà),就會(huì)導(dǎo)致你前面設(shè)置好的Executor的參數(shù)都前功盡棄。試想一下,無(wú)論你的Executor進(jìn)程有多少個(gè),內(nèi)存和CPU有多大,但是task只有1個(gè)或者10個(gè),那么90%的Executor進(jìn)程可能根本就沒(méi)有task執(zhí)行,也就是白白浪費(fèi)了資源!因此Spark官網(wǎng)建議的設(shè)置原則是,設(shè)置該參數(shù)為num-executors * executor-cores的2~3倍較為合適,比如Executor的總CPU core數(shù)量為300個(gè),那么設(shè)置1000個(gè)task是可以的,此時(shí)可以充分地利用Spark集群的資源。
6、spark.storage.memoryFraction
參數(shù)說(shuō)明:
該參數(shù)用于設(shè)置RDD持久化數(shù)據(jù)在Executor內(nèi)存中能占的比例,默認(rèn)是0.6。也就是說(shuō),默認(rèn)Executor 60%的內(nèi)存,可以用來(lái)保存持久化的RDD數(shù)據(jù)。根據(jù)你選擇的不同的持久化策略,如果內(nèi)存不夠時(shí),可能數(shù)據(jù)就不會(huì)持久化,或者數(shù)據(jù)會(huì)寫(xiě)入磁盤(pán)。
參數(shù)調(diào)優(yōu)建議:
如果Spark作業(yè)中,有較多的RDD持久化操作,該參數(shù)的值可以適當(dāng)提高一些,保證持久化的數(shù)據(jù)能夠容納在內(nèi)存中。避免內(nèi)存不夠緩存所有的數(shù)據(jù),導(dǎo)致數(shù)據(jù)只能寫(xiě)入磁盤(pán)中,降低了性能。但是如果Spark作業(yè)中的shuffle類(lèi)操作比較多,而持久化操作比較少,那么這個(gè)參數(shù)的值適當(dāng)降低一些比較合適。此外,如果發(fā)現(xiàn)作業(yè)由于頻繁的gc導(dǎo)致運(yùn)行緩慢(通過(guò)spark web ui可以觀察到作業(yè)的gc耗時(shí)),意味著task執(zhí)行用戶(hù)代碼的內(nèi)存不夠用,那么同樣建議調(diào)低這個(gè)參數(shù)的值。
7、spark.shuffle.memoryFraction
參數(shù)說(shuō)明:
該參數(shù)用于設(shè)置shuffle過(guò)程中一個(gè)task拉取到上個(gè)stage的task的輸出后,進(jìn)行聚合操作時(shí)能夠使用的Executor內(nèi)存的比例,默認(rèn)是0.2。也就是說(shuō),Executor默認(rèn)只有20%的內(nèi)存用來(lái)進(jìn)行該操作。shuffle操作在進(jìn)行聚合時(shí),如果發(fā)現(xiàn)使用的內(nèi)存超出了這個(gè)20%的限制,那么多余的數(shù)據(jù)就會(huì)溢寫(xiě)到磁盤(pán)文件中去,此時(shí)就會(huì)極大地降低性能。
參數(shù)調(diào)優(yōu)建議:
如果Spark作業(yè)中的RDD持久化操作較少,shuffle操作較多時(shí),建議降低持久化操作的內(nèi)存占比,提高shuffle操作的內(nèi)存占比比例,避免shuffle過(guò)程中數(shù)據(jù)過(guò)多時(shí)內(nèi)存不夠用,必須溢寫(xiě)到磁盤(pán)上,降低了性能。此外,如果發(fā)現(xiàn)作業(yè)由于頻繁的gc導(dǎo)致運(yùn)行緩慢,意味著task執(zhí)行用戶(hù)代碼的內(nèi)存不夠用,那么同樣建議調(diào)低這個(gè)參數(shù)的值。
資源參數(shù)的調(diào)優(yōu),沒(méi)有一個(gè)固定的值,需要根據(jù)自己的實(shí)際情況(包括Spark作業(yè)中的shuffle操作數(shù)量、RDD持久化操作數(shù)量以及spark web ui中顯示的作業(yè)gc情況),合理地設(shè)置上述參數(shù)。
資源參數(shù)參考示例
以下是一份spark-submit命令的示例,大家可以參考一下,并根據(jù)自己的實(shí)際情況進(jìn)行調(diào)節(jié):
./bin/spark-submit \
? --master yarn-cluster \
? --num-executors 100 \
? --executor-memory 6G \
? --executor-cores 4 \
? --driver-memory 1G \
? --conf spark.default.parallelism=1000 \
? --conf spark.storage.memoryFraction=0.5 \
? --conf spark.shuffle.memoryFraction=0.3 \
總結(jié)
以上是生活随笔為你收集整理的spark submit参数及调优的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SparkSQL中UDAF案例分析
- 下一篇: 每日top3热点搜索词统计案例