spark-submit配置說明

《Spark 官方文檔》Spark配置

spark-1.6.0 原文地址html

Spark配置

Spark有如下三種方式修改配置:java

  • Spark properties (Spark屬性)能夠控制絕大多數應用程序參數,並且既能夠經過 SparkConf 對象來設置,也能夠經過Java系統屬性來設置。
  • Environment variables (環境變量)能夠指定一些各個機器相關的設置,如IP地址,其設置方法是寫在每臺機器上的conf/spark-env.sh中。
  • Logging (日誌)能夠經過log4j.properties配置日誌。

 

Spark屬性

Spark屬性能夠控制大多數的應用程序設置,而且每一個應用的設定都是分開的。這些屬性能夠用SparkConf 對象直接設定。SparkConf爲一些經常使用的屬性定製了專用方法(如,master URL和application name),其餘屬性均可以用鍵值對作參數,調用set()方法來設置。例如,咱們能夠初始化一個包含2個本地線程的Spark應用,代碼以下:node

注意,local[2]表明2個本地線程 – 這是最小的併發方式,能夠幫助咱們發現一些只有在分佈式上下文才能復現的bug。python

val conf = new SparkConf()
             .setMaster("local[2]")
             .setAppName("CountingSheep")
val sc = new SparkContext(conf)

注意,本地模式下,咱們可使用n個線程(n >= 1)。並且在像Spark Streaming這樣的場景下,咱們可能須要多個線程來防止相似線程餓死這樣的問題。mysql

配置時間段的屬性應該寫明時間單位,以下格式都是可接受的:web

25ms (milliseconds)
5s (seconds)
10m or 10min (minutes)
3h (hours)
5d (days)
1y (years)

配置大小的屬性也應該寫明單位,以下格式都是可接受的:算法

1b (bytes)
1k or 1kb (kibibytes = 1024 bytes)
1m or 1mb (mebibytes = 1024 kibibytes)
1g or 1gb (gibibytes = 1024 mebibytes)
1t or 1tb (tebibytes = 1024 gibibytes)
1p or 1pb (pebibytes = 1024 tebibytes)

動態加載Spark屬性

在某些場景下,你可能須要避免將屬性值寫死在 SparkConf 中。例如,你可能但願在同一個應用上使用不一樣的master或不一樣的內存總量。Spark容許你簡單地建立一個空的SparkConf對象:sql

val sc = new SparkContext(new SparkConf())

而後在運行時設置這些屬性:shell

./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能夠展現這些選項的完整列表。apache

同時,bin/spark-submit 也支持從conf/spark-defaults.conf 中讀取配置選項,在該文件中每行是一個鍵值對,並用空格分隔,以下:

spark.master            spark://5.6.7.8:7077
spark.executor.memory   4g
spark.eventLog.enabled  true
spark.serializer        org.apache.spark.serializer.KryoSerializer

這些經過參數或者屬性配置文件傳遞的屬性,最終都會在SparkConf 中合併。其優先級是:首先是SparkConf代碼中寫的屬性值,其次是spark-submit或spark-shell的標誌參數,最後是spark-defaults.conf文件中的屬性。

有一些配置項被重命名過,這種情形下,老的名字仍然是能夠接受的,只是優先級比新名字優先級低。

查看Spark屬性

每一個SparkContext都有其對應的Spark UI,因此Spark應用程序都能經過Spark UI查看其屬性。默認你能夠在這裏看到:http://<driver>:4040,頁面上的」Environment「 tab頁能夠查看Spark屬性。若是你真的想確認一下屬性設置是否正確的話,這個功能就很是有用了。注意,只有顯式地經過SparkConf對象、在命令行參數、或者spark-defaults.conf設置的參數纔會出如今頁面上。其餘屬性,你能夠認爲都是默認值。

可用的屬性

絕大多數屬性都有合理的默認值。這裏是部分經常使用的選項:

應用屬性

屬性名稱 默認值 含義
spark.app.name (none) Spark應用的名字。會在SparkUI和日誌中出現。
spark.driver.cores 1 在cluster模式下,用幾個core運行驅動器(driver)進程。
spark.driver.maxResultSize 1g Spark action算子返回的結果最大多大。至少要1M,能夠設爲0表示無限制。若是結果超過這一大小,Spark做業(job)會直接中斷退出。可是,設得太高有可能致使驅動器OOM(out-of-memory)(取決於spark.driver.memory設置,以及驅動器JVM的內存限制)。設一個合理的值,以免驅動器OOM。
spark.driver.memory 1g 驅動器進程能夠用的內存總量(如:1g,2g)。
注意,在客戶端模式下,這個配置不能在SparkConf中直接設置(由於驅動器JVM都啓動完了呀!)。驅動器客戶端模式下,必需要在命令行裏用 –driver-memory 或者在默認屬性配置文件裏設置。
spark.executor.memory 1g 單個執行器(executor)使用的內存總量(如,2g,8g)
spark.extraListeners (none) 逗號分隔的SparkListener子類的類名列表;初始化SparkContext時,這些類的實例會被建立出來,而且註冊到Spark的監聽總線上。若是這些類有一個接受SparkConf做爲惟一參數的構造函數,那麼這個構造函數會被優先調用;不然,就調用無參數的默認構造函數。若是沒有構造函數,SparkContext建立的時候會拋異常。
spark.local.dir /tmp Spark的」草稿「目錄,包括map輸出的臨時文件,或者RDD存在磁盤上的數據。這個目錄最好在本地文件系統中,這樣讀寫速度快。這個配置能夠接受一個逗號分隔的列表,一般用這種方式將文件IO分散不一樣的磁盤上去。
注意:Spark-1.0及之後版本中,這個屬性會被集羣管理器所提供的環境變量覆蓋:SPARK_LOCAL_DIRS(獨立部署或Mesos)或者 LOCAL_DIRS(YARN)。
spark.logConf false SparkContext啓動時是否把生效的 SparkConf 屬性以INFO日誌打印到日誌裏
spark.master (none) 集羣管理器URL。參考allowed master URL’s.

除了這些之外,如下還有不少可用的參數配置,在某些特定情形下,可能會用到:

運行時環境

屬性名 默認值 含義
spark.driver.extraClassPath (none) 額外的classpath,將插入到到驅動器的classpath開頭。
注意:驅動器若是運行客戶端模式下,這個配置不能經過SparkConf 在程序裏配置,由於這時候程序已經啓動呀!而是應該用命令行參數(–driver-class-path)或者在 conf/spark-defaults.conf 配置。
spark.driver.extraJavaOptions (none) 驅動器額外的JVM選項。如:GC設置或其餘日誌參數。
注意:驅動器若是運行客戶端模式下,這個配置不能經過SparkConf在程序裏配置,由於這時候程序已經啓動呀!而是應該用命令行參數(–driver-java-options)或者conf/spark-defaults.conf 配置。
spark.driver.extraLibraryPath (none) 啓動驅動器JVM時候指定的依賴庫路徑。
注意:驅動器若是運行客戶端模式下,這個配置不能經過SparkConf在程序裏配置,由於這時候程序已經啓動呀!而是應該用命令行參數(–driver-library-path)或者conf/spark-defaults.conf 配置。
spark.driver.userClassPathFirst false (試驗性的:即將來不必定會支持該配置) 驅動器是否首選使用用戶指定的jars,而不是spark自身的。這個特性能夠用來處理用戶依賴和spark自己依賴項之間的衝突。目前仍是試驗性的,而且只能用在集羣模式下。
spark.executor.extraClassPath (none) 添加到執行器(executor)classpath開頭的classpath。主要爲了向後兼容老的spark版本,不推薦使用。
spark.executor.extraJavaOptions (none) 傳給執行器的額外JVM參數。如:GC設置或其餘日誌設置等。注意,不能用這個來設置Spark屬性或者堆內存大小。Spark屬性應該用SparkConf對象,或者spark-defaults.conf文件(會在spark-submit腳本中使用)來配置。執行器堆內存大小應該用 spark.executor.memory配置。
spark.executor.extraLibraryPath (none) 啓動執行器JVM時使用的額外依賴庫路徑。
spark.executor.logs.rolling.maxRetainedFiles (none) Sets the number of latest rolling log files that are going to be retained by the system. Older log files will be deleted. Disabled by default.設置日誌文件最大保留個數。老日誌文件將被幹掉。默認禁用的。
spark.executor.logs.rolling.maxSize (none) 設置執行器日誌文件大小上限。默認禁用的。
須要自動刪日誌請參考 spark.executor.logs.rolling.maxRetainedFiles.
spark.executor.logs.rolling.strategy (none) 執行器日誌滾動策略。默認禁用。
可接受的值有」time」(基於時間滾動) 或者 「size」(基於文件大小滾動)。
time:將使用 spark.executor.logs.rolling.time.interval設置滾動時間間隔
size:將使用 spark.executor.logs.rolling.size.maxBytes設置文件大小上限
spark.executor.logs.rolling.time.interval daily 設置執行器日誌滾動時間間隔。日誌滾動默認是禁用的。
可用的值有 「daily」, 「hourly」, 「minutely」,也可設爲數字(則單位爲秒)。
關於日誌自動清理,請參考 spark.executor.logs.rolling.maxRetainedFiles
spark.executor.userClassPathFirst false (試驗性的)與 spark.driver.userClassPathFirst相似,只不過這個參數將應用於執行器
spark.executorEnv.[EnvironmentVariableName] (none) 向執行器進程增長名爲EnvironmentVariableName的環境變量。用戶能夠指定多個來設置不一樣的環境變量。
spark.python.profile false 對Python worker啓用性能分析,性能分析結果會在sc.show_profile()中,或者在驅動器退出前展現。也能夠用sc.dump_profiles(path)輸出到磁盤上。若是部分分析結果被手動展現過,那麼驅動器退出前就再也不自動展現了。默認會使用pyspark.profiler.BasicProfiler,也能夠本身傳一個profiler 類參數給SparkContext構造函數。
spark.python.profile.dump (none) 這個目錄是用來在驅動器退出前,dump性能分析結果。性能分析結果會按RDD分別dump。同時可使用ptats.Stats()來裝載。若是制定了這個,那麼分析結果就再也不自動展現。
spark.python.worker.memory 512m 聚合時每一個python worker使用的內存總量,和JVM的內存字符串格式相同(如,512m,2g)。若是聚合時使用的內存超過這個量,就將數據溢出到磁盤上。
spark.python.worker.reuse true 是否複用Python worker。若是是,則每一個任務會啓動固定數量的Python worker,而且不須要fork() python進程。若是須要廣播的數據量很大,設爲true能大大減小廣播數據量,由於須要廣播的進程數減小了。

混洗行爲

屬性名 默認值 含義
spark.reducer.maxSizeInFlight 48m map任務輸出同時reduce任務獲取的最大內存佔用量。每一個輸出須要建立buffer來接收,對於每一個reduce任務來講,有一個固定的內存開銷上限,因此最好別設太大,除非你內存很是大。
spark.shuffle.compress true 是否壓縮map任務的輸出文件。一般來講,壓縮是個好主意。使用的壓縮算法取決於 spark.io.compression.codec
spark.shuffle.file.buffer 32k 每一個混洗輸出流的內存buffer大小。這個buffer能減小混洗文件的建立和磁盤尋址。
spark.shuffle.io.maxRetries 3 (僅對netty)若是IO相關異常發生,重試次數(若是設爲非0的話)。重試能是大量數據的混洗操做更加穩定,由於重試能夠有效應對長GC暫停或者網絡閃斷。
spark.shuffle.io.numConnectionsPerPeer 1 (僅netty)主機之間的鏈接是複用的,這樣能夠減小大集羣中重複創建鏈接的次數。然而,有些集羣是機器少,磁盤多,這種集羣能夠考慮增長這個參數值,以便充分利用全部磁盤併發性能。
spark.shuffle.io.preferDirectBufs true (僅netty)堆外緩存能夠有效減小垃圾回收和緩存複製。對於堆外內存緊張的用戶來講,能夠考慮禁用這個選項,以迫使netty全部內存都分配在堆上。
spark.shuffle.io.retryWait 5s (僅netty)混洗重試獲取數據的間隔時間。默認最大重試延遲是15秒,設置這個參數後,將變成maxRetries* retryWait。
spark.shuffle.manager sort 混洗數據的實現方式。可用的有」sort」和」hash「。基於排序(sort)的混洗內存利用率更高,而且從1.2開始已是默認值了。
spark.shuffle.service.enabled false 啓用外部混洗服務。啓用外部混洗服務後,執行器生成的混洗中間文件就由該服務保留,這樣執行器就能夠安全的退出了。若是 spark.dynamicAllocation.enabled啓用了,那麼這個參數也必須啓用,這樣動態分配纔能有外部混洗服務可用。
更多請參考:dynamic allocation configuration and setup documentation
spark.shuffle.service.port 7337 外部混洗服務對應端口
spark.shuffle.sort.bypassMergeThreshold 200 (高級)在基於排序(sort)的混洗管理器中,若是沒有map端聚合的話,就會最多存在這麼多個reduce分區。
spark.shuffle.spill.compress true 是否在混洗階段壓縮溢出到磁盤的數據。壓縮算法取決於spark.io.compression.codec

Spark UI

屬性名 默認值 含義
spark.eventLog.compress false 是否壓縮事件日誌(固然spark.eventLog.enabled必須開啓)
spark.eventLog.dir file:///tmp/spark-events Spark events日誌的基礎目錄(固然spark.eventLog.enabled必須開啓)。在這個目錄中,spark會給每一個應用建立一個單獨的子目錄,而後把應用的events log打到子目錄裏。用戶能夠設置一個統一的位置(好比一個HDFS目錄),這樣history server就能夠從這裏讀取歷史文件。
spark.eventLog.enabled false 是否啓用Spark事件日誌。若是Spark應用結束後,仍須要在SparkUI上查看其狀態,必須啓用這個。
spark.ui.killEnabled true 容許從SparkUI上殺掉stage以及對應的做業(job)
spark.ui.port 4040 SparkUI端口,展現應用程序運行狀態。
spark.ui.retainedJobs 1000 SparkUI和status API最多保留多少個spark做業的數據(固然是在垃圾回收以前)
spark.ui.retainedStages 1000 SparkUI和status API最多保留多少個spark步驟(stage)的數據(固然是在垃圾回收以前)
spark.worker.ui.retainedExecutors 1000 SparkUI和status API最多保留多少個已結束的執行器(executor)的數據(固然是在垃圾回收以前)
spark.worker.ui.retainedDrivers 1000 SparkUI和status API最多保留多少個已結束的驅動器(driver)的數據(固然是在垃圾回收以前)
spark.sql.ui.retainedExecutions 1000 SparkUI和status API最多保留多少個已結束的執行計劃(execution)的數據(固然是在垃圾回收以前)
spark.streaming.ui.retainedBatches 1000 SparkUI和status API最多保留多少個已結束的批量(batch)的數據(固然是在垃圾回收以前)

壓縮和序列化

屬性名 默認值 含義
spark.broadcast.compress true 是否在廣播變量前使用壓縮。一般是個好主意。
spark.closure.serializer org.apache.spark.serializer.
JavaSerializer
閉包所使用的序列化類。目前只支持Java序列化。
spark.io.compression.codec snappy 內部數據使用的壓縮算法,如:RDD分區、廣播變量、混洗輸出。Spark提供了3中算法:lz4,lzf,snappy。你也可使用全名來指定壓縮算法:org.apache.spark.io.LZ4CompressionCodec,
org.apache.spark.io.LZFCompressionCodec,
org.apache.spark.io.SnappyCompressionCodec.
spark.io.compression.lz4.blockSize 32k LZ4算法使用的塊大小。固然你須要先使用LZ4壓縮。減小塊大小能夠減小混洗時LZ4算法佔用的內存量。
spark.io.compression.snappy.blockSize 32k Snappy算法使用的塊大小(先得使用Snappy算法)。減小塊大小能夠減小混洗時Snappy算法佔用的內存量。
spark.kryo.classesToRegister (none) 若是你使用Kryo序列化,最好指定這個以提升性能(tuning guide)。
本參數接受一個逗號分隔的類名列表,這些類都會註冊爲Kryo可序列化類型。
spark.kryo.referenceTracking true (false when using Spark SQL Thrift Server) 是否跟蹤同一對象在Kryo序列化的引用。若是你的對象圖中有循環護着包含統一對象的多份拷貝,那麼最好啓用這個。若是沒有這種狀況,那就禁用以提升性能。
spark.kryo.registrationRequired false Kryo序列化時,是否必須事先註冊。若是設爲true,那麼Kryo遇到沒有註冊過的類型,就會拋異常。若是設爲false(默認)Kryo會序列化未註冊類型的對象,但會有比較明顯的性能影響,因此啓用這個選項,能夠強制必須在序列化前,註冊可序列化類型。
spark.kryo.registrator (none) 若是你使用Kryo序列化,用這個class來註冊你的自定義類型。若是你須要自定義註冊方式,這個參數頗有用。不然,使用 spark.kryo.classesRegister更簡單。要設置這個參數,須要用KryoRegistrator的子類。詳見:tuning guide 。
spark.kryoserializer.buffer.max 64m 最大容許的Kryo序列化buffer。必須必你所須要序列化的對象要大。若是你在Kryo中看到」buffer limit exceeded」這個異常,你就得增長這個值了。
spark.kryoserializer.buffer 64k Kryo序列化的初始buffer大小。注意,每臺worker上對應每一個core會有一個buffer。buffer最大增加到 spark.kryoserializer.buffer.max
spark.rdd.compress false 是否壓縮序列化後RDD的分區(如:StorageLevel.MEMORY_ONLY_SER)。能節省大量空間,但多消耗一些CPU。
spark.serializer org.apache.spark.serializer.
JavaSerializer (org.apache.spark.serializer.
KryoSerializer when using Spark SQL Thrift Server)
用於序列化對象的類,序列化後的數據將經過網絡傳輸,或從緩存中反序列化回來。默認的Java序列化使用java的Serializable接口,但速度較慢,因此咱們建議使用usingorg.apache.spark.serializer.KryoSerializer and configuring Kryo serialization若是速度須要保證的話。固然你能夠自定義一個序列化器,經過繼承org.apache.spark.Serializer.
spark.serializer.objectStreamReset 100 若是使用org.apache.spark.serializer.JavaSerializer作序列化器,序列化器緩存這些對象,以免輸出多餘數據,然而,這個會打斷垃圾回收。經過調用reset來flush序列化器,從而使老對象被回收。要禁用這一週期性reset,須要把這個參數設爲-1,。默認狀況下,序列化器會每過100個對象,被reset一次。

內存管理

屬性名 默認值 含義
spark.memory.fraction 0.75 堆內存中用於執行、混洗和存儲(緩存)的比例。這個值越低,則執行中溢出到磁盤越頻繁,同時緩存被逐出內存也更頻繁。這個配置的目的,是爲了留出用戶自定義數據結構、內部元數據使用的內存。推薦使用默認值。請參考this description.
spark.memory.storageFraction 0.5 不會被逐出內存的總量,表示一個相對於 spark.memory.fraction的比例。這個越高,那麼執行混洗等操做用的內存就越少,從而溢出磁盤就越頻繁。推薦使用默認值。更詳細請參考 this description.
spark.memory.offHeap.enabled true 若是true,Spark會嘗試使用堆外內存。啓用 後,spark.memory.offHeap.size必須爲正數。
spark.memory.offHeap.size 0 堆外內存分配的大小(絕對值)。這個設置不會影響堆內存的使用,因此你的執行器總內存必須適應JVM的堆內存大小。必需要設爲正數。而且前提是 spark.memory.offHeap.enabled=true.
spark.memory.useLegacyMode false 是否使用老式的內存管理模式(1.5以及以前)。老模式在堆內存管理上更死板,使用固定劃分的區域作不一樣功能,潛在的會致使過多的數據溢出到磁盤(若是不當心調整性能)。必須啓用本參數,如下選項纔可用:
spark.shuffle.memoryFraction
spark.storage.memoryFraction
spark.storage.unrollFraction
spark.shuffle.memoryFraction 0.2 (廢棄)必須先啓用spark.memory.useLegacyMode這個纔有用。
混洗階段用於聚合和協同分組的JVM堆內存比例。在任何指定的時間,全部用於混洗的內存總和不會超過這個上限,超出的部分會溢出到磁盤上。若是溢出臺頻繁,考慮增長spark.storage.memoryFraction的大小。
spark.storage.memoryFraction 0.6 (廢棄)必須先啓用spark.memory.useLegacyMode這個纔有用。
Spark用於緩存數據的對內存比例。這個值不該該比JVM 老生代(old generation)對象所佔用的內存大,默認是60%的堆內存,固然你能夠增長這個值,同時配置你所用的老生代對象佔用內存大小。
spark.storage.unrollFraction 0.2 (廢棄)必須先啓用spark.memory.useLegacyMode這個纔有用。
Spark塊展開的內存佔用比例。若是沒有足夠的內存來完整展開新的塊,那麼老的塊將被拋棄。

執行行爲

屬性名 默認值 含義
spark.broadcast.blockSize 4m TorrentBroadcastFactory每一個分片大小。太大會減小廣播時候的併發數(更慢了);若是過小,BlockManager可能會給出性能提示。
spark.broadcast.factory org.apache.spark.broadcast.
TorrentBroadcastFactory
廣播算法的實現。
spark.cleaner.ttl (infinite) Spark記住任意元數據的保留時間(秒)。週期性的清理能保證比這個更老的元數據將被遺忘(刪除)。這對於長期運行的Spark做業很是有用(如,一些7*24運行)。注意,RDD持久化到內存中後,過了這麼長時間之後,也會被清理掉(這。。。是否是有點坑!)。
spark.executor.cores YARN模式下默認1;若是是獨立部署,則是worker節點上全部可用的core。 單個執行器可用的core數。僅針對YARN和獨立部署模式。獨立部署時,單個worker節點上會運行多個執行器(executor),只要worker上有足夠的core。不然,每一個應用在單個worker上只會啓動一個執行器。
spark.default.parallelism 對於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等。
spark.executor.heartbeatInterval 10s 執行器心跳間隔(報告心跳給驅動器)。心跳機制使驅動器瞭解哪些執行器還活着,而且能夠從心跳數據中得到執行器的度量數據。
spark.files.fetchTimeout 60s 獲取文件的通信超時,所獲取的文件是經過在驅動器上調用SparkContext.addFile()添加的。
spark.files.useFetchCache true 若是設爲true(默認),則同一個spark應用的不一樣執行器之間,會使用一二共享緩存來拉取文件,這樣能夠提高同一主機上運行多個執行器時候,任務啓動的性能。若是設爲false,這個優化就被禁用,各個執行器將使用本身獨有的緩存,他們拉取的文件也是各自有一份拷貝。若是在NFS文件系統上使用本地文件系統,能夠禁用掉這個優化(參考SPARK-6313
spark.files.overwrite false SparkContext.addFile()添加的文件已經存在,且內容不匹配的狀況下,是否覆蓋。
spark.hadoop.cloneConf false 如設爲true,對每一個任務複製一份Hadoop Configuration對象。啓用這個能夠繞過Configuration線程安全問題(SPARK-2546 )。默認這個是禁用的,不少job並不會受這個issue的影響。
spark.hadoop.validateOutputSpecs true 如設爲true,在saveAsHadoopFile及其變體的時候,將會驗證輸出(例如,檢查輸出目錄是否存在)。對於已經驗證過或確認存在輸出目錄的狀況,能夠禁用這個。咱們建議不要禁用,除非你肯定須要和以前的spark版本兼容。能夠簡單的利用Hadoop 文件系統API手動刪掉已存在的輸出目錄。這個設置會被Spark Streaming StreamingContext生成的job忽略,由於Streaming須要在回覆檢查點的時候,覆蓋已有的輸出目錄。
spark.storage.memoryMapThreshold 2m spark從磁盤上讀取一個塊後,映射到內存塊的最小大小。這阻止了spark映射太小的內存塊。一般,內存映射塊是有開銷的,應該比接近或小於操做系統的頁大小。
spark.externalBlockStore.blockManager org.apache.spark.storage.TachyonBlockManager 用於存儲RDD的外部塊管理器(文件系統)的實現。
文件系統URL由spark.externalBlockStore.url決定。
spark.externalBlockStore.baseDir System.getProperty(「java.io.tmpdir」) 外部塊存儲存放RDD的目錄。文件系統URL由spark.externalBlockStore.url決定。也能夠是逗號分隔的目錄列表(Tachyon文件系統)
spark.externalBlockStore.url tachyon://localhost:19998 for Tachyon 所使用的外部塊存儲文件系統URL。

網絡

屬性名 默認值 含義
spark.akka.frameSize 128 「control plane」 通信中所容許的最大消息大小(MB)。一般,只應用於map輸出數據的大小信息,這些信息會在執行器和驅動器之間傳遞。若是你的job包含幾千個map和reduce任務,你可能須要增大這個設置。
spark.akka.heartbeat.interval 1000s 設這麼大的值,是爲了禁用Akka傳輸失敗檢測器。也能夠從新啓用,若是你想用這個特性(但不建議)。設成較大的值能夠減小網絡開銷,而較小的值(1秒左右)可能會對Akka的失敗檢測更有用。若有須要,能夠調整這個值和spark.akka.heartbeat.pauses的組合。一種可能須要使用失敗檢測的情形是:用一個敏感的失敗檢測,能夠快速識別並逐出不穩定的執行器。然而,在真實的spark集羣中,這一般不是GC暫停或網絡延遲形成的。除此以外,啓用這個還會致使過多的心跳數據交換,從而形成網絡洪峯。
spark.akka.heartbeat.pauses 6000s 設這麼大的值,是爲了禁用Akka傳輸失敗檢測器。也能夠從新啓用,若是你想用這個特性(但不建議)。這個是可接受的Akka心跳暫停時間。這個能夠用來控制對GC暫停敏感程度。若有須要,能夠調整這個值和spark.akka.heartbeat.interval的組合。
spark.akka.threads 4 用於通信的actor線程數。若是驅動器機器上有不少CPU core,你能夠適當增大這個值。
spark.akka.timeout 100s Spark節點之間通信超時。
spark.blockManager.port (random) 塊管理器(block manager)監聽端口。在驅動器和執行器上都有。
spark.broadcast.port (random) 驅動器HTTP廣播server監聽端口。這和torrent廣播沒有關係。
spark.driver.host (local hostname) 驅動器主機名。用於和執行器以及獨立部署時集羣master通信。
spark.driver.port (random) 驅動器端口。用於和執行器以及獨立部署時集羣master通信。
spark.executor.port (random) 執行器端口。用於和驅動器通信。
spark.fileserver.port (random) 驅動器HTTP文件server監聽端口。
spark.network.timeout 120s 全部網絡交互的默認超時。這個配置是如下屬性的默認值:
spark.core.connection.ack.wait.timeout,
spark.akka.timeout,
spark.storage.blockManagerSlaveTimeoutMs,
spark.shuffle.io.connectionTimeout,spark.rpc.askTimeout or
spark.rpc.lookupTimeout
spark.port.maxRetries 16 綁定一個端口的最大重試次數。若是指定了一個端口(非0),每一個後續重試會在以前嘗試的端口基礎上加1,而後再重試綁定。本質上,這肯定了一個綁定端口的範圍,就是 [start port, start port + maxRetries]
spark.replClassServer.port (random) 驅動器HTTP class server的監聽端口。只和spark shell相關。
spark.rpc.numRetries 3 RPC任務最大重試次數。RPC任務最多重試這麼屢次。
spark.rpc.retry.wait 3s RPC請求操做重試前等待時間。
spark.rpc.askTimeout 120s RPC請求操做超時等待時間。
spark.rpc.lookupTimeout 120s RPC遠程端點查詢超時。

調度

屬性名 默認值 含義
spark.cores.max (not set) 若是運行在獨立部署集羣模式(standalone deploy cluster)或者Mesos集羣粗粒度共享模式(Mesos cluster in 「coarse-grained」 sharing mode),這個值決定了spark應用可使用的最大CPU總數(應用在整個集羣中可用CPU總數,而不是單個機器)。若是不設置,那麼獨立部署時默認爲spark.deploy.defaultCores,Mesos集羣則默認無限制(即全部可用的CPU)。
spark.locality.wait 3s 爲了數據本地性最長等待時間(spark會根據數據所在位置,儘可能讓任務也啓動於相同的節點,然而可能由於該節點上資源不足等緣由,沒法知足這個任務分配,spark最多等待這麼多時間,而後放棄數據本地性)。數據本地性有多個級別,每一級別都是等待這麼多時間(同一進程、同一節點、同一機架、任意)。你也能夠爲每一個級別定義不一樣的等待時間,須要設置spark.locality.wait.node等。若是你發現任務數據本地性不佳,能夠增長這個值,但一般默認值是ok的。
spark.locality.wait.node spark.locality.wait 單獨定義同一節點數據本地性任務等待時間。你能夠設爲0,表示忽略節點本地性,直接跳到下一級別,即機架本地性(若是你的集羣有機架信息)。
spark.locality.wait.process spark.locality.wait 單獨定義同一進程數據本地性任務等待時間。這個參數影響試圖訪問特定執行器上的緩存數據的任務。
spark.locality.wait.rack spark.locality.wait 單獨定義同一機架數據本地性等待時間。
spark.scheduler.maxRegisteredResourcesWaitingTime 30s 調度開始前,向集羣管理器註冊使用資源的最大等待時間。
spark.scheduler.minRegisteredResourcesRatio 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控制的。
spark.scheduler.mode FIFO 提交到同一個SparkContext上job的調度模式(scheduling mode)。另外一個可接受的值是FAIR,而FIFO只是簡單的把job按先來後到排隊。對於多用戶服務頗有用。
spark.scheduler.revive.interval 1s 調度器復活worker的間隔時間。
spark.speculation false 若是設爲true,將會啓動推測執行任務。這意味着,若是stage中有任務執行較慢,他們會被從新調度到別的節點上執行。
spark.speculation.interval 100ms Spark檢查慢任務的時間間隔。
spark.speculation.multiplier 1.5 比任務平均執行時間慢多少倍的任務會被認爲是慢任務。
spark.speculation.quantile 0.75 對於一個stage來講,完成多少百分比才開始檢查慢任務,並啓動推測執行任務。
spark.task.cpus 1 每一個任務分配的CPU core。
spark.task.maxFailures 4 單個任務最大失敗次數。應該>=1。最大重試次數 = spark.task.maxFailures – 1

動態分配

屬性名 默認值 含義
spark.dynamicAllocation.enabled false 是否啓用動態資源分配特性,啓用後,執行器的個數會根據工做負載動態的調整(增長或減小)。注意,目前在YARN模式下不用。更詳細信息,請參考:here該特性依賴於 spark.shuffle.service.enabled 的啓用。同時還和如下配置相關:spark.dynamicAllocation.minExecutors, spark.dynamicAllocation.maxExecutors以及 spark.dynamicAllocation.initialExecutors
spark.dynamicAllocation
.executorIdleTimeout
60s 動態分配特性啓用後,空閒時間超過該配置時間的執行器都會被移除。更詳細請參考這裏:description
spark.dynamicAllocation.cachedExecutorIdleTimeout infinity 動態分配特性啓用後,包含緩存數據的執行器若是空閒時間超過該配置設置的時間,則被移除。更詳細請參考:description
spark.dynamicAllocation.initialExecutors spark
.dynamicAllocation
.minExecutors
動態分配開啓後,執行器的初始個數
spark.dynamicAllocation.maxExecutors infinity 動態分配開啓後,執行器個數的上限
spark.dynamicAllocation.minExecutors 0 動態分配開啓後,執行器個數的下限
spark.dynamicAllocation.schedulerBacklogTimeout 1s 動態分配啓用後,若是有任務積壓的持續時間長於該配置設置的時間,則申請新的執行器。更詳細請參考:description
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout schedulerBacklogTimeout 和spark.dynamicAllocation.schedulerBacklogTimeout相似,只不過該配置對應於隨後持續的執行器申請。更詳細請參考: description

安全

屬性名 默認值 含義
spark.acls.enable false 是否啓用Spark acls(訪問控制列表)。若是啓用,那麼將會檢查用戶是否有權限查看或修改某個做業(job)。注意,檢查的前提是須要知道用戶是誰,因此若是用戶是null,則不會作任何檢查。你能夠在Spark UI上設置過濾器(Filters)來作用戶認證,並設置用戶名。
spark.admin.acls Empty 逗號分隔的用戶列表,在該列表中的用戶/管理員將可以訪問和修改全部的Spark做業(job)。若是你的集羣是共享的,而且有集羣管理員,還有須要調試的開發人員,那麼這個配置會頗有用。若是想讓全部人都有管理員權限,只需把該配置設置爲」*」
spark.authenticate false 設置Spark是否定證集羣內部鏈接。若是不是在YARN上運行,請參考 spark.authenticate.secret
spark.authenticate.secret None 設置Spark用於內部組件認證的祕鑰。若是不是在YARN上運行,且啓用了 spark.authenticate,那麼該配置必須設置
spark.authenticate.enableSaslEncryption false 是否對Spark內部組件認證使用加密通訊。該配置目前只有 block transfer service 使用。
spark.network.sasl.serverAlwaysEncrypt false 是否對支持SASL認證的service禁用非加密通訊。該配置目前只有 external shuffle service 支持。
spark.core.connection.ack.wait.timeout 60s 網絡鏈接等待應答信號的超時時間。爲了不因爲GC等致使的意外超時,你能夠設置一個較大的值。
spark.core.connection.auth.wait.timeout 30s 網絡鏈接等待認證的超時時間。
spark.modify.acls Empty 逗號分隔的用戶列表,在改列表中的用戶能夠修改Spark做業。默認狀況下,只有啓動該Spark做業的用戶能夠修改之(好比殺死該做業)。若是想要任何用戶均可以修改做業,請將該配置設置爲」*」
spark.ui.filters None 逗號分隔的過濾器class列表,這些過濾器將用於Spark web UI。這裏的過濾器應該是一個標準的 javax servlet Filter 。每一個過濾器的參數能夠經過java系統屬性來設置,以下:
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’
spark.ui.view.acls Empty 逗號分隔的用戶列表,在該列表中的用戶能夠查看Spark web UI。默認,只有啓動該Spark做業的用戶能夠查看之。若是須要讓全部用戶都能查看,只需將該配置設爲」*」

加密

屬性名 默認值 含義
spark.ssl.enabled false 是否啓用SSL鏈接(在全部所支持的協議上)。全部SSL相關配置(spark.ssl.xxx,其中xxx是一個特定的配置屬性),都是全局的。若是須要在某些協議上覆蓋全局設置,那麼須要在該協議命名空間上進行單獨配置。使用 spark.ssl.YYY.XXX 來爲協議YYY覆蓋全局配置XXX。目前YYY的可選值有 akka(用於基於AKKA框架的網絡鏈接) 和 fs(用於應廣播和文件服務器)
spark.ssl.enabledAlgorithms Empty 逗號分隔的加密算法列表。這些加密算法必須是JVM所支持的。這裏有個可用加密算法參考列表: this
spark.ssl.keyPassword None 在key-store中私匙對應的密碼。
spark.ssl.keyStore None key-store文件路徑。能夠是絕對路徑,或者以本組件啓動的工做目錄爲基礎的相對路徑。
spark.ssl.keyStorePassword None key-store的密碼。
spark.ssl.protocol None 協議名稱。該協議必須是JVM所支持的。這裏有JVM支持的協議參考列表:this
spark.ssl.trustStore None trust-store文件路徑。能夠是絕對路徑,或者以本組件啓動的工做目錄爲基礎的相對路徑。
spark.ssl.trustStorePassword None trust-store的密碼

Spark Streaming [流式]

屬性名 默認值 含義
spark.streaming.backpressure.enabled false 是否啓用Spark Streaming 的內部反壓機制(spark 1.5以上支持)。啓用後,Spark Streaming會根據當前批次的調度延遲和處理時長來控制接收速率,這樣一來,系統的接收速度會和處理速度相匹配。該特性會在內部動態地設置接收速率。該速率的上限將由 spark.streaming.receiver.maxRate 和 spark.streaming.kafka.maxRatePerPartition 決定(若是它們設置了的話)。
spark.streaming.blockInterval 200ms 在將數據保存到Spark以前,Spark Streaming接收器組裝數據塊的時間間隔。建議很多於50ms。關於Spark Streaming編程指南細節,請參考 performance tuning 這一節。
spark.streaming.receiver.maxRate not set 接收速度的最大速率(每秒記錄條數)。實際上,每一個流每秒將消費這麼多條記錄。設置爲0或者負數表示不限制速率。更多細節請參考: deployment guide
spark.streaming.receiver.writeAheadLog.enable false 是否啓用接收器預寫日誌。全部的輸入數據都會保存到預寫日誌中,這樣在驅動器失敗後,能夠基於預寫日誌來恢復數據。更詳細請參考:deployment guide
spark.streaming.unpersist true 是否強制Spark Streaming 自動從內存中清理掉所生成並持久化的RDD。同時,Spark Streaming收到的原始數據也將會被自動清理掉。若是設置爲false,那麼原始數據以及持久化的RDD將不會被自動清理,以便外部程序能夠訪問這些數據。固然,這將致使Spark消耗更多的內存。
spark.streaming.stopGracefullyOnShutdown false 若是設爲true,Spark將會在JVM關閉時,優雅地關停StreamingContext,而不是當即關閉之。
spark.streaming.kafka.maxRatePerPartition not set 在使用Kafka direct stream API時,從每一個Kafka數據分區讀取數據的最大速率(每秒記錄條數)。更詳細請參考:Kafka Integration guide
spark.streaming.kafka.maxRetries 1 驅動器連續重試的最大次數,這個配置是爲了讓驅動器找出每一個Kafka分區上的最大offset(默認值爲1,意味着驅動器將最多嘗試2次)。只對新的Kafka direct stream API有效。
spark.streaming.ui.retainedBatches 1000 Spark Streaming UI 以及 status API 中保留的最大批次個數。

SparkR

屬性名 默認值 含義
spark.r.numRBackendThreads 2 SparkR RBackEnd處理RPC調用的後臺線程數
spark.r.command Rscript 集羣模式下,驅動器和worker上執行的R腳本可執行文件
spark.r.driver.command spark.r.command client模式的驅動器執行的R腳本。集羣模式下會忽略

集羣管理器

每一個集羣管理器都有一些額外的配置選項。詳細請參考這裏:

YARN
Mesos
Standalone Mode

環境變量

有些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中設置:

環境變量 含義
JAVA_HOME Java安裝目錄(若是沒有在PATH變量中指定)
PYSPARK_PYTHON 驅動器和worker上使用的Python二進制可執行文件(默認是python)
PYSPARK_DRIVER_PYTHON 僅在驅動上使用的Python二進制可執行文件(默認同PYSPARK_PYTHON)
SPARKR_DRIVER_R SparkR shell使用的R二進制可執行文件(默認是R)
SPARK_LOCAL_IP 本地綁定的IP
SPARK_PUBLIC_DNS Spark程序公佈給其餘機器的hostname

另外,還有一些選項須要在Spark standalone cluster scripts裏設置,如:每臺機器上使用的core數量,和最大內存佔用量。

spark-env.sh是一個shell腳本,所以一些參數能夠經過編程方式來設定 – 例如,你能夠獲取本機IP來設置SPARK_LOCAL_IP。

日誌配置

Spark使用log4j 打日誌。你能夠在conf目錄下用log4j.properties來配置。複製該目錄下已有的log4j.properties.template並更名爲log4j.properties便可。

覆蓋配置目錄

默認Spark配置目錄是」${SPARK_HOME}/conf」,你也能夠經過 ${SPARK_CONF_DIR}指定其餘目錄。Spark會從這個目錄下讀取配置文件(spark-defaults.conf,spark-env.sh,log4j.properties等)

繼承Hadoop集羣配置

若是你打算用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變量。

轉自:http://ifeve.com/spark-config/
 
Options:
  --master MASTER_URL         spark://host:port, mesos://host:port, yarn, or local.
  --deploy-mode DEPLOY_MODE   driver運行的地方,client運行在本機,cluster運行在集羣
                              (Default: client).
  --class CLASS_NAME          Your application's main class (for Java / Scala apps).
  --name NAME                 A name of your application.
  --jars JARS                 逗號分隔的本地jar列表包含在驅動程序和執行程序類路徑中
  --packages                  Comma-separated list of maven coordinates of jars to include
                              on the driver and executor classpaths. Will search the local
                              maven repo, then maven central and any additional remote
                              repositories given by --repositories. The format for the
                              coordinates should be groupId:artifactId:version.
  --exclude-packages          Comma-separated list of groupId:artifactId, to exclude while
                              resolving the dependencies provided in --packages to avoid
                              dependency conflicts.
  --repositories              Comma-separated list of additional remote repositories to
                              search for the maven coordinates given with --packages.
  --py-files PY_FILES         Comma-separated list of .zip, .egg, or .py files to place
                              on the PYTHONPATH for Python apps.
  --files FILES               Comma-separated list of files to be placed in the working
                              directory of each executor.

  --conf PROP=VALUE           Arbitrary Spark configuration property.
  --properties-file FILE      Path to a file from which to load extra properties. If not
                              specified, this will look for conf/spark-defaults.conf.

  --driver-memory MEM         Memory for driver (e.g. 1000M, 2G) (Default: 1024M).
  --driver-java-options       Extra Java options to pass to the driver.
  --driver-library-path       Extra library path entries to pass to the driver.
  --driver-class-path         driver的類路徑,用--jars 添加的jar包會自動包含在類路徑裏

  --executor-memory MEM       Memory per executor (e.g. 1000M, 2G) (Default: 1G).

  --proxy-user NAME           User to impersonate when submitting the application.
                              This argument does not work with --principal / --keytab.

  --help, -h                  Show this help message and exit.
  --verbose, -v               Print additional debug output.
  --version,                  Print the version of current Spark.

 Spark standalone with cluster deploy mode only:
  --driver-cores NUM          Cores for driver (Default: 1).

 Spark standalone or Mesos with cluster deploy mode only:
  --supervise                 If given, restarts the driver on failure.
  --kill SUBMISSION_ID        If given, kills the driver specified.
  --status SUBMISSION_ID      If given, requests the status of the driver specified.

 Spark standalone and Mesos only:
  --total-executor-cores NUM  Total cores for all executors.

 Spark standalone and YARN only:
  --executor-cores NUM        Number of cores per executor. (Default: 1 in YARN mode,
                              or all available cores on the worker in standalone mode)

 YARN-only:
  --driver-cores NUM          Number of cores used by the driver, only in cluster mode
                              (Default: 1).
  --queue QUEUE_NAME          The YARN queue to submit to (Default: "default").
  --num-executors NUM         Number of executors to launch (Default: 2).
                              If dynamic allocation is enabled, the initial number of
                              executors will be at least NUM.
  --archives ARCHIVES         Comma separated list of archives to be extracted into the
                              working directory of each executor.
  --principal PRINCIPAL       Principal to be used to login to KDC, while running on
                              secure HDFS.
  --keytab KEYTAB             The full path to the file that contains the keytab for the
                              principal specified above. This keytab will be copied to
                              the node running the Application Master via the Secure
                              Distributed Cache, for renewing the login tickets and the
                              delegation tokens periodically.

 注:特別指出

--driver-class-path與 spark.driver.extraClassPath 覆蓋問題

緣由在於--driver-class-path是spark.driver.extraClassPath別名,所以同時使用時就會出現覆蓋

若是同時須要指定兩個則能夠直接使用spark.driver.extraClassPath便可,多個目錄中間用分號":"隔開,以下

 spark.driver.extraClassPath="mysql-connector-java-5.1.24-bin.jar:/opt/cloudera/parcels/CDH/lib/hbase/lib/*"

相關文章
相關標籤/搜索