屬性名
預設值
含義
<code>spark.memory.fraction</code>
0.75
<code>spark.memory.storagefraction</code>
0.5
<code>spark.memory.offheap.enabled</code>
true
如果true,spark會嘗試使用堆外記憶體。啟用 後,spark.memory.offheap.size必須為正數。
<code>spark.memory.offheap.size</code>
堆外記憶體配置設定的大小(絕對值)。這個設定不會影響堆記憶體的使用,是以你的執行器總記憶體必須适應jvm的堆記憶體大小。必須要設為正數。并且前提是 spark.memory.offheap.enabled=true.
<code>spark.memory.uselegacymode</code>
false
是否使用老式的記憶體管理模式(1.5以及之前)。老模式在堆記憶體管理上更死闆,使用固定劃分的區域做不同功能,潛在的會導緻過多的資料溢出到磁盤(如果不小心調整性能)。必須啟用本參數,以下選項才可用:
<code></code><code>spark.shuffle.memoryfraction</code>
<code>spark.storage.memoryfraction</code>
<code>spark.storage.unrollfraction</code>
<code>spark.shuffle.memoryfraction</code>
0.2
(廢棄)必須先啟用spark.memory.uselegacymode這個才有用。
混洗階段用于聚合和協同分組的jvm堆記憶體比例。在任何指定的時間,所有用于混洗的記憶體總和不會超過這個上限,超出的部分會溢出到磁盤上。如果溢出台頻繁,考慮增加spark.storage.memoryfraction的大小。
0.6
spark用于緩存資料的對記憶體比例。這個值不應該比jvm 老生代(old generation)對象所占用的記憶體大,預設是60%的堆記憶體,當然你可以增加這個值,同時配置你所用的老生代對象占用記憶體大小。
spark塊展開的記憶體占用比例。如果沒有足夠的記憶體來完整展開新的塊,那麼老的塊将被抛棄。
<code>spark.broadcast.blocksize</code>
4m
torrentbroadcastfactory每個分片大小。太大會減少廣播時候的并發數(更慢了);如果太小,blockmanager可能會給出性能提示。
<code>spark.broadcast.factory</code>
org.apache.spark.broadcast.
torrentbroadcastfactory
廣播算法的實作。
<code>spark.cleaner.ttl</code>
(infinite)
spark記住任意中繼資料的保留時間(秒)。周期性的清理能保證比這個更老的中繼資料将被遺忘(删除)。這對于長期運作的spark作業非常有用(如,一些7*24運作)。注意,rdd持久化到記憶體中後,過了這麼長時間以後,也會被清理掉(這。。。是不是有點坑!)。
<code>spark.executor.cores</code>
yarn模式下預設1;如果是獨立部署,則是worker節點上所有可用的core。
單個執行器可用的core數。僅針對yarn和獨立部署模式。獨立部署時,單個worker節點上會運作多個執行器(executor),隻要worker上有足夠的core。否則,每個應用在單個worker上隻會啟動一個執行器。
<code>spark.default.parallelism</code>
對于reducebykey和join這樣的分布式混洗(shuffle)算子,等于父rdd中最大的分區。對于parallelize這樣沒有父rdd的算子,則取決于叢集管理器:
local mode: number of cores on the local machine — 本地模式:機器的core數
mesos fine grained mode: 8 — mesos細粒度模式:8
others: total number of cores on all executor nodes or 2, whichever is larger — 其他:所有執行器節點上core的數量 或者 2,這兩數取較大的
如果使用者沒有在參數裡指定,這個屬性是預設的rdd transformation算子分區數,如:join,reducebykey,parallelize等。
<code>spark.executor.heartbeatinterval</code>
10s
執行器心跳間隔(報告心跳給驅動器)。心跳機制使驅動器了解哪些執行器還活着,并且可以從心跳資料中獲得執行器的度量資料。
<code>spark.files.fetchtimeout</code>
60s
擷取檔案的通訊逾時,所擷取的檔案是通過在驅動器上調用sparkcontext.addfile()添加的。
<code>spark.files.usefetchcache</code>
<code>spark.files.overwrite</code>
sparkcontext.addfile()添加的檔案已經存在,且内容不比對的情況下,是否覆寫。
<code>spark.hadoop.cloneconf</code>
<code>spark.hadoop.validateoutputspecs</code>
如設為true,在saveashadoopfile及其變體的時候,将會驗證輸出(例如,檢查輸出目錄是否存在)。對于已經驗證過或确認存在輸出目錄的情況,可以禁用這個。我們建議不要禁用,除非你确定需要和之前的spark版本相容。可以簡單的利用hadoop 檔案系統api手動删掉已存在的輸出目錄。這個設定會被spark streaming streamingcontext生成的job忽略,因為streaming需要在回複檢查點的時候,覆寫已有的輸出目錄。
<code>spark.storage.memorymapthreshold</code>
2m
spark從磁盤上讀取一個塊後,映射到記憶體塊的最小大小。這阻止了spark映射過小的記憶體塊。通常,記憶體映射塊是有開銷的,應該比接近或小于作業系統的頁大小。
<code>spark.externalblockstore.blockmanager</code>
org.apache.spark.storage.tachyonblockmanager
用于存儲rdd的外部塊管理器(檔案系統)的實作。
檔案系統url由spark.externalblockstore.url決定。
<code>spark.externalblockstore.basedir</code>
system.getproperty(“java.io.tmpdir”)
外部塊存儲存放rdd的目錄。檔案系統url由spark.externalblockstore.url決定。也可以是逗号分隔的目錄清單(tachyon檔案系統)
<code>spark.externalblockstore.url</code>
tachyon://localhost:19998 for tachyon
所使用的外部塊存儲檔案系統url。
<code>spark.akka.framesize</code>
128
“control plane” 通訊中所允許的最大消息大小(mb)。通常,隻應用于map輸出資料的大小資訊,這些資訊會在執行器和驅動器之間傳遞。如果你的job包含幾千個map和reduce任務,你可能需要增大這個設定。
<code>spark.akka.heartbeat.interval</code>
1000s
設這麼大的值,是為了禁用akka傳輸失敗檢測器。也可以重新啟用,如果你想用這個特性(但不建議)。設成較大的值可以減少網絡開銷,而較小的值(1秒左右)可能會對akka的失敗檢測更有用。如有需要,可以調整這個值和spark.akka.heartbeat.pauses的組合。一種可能需要使用失敗檢測的情形是:用一個敏感的失敗檢測,可以快速識别并逐出不穩定的執行器。然而,在真實的spark叢集中,這通常不是gc暫停或網絡延遲造成的。除此之外,啟用這個還會導緻過多的心跳資料交換,進而造成網絡洪峰。
<code>spark.akka.heartbeat.pauses</code>
6000s
設這麼大的值,是為了禁用akka傳輸失敗檢測器。也可以重新啟用,如果你想用這個特性(但不建議)。這個是可接受的akka心跳暫停時間。這個可以用來控制對gc暫停敏感程度。如有需要,可以調整這個值和spark.akka.heartbeat.interval的組合。
<code>spark.akka.threads</code>
4
用于通訊的actor線程數。如果驅動器機器上有很多cpu core,你可以适當增大這個值。
<code>spark.akka.timeout</code>
100s
spark節點之間通訊逾時。
<code>spark.blockmanager.port</code>
(random)
塊管理器(block manager)監聽端口。在驅動器和執行器上都有。
<code>spark.broadcast.port</code>
驅動器http廣播server監聽端口。這和torrent廣播沒有關系。
<code>spark.driver.host</code>
(local hostname)
驅動器主機名。用于和執行器以及獨立部署時叢集master通訊。
<code>spark.driver.port</code>
驅動器端口。用于和執行器以及獨立部署時叢集master通訊。
<code>spark.executor.port</code>
執行器端口。用于和驅動器通訊。
<code>spark.fileserver.port</code>
驅動器http檔案server監聽端口。
<code>spark.network.timeout</code>
120s
所有網絡互動的預設逾時。這個配置是以下屬性的預設值:
<code>spark.core.connection.ack.wait.timeout</code>,
<code>spark.akka.timeout</code>,
<code>spark.storage.blockmanagerslavetimeoutms</code>,
<code>spark.shuffle.io.connectiontimeout</code>,<code>spark.rpc.asktimeout</code> or
<code>spark.rpc.lookuptimeout</code>
<code>spark.port.maxretries</code>
16
綁定一個端口的最大重試次數。如果指定了一個端口(非0),每個後續重試會在之前嘗試的端口基礎上加1,然後再重試綁定。本質上,這确定了一個綁定端口的範圍,就是 [start port, start port + maxretries]
<code>spark.replclassserver.port</code>
驅動器http class server的監聽端口。隻和spark shell相關。
<code>spark.rpc.numretries</code>
3
rpc任務最大重試次數。rpc任務最多重試這麼多次。
<code>spark.rpc.retry.wait</code>
3s
rpc請求操作重試前等待時間。
<code>spark.rpc.asktimeout</code>
rpc請求操作逾時等待時間。
rpc遠端端點查詢逾時。
<code>spark.cores.max</code>
(not set)
<code>spark.locality.wait</code>
為了資料本地性最長等待時間(spark會根據資料所在位置,盡量讓任務也啟動于相同的節點,然而可能因為該節點上資源不足等原因,無法滿足這個任務配置設定,spark最多等待這麼多時間,然後放棄資料本地性)。資料本地性有多個級别,每一級别都是等待這麼多時間(同一程序、同一節點、同一機架、任意)。你也可以為每個級别定義不同的等待時間,需要設定spark.locality.wait.node等。如果你發現任務資料本地性不佳,可以增加這個值,但通常預設值是ok的。
<code>spark.locality.wait.node</code>
spark.locality.wait
單獨定義同一節點資料本地性任務等待時間。你可以設為0,表示忽略節點本地性,直接跳到下一級别,即機架本地性(如果你的叢集有機架資訊)。
<code>spark.locality.wait.process</code>
單獨定義同一程序資料本地性任務等待時間。這個參數影響試圖通路特定執行器上的緩存資料的任務。
<code>spark.locality.wait.rack</code>
單獨定義同一機架資料本地性等待時間。
<code>spark.scheduler.maxregisteredresourceswaitingtime</code>
30s
排程開始前,向叢集管理器注冊使用資源的最大等待時間。
<code>spark.scheduler.minregisteredresourcesratio</code>
0.8 for yarn mode;
0.0 for standalone mode and mesos coarse-grained mode
排程啟動前,需要注冊得到資源的最小比例(注冊到的資源數 / 需要資源總數)(yarn模式下,資源是執行器;獨立部署和mesos粗粒度模式下時資源是cpu core【spark.cores.max是期望得到的資源總數】)。可以設為0.0~1.0的一個浮點數。不管job是否得到了最小資源比例,最大等待時間都是由spark.scheduler.maxregisteredresourceswaitingtime控制的。
<code>spark.scheduler.mode</code>
fifo
<code>spark.scheduler.revive.interval</code>
1s
排程器複活worker的間隔時間。
<code>spark.speculation</code>
如果設為true,将會啟動推測執行任務。這意味着,如果stage中有任務執行較慢,他們會被重新排程到别的節點上執行。
<code>spark.speculation.interval</code>
100ms
spark檢查慢任務的時間間隔。
<code>spark.speculation.multiplier</code>
1.5
比任務平均執行時間慢多少倍的任務會被認為是慢任務。
<code>spark.speculation.quantile</code>
對于一個stage來說,完成多少百分比才開始檢查慢任務,并啟動推測執行任務。
<code>spark.task.cpus</code>
1
每個任務配置設定的cpu core。
<code>spark.task.maxfailures</code>
單個任務最大失敗次數。應該>=1。最大重試次數 = spark.task.maxfailures – 1
<code>spark.dynamicallocation.enabled</code>
<code>spark.dynamicallocation .executoridletimeout</code>
<code>spark.dynamicallocation.cachedexecutoridletimeout</code>
infinity
<code>spark.dynamicallocation.initialexecutors</code>
spark
.dynamicallocation
.minexecutors
動态配置設定開啟後,執行器的初始個數
<code>spark.dynamicallocation.maxexecutors</code>
動态配置設定開啟後,執行器個數的上限
<code>spark.dynamicallocation.minexecutors</code>
動态配置設定開啟後,執行器個數的下限
<code>spark.dynamicallocation.schedulerbacklogtimeout</code>
<code>spark.dynamicallocation.sustainedschedulerbacklogtimeout</code>
<code>schedulerbacklogtimeout</code>
<code>spark.acls.enable</code>
是否啟用spark acls(通路控制清單)。如果啟用,那麼将會檢查使用者是否有權限檢視或修改某個作業(job)。注意,檢查的前提是需要知道使用者是誰,是以如果使用者是null,則不會做任何檢查。你可以在spark ui上設定過濾器(filters)來做使用者認證,并設定使用者名。
<code>spark.admin.acls</code>
empty
逗号分隔的使用者清單,在該清單中的使用者/管理者将能夠通路和修改所有的spark作業(job)。如果你的叢集是共享的,并且有叢集管理者,還有需要調試的開發人員,那麼這個配置會很有用。如果想讓所有人都有管理者權限,隻需把該配置設定為”*”
<code>spark.authenticate</code>
設定spark是否認證叢集内部連接配接。如果不是在yarn上運作,請參考 spark.authenticate.secret
<code>spark.authenticate.secret</code>
none
設定spark用于内部元件認證的秘鑰。如果不是在yarn上運作,且啟用了 spark.authenticate,那麼該配置必須設定
<code>spark.authenticate.enablesaslencryption</code>
是否對spark内部元件認證使用加密通信。該配置目前隻有 block transfer service 使用。
<code>spark.network.sasl.serveralwaysencrypt</code>
是否對支援sasl認證的service禁用非加密通信。該配置目前隻有 external shuffle service 支援。
<code>spark.core.connection.ack.wait.timeout</code>
網絡連接配接等待應答信号的逾時時間。為了避免由于gc等導緻的意外逾時,你可以設定一個較大的值。
<code>spark.core.connection.auth.wait.timeout</code>
網絡連接配接等待認證的逾時時間。
<code>spark.modify.acls</code>
逗号分隔的使用者清單,在改清單中的使用者可以修改spark作業。預設情況下,隻有啟動該spark作業的使用者可以修改之(比如殺死該作業)。如果想要任何使用者都可以修改作業,請将該配置設定為”*”
<code>spark.ui.filters</code>
spark.<class name of filer>.params=’param1=value1,param2=value2’例如:
-dspark.ui.filters=com.test.filter1
-dspark.com.test.filter1.params=’param1=foo,param2=testing’
<code>spark.ui.view.acls</code>
逗号分隔的使用者清單,在該清單中的使用者可以檢視spark web ui。預設,隻有啟動該spark作業的使用者可以檢視之。如果需要讓所有使用者都能檢視,隻需将該配置設為”*”
<code>spark.ssl.enabled</code>
是否啟用ssl連接配接(在所有所支援的協定上)。所有ssl相關配置(spark.ssl.xxx,其中xxx是一個特定的配置屬性),都是全局的。如果需要在某些協定上覆寫全局設定,那麼需要在該協定命名空間上進行單獨配置。使用 spark.ssl.yyy.xxx 來為協定yyy覆寫全局配置xxx。目前yyy的可選值有 akka(用于基于akka架構的網絡連接配接) 和 fs(用于應廣播和檔案伺服器)
<code>spark.ssl.enabledalgorithms</code>
<code>spark.ssl.keypassword</code>
在key-store中私匙對應的密碼。
<code>spark.ssl.keystore</code>
key-store檔案路徑。可以是絕對路徑,或者以本元件啟動的工作目錄為基礎的相對路徑。
<code>spark.ssl.keystorepassword</code>
key-store的密碼。
<code>spark.ssl.protocol</code>
<code>spark.ssl.truststore</code>
trust-store檔案路徑。可以是絕對路徑,或者以本元件啟動的工作目錄為基礎的相對路徑。
<code>spark.ssl.truststorepassword</code>
trust-store的密碼
<code>spark.streaming.backpressure.enabled</code>
是否啟用spark streaming 的内部反壓機制(spark 1.5以上支援)。啟用後,spark streaming會根據目前批次的排程延遲和處理時長來控制接收速率,這樣一來,系統的接收速度會和處理速度相比對。該特性會在内部動态地設定接收速率。該速率的上限将由 spark.streaming.receiver.maxrate 和 spark.streaming.kafka.maxrateperpartition 決定(如果它們設定了的話)。
<code>spark.streaming.blockinterval</code>
200ms
<code>spark.streaming.receiver.maxrate</code>
not set
<code>spark.streaming.receiver.writeaheadlog.enable</code>
<code>spark.streaming.unpersist</code>
是否強制spark streaming 自動從記憶體中清理掉所生成并持久化的rdd。同時,spark streaming收到的原始資料也将會被自動清理掉。如果設定為false,那麼原始資料以及持久化的rdd将不會被自動清理,以便外部程式可以通路這些資料。當然,這将導緻spark消耗更多的記憶體。
<code>spark.streaming.stopgracefullyonshutdown</code>
如果設為true,spark将會在jvm關閉時,優雅地關停streamingcontext,而不是立即關閉之。
<code>spark.streaming.kafka.maxrateperpartition</code>
<code>spark.streaming.kafka.maxretries</code>
驅動器連續重試的最大次數,這個配置是為了讓驅動器找出每個kafka分區上的最大offset(預設值為1,意味着驅動器将最多嘗試2次)。隻對新的kafka direct stream api有效。
<code>spark.streaming.ui.retainedbatches</code>
1000
spark streaming ui 以及 status api 中保留的最大批次個數。
<code>spark.r.numrbackendthreads</code>
2
sparkr rbackend處理rpc調用的背景線程數
<code>spark.r.command</code>
rscript
叢集模式下,驅動器和worker上執行的r腳本可執行檔案
<code>spark.r.driver.command</code>
spark.r.command
client模式的驅動器執行的r腳本。叢集模式下會忽略
每個叢集管理器都有一些額外的配置選項。詳細請參考這裡:
有些spark設定需要通過環境變量來設定,這些環境變量可以在${spark_home}/conf/spark-env.sh腳本(windows下是conf/spark-env.cmd)中設定。如果是獨立部署或者mesos模式,這個檔案可以指定機器相關資訊(如hostname)。運作本地spark應用或者submit腳本時,也會引用這個檔案。
注意,conf/spark-env.sh預設是不存在的。你需要複制conf/spark-env.sh.template這個模闆來建立,還有注意給這個檔案附上可執行權限。
以下變量可以在spark-env.sh中設定:
環境變量
<code>java_home</code>
java安裝目錄(如果沒有在path變量中指定)
<code>pyspark_python</code>
驅動器和worker上使用的python二進制可執行檔案(預設是python)
<code>pyspark_driver_python</code>
僅在驅動上使用的python二進制可執行檔案(預設同pyspark_python)
<code>sparkr_driver_r</code>
sparkr shell使用的r二進制可執行檔案(預設是r)
<code>spark_local_ip</code>
本地綁定的ip
<code>spark_public_dns</code>
spark程式公布給其他機器的hostname
spark-env.sh是一個shell腳本,是以一些參數可以通過程式設計方式來設定 – 例如,你可以擷取本機ip來設定spark_local_ip。
預設spark配置目錄是”${spark_home}/conf”,你也可以通過 ${spark_conf_dir}指定其他目錄。spark會從這個目錄下讀取配置檔案(spark-defaults.conf,spark-env.sh,log4j.properties等)
如果你打算用spark從hdfs讀取資料,那麼有2個hadoop配置檔案必須放到spark的classpath下:
hdfs-site.xml,配置hdfs用戶端的預設行為
core-site.xml,預設檔案系統名
這些配置檔案的路徑在不同釋出版本中不太一樣(如cdh和hdp版本),但通常都能在 ${hadoop_home}/etc/hadoop/conf目錄下找到。一些工具,如cloudera manager,可以動态修改配置,而且提供了下載下傳一份拷貝的機制。
要想讓這些配置對spark可見,請在${spark_home}/spark-env.sh中設定hadoop_conf_dir變量。