Spark Configuration

chrome崩掉,後面的就都丟失了,心累。後面的以後有時間再補上吧
僅僅是翻譯http://spark.apache.org/docs/latest/configuration.html
翻譯不準確,請參照官網對照查看。
———————————–前言

Spark Properties

Spark properties能夠控制大部分的程序設置,並且可以爲每個程序分開配置。properties能夠通過SparkConf直接設置然後傳入到SparkContext。SparkConf允許用戶配置一些公用屬性(例如:master URL和程序名稱),也允許使用set()方法,傳入key-value鍵值對來設置。例如,我們初始化一個擁有兩個線程的應用程序如下:
注意:我們設置local[2],意味着兩個線程。這代表着最小的並行度,能夠幫助我們發現程序在分佈式集羣運行時可能出現的bug

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

注意:我們能夠在本地模式下設置多於一個線程,並且在某些Spark Streaming情形下,我們可能必須設置多於1個線程來防止“飢餓問題“(Spark Streaming當中,程序需要一個線程用於Receiver接收數據。如果僅僅設置一個線程,則會被Receiver佔用接收數據,而處理數據則沒有多餘的線程進行)

Properties能夠指定一個單元時間區間,格式如下:

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

Properties指定單元數據大小,格式如下:

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 Properties

在某些場景下,我們可能不想把程序配置寫死到SparkConf當中去。舉個栗子,如果你想要運行同一個應用程序在不同的master主機或者使用不同數量的內存。Spark允許用戶簡單的創建一個空的conf

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支持兩種方式來動態加載配置configuration。第一種,命令行參數模式,例如上面展示的–master。spark-submit還能夠通過–conf flag來接收任意的Spark property,but uses special flags for properties that play a part in launching the Spark application.(不好翻譯,我的理解:–conf設置的屬性名是Spark程序啓動的一部分,不能胡亂設置)。運行./bin/spark-submit --help查看整個可設置的屬性列表。

bin/spark-submit 會讀取conf/spark-defaults.conf 文件中的配置。spark-defaults.conf中每一行都是由一個key和value構成,由空格分割,(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中沒有設置則合併)。在SparkConf中直接設置的屬性具有最高優先級,然後是spark-shell或spark-submit命令行設置,最後是spark-defaults.conf文件中的配置。有部分屬性名已經在新的spark版本中更名。在某些情況下,老的屬性名還能夠使用,但是會比新的屬性名優先級低。

查看Spark Properties

Spark應用程序的web 管理頁面http://:4040 下的“Environment”頁面列出了所有的properties。這會非常有用,當你需要驗證確保你的properties是否設置正確的時候。注意:這些屬性值都是通過spark-defaults.conf, SparkConf, 或者命令行來明確指定的,對於其他的一些配置屬性值,可以認爲都是使用的默認值。

可用屬性Available Properties

大部分的properties都已經內置有默認值,一些常用的屬性選項如下:

Application Properties

Property Name Default Meaning
spark.app.name (none) 應用程序名稱,將會在UI和日誌數據中顯示
spark.driver.cores 1 driver進程使用的core數量,僅在集羣模式下有用
spark.driver.maxResultSize 1g 限制每個Spark action操作(例如collect)時,所有分區,序列化後的結果集總大小。最小設置爲1M,或者設置爲0(表示無限制)。如果運行中結果集總大小大於了該設置值,job將會中止。而如果將該限值設置的太高,可能會在driver發生內存溢出錯誤(取決於spark.driver.memory和JVM內存開銷)。所以需要設置一個合適的上限值,避免driver端內存溢出
spark.driver.memory 1g 分配給driver進程使用的內存容量,也就是初始化SparkContext的進程。    注意:在客戶端模式,這個值一定不能通過程序中SparkConf來設置。因爲啓動SparkConf的時候,driver的JVM已經啓動。相反,請使用命令行--driver-memory 來設置,或者通過默認的配置文件。
spark.executor.memory 1g 分配給executor使用的內存容量
spark.extraListeners (none) 一個逗號分隔的SparkListener列表;當初始化SparkContext時,會實例化這些類並註冊到Spark的監聽組裏。會優先調用接收SparkConf一個參數的構造器。如果沒有,會調用一個不帶參數的構造器。如果沒有可以的構造器,該SparkContext會拋出一個異常並創建失敗
spark.local.dir /tmp 用來存放Spark運行“痕跡”的目錄,包括map結果輸出文件和RDDs在磁盤上的存儲。這個路徑應該是一個讀寫很快的本地磁盤。也能夠使用逗號分隔的list來指定不同磁盤上的多個目錄。    注意:在spark1.0及以後的版本,被更名爲SPARK_LOCAL_DIRS(Standalone,Mesos)或者LOCAL_DIRS(YARN)
spark.logConf false 當SparkContext啓動,日誌記錄SparkConf的所有INFO信息
spark.master (none) 設置要連接到的集羣管理
spark.submit.deployMode (none) Spark driver程序的部署模式,“client”或者“cluster”,也就是指定運行driver程序是本地(“client”)還是在集羣(“cluster”)中的一個節點上


除了這些,下面的一些屬性(properties)在某些情形下也會使用到:

運行時環境Runtime Environment

Property Name Default Meaning
spark.driver.extraClassPath (none) 添加額外的類路徑到driver。    注意:在client模式,這個配置不能通過SparkConf直接設置,因爲SparkContext實例化的時候JVM已經啓動。請在命令行當中使用 –driver-class-path或者在默認配置文件中設置
spark.driver.extraJavaOptions (none) 傳遞給driver的一串設置JVM額外屬性的字符串。例如,GC設置或者日誌記錄。    注意一:不能通過這個屬性來設置最大的堆大小(-Xmx)。堆的最大值需要通過spark.driver.memory(集羣cluster模式)或者在客戶端模式(client),命令行中使用–driver-memory設置。    注意二:在client模式下,這個配置也不能夠通過SparkConf來設置,也是由於初始化SparkConf時,JVM已經啓動。使用只能在命令行中通過設置 –driver-java-options或者在默認配置文件中配置
spark.driver.extraLibraryPath (none) 指定運行driver JVM時需要的額外library路徑。    注意:在client模式,也不能通過SparkConf設置,請在命令行中調用–driver-library-path設置或者默認配置文件中設置。
spark.driver.userClassPathFirst false (實驗) 加載類到drive時,是否優先使用用戶的jar包覆蓋Spark自身的jar包。這個特性主旨用來解決Spark包依賴和用戶包依賴之間的衝突問題。在當前版本(spark-2.0.1),這個特性仍然還在試驗階段,僅在cluster集羣有效。
spark.executor.extraClassPath (none) 爲executors指定需要的額外classpath。這個屬性仍然存在主要是爲了兼容以前的spark版本。不建議用戶設置這個屬性,通常也不需要設置該屬性。
spark.executor.extraJavaOptions (none) 爲executors設置額外的JVM屬性。如GC設置或其他日誌記錄。設置這個屬性可以通過SparkConf,spark-submit命令,或者spark-defaults.con文件。    **注意:不能通過該參數設置最大的堆大小(-Xmx),最大堆可以通過spark.executor.memory進行設置。
spark.executor.extraLibraryPath (none) 指定executor JVM的額外library路徑。
spark.executor.logs.rolling.maxRetainedFiles (none) 設置日誌文件保留數量,超過將會刪除最舊的日誌。該屬性默認未啓用。
spark.executor.logs.rolling.maxSize (none) 設置executors日誌文件每次滾動的最大字節數。Rolling默認禁用。更多請見spark.executor.logs.rolling.maxRetainedFiles自動清理舊日誌。
spark.executor.logs.rolling.strategy (none) 設置executors日誌的滾動策略。默認禁用。能夠被設置爲“time”(基於時間滾動)或者“size”(基於大小滾動)。對於“time”,通過spark.executor.logs.rolling.time.interval來設置時間間隔。對於“size”,通過設置spark.executor.logs.rolling.maxSize來滾動。
spark.executor.logs.rolling.time.interval daily 設置executors日誌的時間滾動間隔。默認禁用滾動。可用值:daily,hourly,minutely或者seconds。見spark.executor.logs.rolling.maxRetainedFiles來自動清理舊日誌。
spark.executor.userClassPathFirst false (實驗)和spark.driver.userClassPathFirst一樣的功能,但是是應用在executors上。
spark.executorEnv.[EnvironmentVariableName] (none) 通過EnvironmentVariableName添加指定的環境變量到executor進程。用戶可以指定多個EnvironmentVariableName,設置多個環境變量
spark.python.profile false 啓用Python worker分析結果,通過sc.show_profiles()函數展示executor分析信息,或者在driver退出的時候顯示。還能夠通過sc.dump_profiles(path)來備份到磁盤上。如果之前已經手動展示,則退出時不會再展示。默認使用pyspark.profiler.BasicProfiler,但是能夠使用profiler類作爲參數構造SparkContext來進行重載。
spark.python.profile.dump (none) 在driver退出時,分析結果的備份目錄。將會爲每個RDD結果構建一個被分割的文件。能夠通過ptats.Stats()來加載這些數據。如果這個屬性被設置,分析結果則不會自動展示。
spark.python.worker.memory 512m 數據聚合期間,每個pyhthon worker的內存使用大小。格式和JVM設置格式一樣(512m,2g)。如果聚合期間數據大於設定值,則會將數據溢出到磁盤。
spark.python.worker.reuse true 是否重用python worker。如果是,它將使用固定數量的Python workers,而不需要爲每個任務fork()一個Python進程。如果有一個非常大的廣播,這個設置將非常有用。因爲,廣播不需要爲每個任務從JVM到Python worker傳遞一次。
spark.files 一串逗號分隔的文件列表,指定每個executor的防止文件的工作目錄。
spark.submit.pyFiles .zip, .egg, 或者 .py 文件的逗號分隔列串,python apps的PYTHONPATH路徑。
spark.jars drive和executor的本地jar包的classpaths。逗號分隔。
spark.jars.packages driver和executor的maven jars包的路徑(逗號分隔)。這將會先去本地maven repo查找,然後maven遠程倉庫和spark.jars.ivy中給的遠程倉庫。格式爲groupId:artifactId:version。
spark.jars.excludes 逗號分隔的一串groupId:artifactId,排除在解決spark.jars.packages依賴時帶來的衝突。
spark.jars.ivy 逗號分隔的一串遠程倉庫,用於查詢spark.jars.packages中給出的包。

shuffle相關配置(Shuffle Behavior)

Property Name Default Meaning
spark.reducer.maxSizeInFlight 48m 同時從每個task拿過來map結果的大小。每個map輸出,都要求創建一個buffer去接收,這是一個固定開銷。所以保持這個值儘量小些,除非你有大量的內存。
spark.reducer.maxReqsInFlight Int.MaxValue 這個配置限制每次從遠程節點上同時請求的塊的數量。當集羣中機器越來越多,會導致同時連接多臺機器時連接數過大造成某個節點加載失敗。通過設置該屬性,可以減輕這種狀況。
spark.shuffle.compress true 是否對map結果進行壓縮。一般來講,壓縮會是更好的選擇。指定壓縮方式使用spark.io.compression.codec。
spark.shuffle.file.buffer 32k 每個shuffle文件輸出流內存內緩存的大小,單位是kb。這個緩存減少了創建中間shuffle文件中磁盤搜索和系統訪問的數量。
spark.shuffle.io.maxRetries 3 (Netty only[Netty一個網絡通信框架]) 由於IO原因造成的數據拉取失敗會自動重試最多該屬性值的次數。在大量的shuffle操作,長時間GC暫停或者網絡不穩定情況下,該屬性值都非常有用。
spark.shuffle.io.numConnectionsPerPeer 1 (Netty only)在主機之間可重用的連接數,用於減少在大型集羣當中構建connection的性能損耗。對於主機比較少,硬盤很多的集羣,這個值可能會造成讀取所有磁盤時併發不足,如此就要考慮將這個值設置大些。
spark.shuffle.io.preferDirectBufs true (Netty only) 在整個shuffle和傳輸緩存塊過程中,啓用堆外緩存來減少垃圾收集。但是堆外緩存一般被嚴格限制,用戶可能會選擇關掉堆外緩存來強制Netty所有的分配都使用堆內存。
spark.shuffle.io.retryWait 5s (Netty only)拉取數據失敗時,重連等待時間。默認最大延遲15s,用maxRetries * retryWait計算。
spark.shuffle.service.enabled false 啓用外部shuffle服務。這個服務會保存shuffle文件到外部存儲系統,以致excutors能夠安全的移除。啓用這個服務必須先設置spark.dynamicAllocation.enabled爲ture。
spark.shuffle.service.port 7337 外部shuffle服務運行端口
spark.shuffle.sort.bypassMergeThreshold 200 (Advanced) 在基於排序的shuffle管理器中,避免合併排序中的數據,如果在map端沒有進行聚合累加。並且能夠最大限度的減少分區。
spark.shuffle.spill.compress true 是否壓縮shuffle過程中溢出的數據。壓縮將使用spark.io.compression.codec.

壓縮和序列化

Property Name Default Meaning
spark.broadcast.compress true 廣播變量(broadcast)傳輸前是否進行壓縮(一般情況下壓縮後傳輸更好)
spark.io.compression.codec lz4 數據(RDD分區,廣播變量,shuffle結果等)傳輸時採用的壓縮方式,Spark提供三種默認壓縮方式:lz4, lzf, and snappy。也可以通過指定類的全名來指定壓縮方式,比如: org.apache.spark.io.LZ4CompressionCodec, org.apache.spark.io.LZFCompressionCodec, and org.apache.spark.io.SnappyCompressionCodec.
spark.io.compression.lz4.blockSize 32k 採用LZ4壓縮方式時,LZ4使用的塊大小。一般來講,這個值小一些,那麼shuffle時使用的內存也會相應小一些
spark.io.compression.snappy.blockSize 32k 採用snappy壓縮方式時,使用的塊大小。一般來講,這個值減小,shuffle使用內存也會減小
spark.kryo.classesToRegister (none) 如果使用Kryo方式序列化,可以將自己需要序列化的類名用逗號分隔,通過該參數向Kryo登記
spark.kryo.referenceTracking true (使用Spark SQL Thrift服務時該屬性爲false)當使用Kryo序列化時,是否要追蹤相同對象的路徑 。如果你的對象圖當中有循環,那麼該屬性將非常有用。如果確定沒有,也可以禁用該屬性來提升運行速度。
spark.kryo.registrationRequired false 是否要求向Kryo登記。如果設置爲‘true’,Kryo遇到沒有登記的類序列化的時候將會拋出一個異常。如果設置爲‘false’(默認),Kryo將會爲每個未登記的類單獨寫,寫類會有一個顯著的性能消耗。該屬性嚴格的要求用戶不能有類省略註冊。
spark.kryo.registrator (none) 如果使用Kryo序列器,可以通過該屬性傳遞一串逗號分隔的自定義註冊器類。當你需要使用自定義的方法來register你的類時,該方法就非常有用。否則未設置,spark.kryo.classesToRegister將會實現一個簡單的註冊器。
spark.kryoserializer.buffer.max 64m Kryo序列化允許的最大緩存。這個值一定要比你要序列化的任一對象大。如果出現”buffer limit exceeded”異常,試試增加該值。
spark.kryoserializer.buffer 64k Kryo序列化緩存的初始長度。注意:每個worker的每個核都會有一個該緩存。如果需要,這個緩存(buffer)會擴展到spark.kryoserializer.buffer.max大小
spark.rdd.compress false 是否壓縮序列化後的RRD分區(例如 Java和Scala當中設置的StorageLevel.MEMORY_ONLY_SER或者Python中設置的StorageLevel.MEMORY_ONLY)。典型的時間換空間,消耗大量CPU時間來節約大量空間。
spark.serializer org.apache.spark.serializer.JavaSerializer (org.apache.spark.serializer.KryoSerializer when using Spark SQL Thrift Server) 序列化方式。默認採用Java serializationClass來序列化,但是相當慢。建議採用org.apache.spark.serializer.KryoSerializer並配置Kryo來提升速度,更多可以查看子類org.apache.spark.Serializer.
spark.serializer.objectStreamReset 100 當使用org.apache.spark.serializer.JavaSerializer,serializer 會緩存對象,並阻止GC對這些對象進行收集。通過調用‘reset’,可以手動清空該緩存。設置爲-1關掉這個週期屬性。默認緩存100個對象。

內存管理

Property Name Default Meaning
spark.memory.fraction 0.6 用來計算和存儲的內存百分比。這個值越小,越容易發生泄露和緩存數據被置出。這個屬性的目的是,預留出一部分內存保存內部系統元數據,用戶數據結構等。推薦使用默認值,更多知識,例如增大該值怎麼調整JVM GC等,請參考這裏.
spark.memory.storageFraction 0.5 Amount of storage memory immune to eviction, expressed as a fraction of the size of the region set aside by s​park.memory.fraction. The higher this is, the less working memory may be available to execution and tasks may spill to disk more often. Leaving this at the default value is recommended. For more detail, see this description.

spark.memory.offHeap.enabled false If true, Spark will attempt to use off-heap memory for certain operations. If off-heap memory use is enabled, then spark.memory.offHeap.size must be positive.
spark.memory.offHeap.size 0 The absolute amount of memory in bytes which can be used for off-heap allocation. This setting has no impact on heap memory usage, so if your executors’ total memory consumption must fit within some hard limit then be sure to shrink your JVM heap size accordingly. This must be set to a positive value when spark.memory.offHeap.enabled=true.
spark.memory.useLegacyMode false ​Whether to enable the legacy memory management mode used in Spark 1.5 and before. The legacy mode rigidly partitions the heap space into fixed-size regions, potentially leading to excessive spilling if the application was not tuned. The following deprecated memory fraction configurations are not read unless this is enabled: spark.shuffle.memoryFraction
spark.storage.memoryFraction
spark.storage.unrollFraction
spark.shuffle.memoryFraction 0.2 (deprecated) This is read only if spark.memory.useLegacyMode is enabled. Fraction of Java heap to use for aggregation and cogroups during shuffles. At any given time, the collective size of all in-memory maps used for shuffles is bounded by this limit, beyond which the contents will begin to spill to disk. If spills are often, consider increasing this value at the expense of spark.storage.memoryFraction.
spark.storage.memoryFraction 0.6 (deprecated) This is read only if spark.memory.useLegacyMode is enabled. Fraction of Java heap to use for Spark’s memory cache. This should not be larger than the “old” generation of objects in the JVM, which by default is given 0.6 of the heap, but you can increase it if you configure your own old generation size.
spark.storage.unrollFraction 0.2 (deprecated) This is read only if spark.memory.useLegacyMode is enabled. Fraction of spark.storage.memoryFraction to use for unrolling blocks in memory. This is dynamically allocated by dropping existing blocks when there is not enough free storage space to unroll the new block in its entirety.

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