《Spark 官方文檔》在YARN上運行Spark
在YARN上運行Spark
對 YARN (Hadoop NextGen) 的支持是從Spark-0.6.0開始的,後續的版本也一直持續在改進。
在YARN上啟動
首先確保 HADOOP_CONF_DIR 或者 YARN_CONF_DIR 變量指向一個包含Hadoop集群客戶端配置文件的目錄。這些配置用於讀寫HDFS和連接YARN資源管理器(ResourceManager)。這些配置應該發布到YARN集群上所有的節點,這樣所有的YARN容器才能使用同樣的配置。如果這些配置引用了Java係統屬性或者其他不屬於YARN管理的環境變量,那麼這些屬性和變量也應該在Spark應用的配置中設置(包括驅動器、執行器,以及其AM【運行於client模式時的YARN Application Master】)
在YARN上啟動Spark應用有兩種模式。在cluster模式下,Spark驅動器(driver)在YARN Application Master中運行(運行於集群中),因此客戶端可以在Spark應用啟動之後關閉退出。而client模式下,Spark驅動器在客戶端進程中,這時的YARN Application Master隻用於向YARN申請資源。
與獨立部署( Spark standalone )或 在Mesos 集群中不同,YARN的master地址不是在–master參數中指定的,而是在Hadoop配置文件中設置。因此,這種情況下,–master隻需設置為yarn。
以下用cluster模式啟動一個Spark應用:
$ ./bin/spark-submit --class path.to.your.Class \
--master yarn \
--deploy-mode cluster \
[options] \
<app jar> [app options]
例如:
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
lib/spark-examples*.jar 10
以上例子中,啟動了一個YARN客戶端程序,使用默認的Application Master。而後SparkPi在Application Master中的子線程中運行。客戶端會周期性的把Application Master的狀態信息拉取下來,並更新到控製台。客戶端會在你的應用程序結束後退出。參考“調試你的應用”,這一節說明了如何查看驅動器和執行器的日誌。
要以client模式啟動一個spark應用,隻需在上麵的例子中把cluster換成client。下麵這個例子就是以client模式啟動spark-shell:
$ ./bin/spark-shell --master yarn --deploy-mode client
增加其他JAR包
在cluster模式下,驅動器不在客戶端機器上運行,所以SparkContext.addJar添加客戶端本地文件就不好使了。要使客戶端上本地文件能夠用SparkContext.addJar來添加,可以用–jars選項:
$ ./bin/spark-submit --class my.main.Class \
--master yarn \
--deploy-mode cluster \
--jars my-other-jar.jar,my-other-other-jar.jar
my-main-jar.jar
app_arg1 app_arg2
準備
在YARN上運行Spark需要其二進製發布包構建的時候增加YARN支持。二進製發布包可以在這裏下載:downloads page 。
想要自己編譯,參考這裏: Building Spark
配置
大多數配置,對於YARN或其他集群模式下,都是一樣的。詳細請參考這裏: configuration page。
以下是YARN上專有的配置項。
調試你的應用
在YARN術語集中,執行器和Application Master在容器(container)中運行。YARN在一個應用程序結束後,有兩種處理容器日誌的模式。如果開啟了日誌聚合(yarn.log-aggregation-enable),那麼容器日誌將被複製到HDFS,並刪除本地日誌。而後這些日誌可以在集群任何節點上用yarn logs命令查看:
yarn logs -applicationId <app ID>
以上命令,將會打印出指定應用的所有日誌文件的內容。你也可以直接在HDFS上查看這些日誌(HDFS shell或者HDFS API)。這些目錄可以在你的YARN配置中指定(yarn.nodemanager.remote-app-log-dir和yarn.nodemanager-remote-app-log-dir-suffix)。這些日誌同樣還可以在Spark Web UI上Executors tab頁查看。當然,你需要啟動Spark history server和 MapReduce history server,再在 yarn-site.xml 中配置好 yarn.log.server.url。Spark history server UI 將把你重定向到MapReduce history server 以查看這些聚合日誌。
如果日誌聚合沒有開啟,那麼日誌文件將在每台機器上的 YARN_APP_LOGS_DIR 目錄保留,通常這個目錄指向 /tmp/logs 或者 $HADOOP_HOME/log/userlogs(這取決於Hadoop版本和安全方式)。查看日誌的話,需要到每台機器上查看這些目錄。子目錄是按 application ID 和 container ID來組織的。這些日誌同樣可以在 Spark Web UI 上 Executors tab 頁查看,而且這時你不需要運行MapReduce history server。
如果需要檢查各個容器的啟動環境,可以先把 yarn.nodemanager.delete.debug-delay-sec 增大(如:36000),然後訪問應用緩存目錄yarn.nodemanager.local-dirs,這時容器的啟動目錄。這裏包含了啟動腳本、jar包以及容器啟動所用的所有環境變量。這對調試 classpath 相關問題尤其有用。(注意,啟用這個需要管理員權限,並重啟所有的node managers,因此,對托管集群不適用)
要自定義Application Master或執行器的 log4j 配置,有如下方法:
- 通過spark-submit –files 上傳一個自定義的 log4j.properties 文件。
- 在 spark.driver.extraJavaOptions(對Spark驅動器)或者 spark.executor.extraJavaOptions(對Spark執行器)增加 -Dlog4j.configuration=<location of configuration file>。注意,如果使用文件,那麼 file: 協議頭必須顯式寫上,且文件必須在所節點上都存在。
- 更新 ${SPARK_CONF_DIR}/log4j.properties 文件以及其他配置。注意,如果在多個地方都配置了log4j,那麼上麵其他兩種方法的配置優先級比本方法要高。
注意,第一種方法中,執行器和Application Master共享同一個log4j配置,在有些環境下(AM和執行器在同一個節點上運行)可能會有問題(例如,AM和執行器日誌都寫入到同一個日誌文件)
如果你需要引用YARN放置日誌文件的路徑,以便YARN可以正確地展示和聚合日誌,請在log4j.properties文件中使用spark.yarn.app.container.log.dir。例如,log4j.appender.file_appender.File=${spark.yarn.app.container.log.dir}/spark.log 。對於流式應用,可以配置RollingFileAppender,並將文件路徑設置為YARN日誌目錄,以避免磁盤打滿,而且這些日誌還可以利用YARN的日誌工具訪問和查看。
Spark屬性
Property Name | Default | Meaning |
---|---|---|
spark.yarn.am.memory |
512m |
YARN Application Master在client模式下, 使用內存總量,與JVM內存設置格式相同(如:512m,2g)。 如果是cluster模式下,請設置 spark.driver.memory。 注意使用小寫的後綴, 如:k、m、g、t、p,分別代表 kibi-, mebi, gibi-, tebi- 以及pebibytes。 |
spark.driver.cores |
1 |
YARN cluster模式下,驅動器使用的CPU core個數。 在cluster模式下,驅動器(driver)和YARN AM(application master)使用相同的JVM,所以這個屬性也可以用來控製YARN AM。 如果是client模式下,請使用spark.yarn.am.cores來控製YARN AM的CPU core個數。 |
spark.yarn.am.cores |
1 |
client模式下,用來控製YARN AM的CPU core個數。 cluster模式下,請使用 spark.driver.cores。 |
spark.yarn.am.waitTime |
100s |
在cluster模式下,該屬性表示YARN AM等待SparkContext初始化的時間。 在client模式下,該屬性表示YARN AM等待驅動器連接的時間。 |
spark.yarn.submit.file |
默認的HDFS副本數(通常是3) | HDFS文件副本數。包括Spark jar,app jar以及其他分布式緩存文件和存檔。 |
spark.yarn.preserve |
false |
設為true以保存stage相關文件(stage相關的jar包和緩存)到作業結束,而不是立即刪除。 |
spark.yarn.scheduler |
3000 |
Spark AM發送給YARN資源管理器心跳的間隔(ms)。 這個值最多不能超過YARN配置的超時間隔的一半。(yarn.am.liveness-monitor.expiry-interval-ms) |
spark.yarn.scheduler |
200ms |
Spark AM的初始帶外心跳間隔(有待定的資源申請時)。 其值不應該大於 spark.yarn.scheduler.heartbeat.interval-ms。 該資源分配間隔會在每次帶外心跳成功後但仍有待定資源申請時倍增, 直至達到 spark.yarn.scheduler.heartbeat.interval-ms 所設定的值。 |
spark.yarn.max.executor |
執行器個數*2且不小於3 | Spark應用最大容忍執行器失敗次數。 |
spark.yarn.historyServer |
(none) | Spark history server地址,如:host.com:18080 。 這個地址不要包含協議頭(https://)。 默認不設置,因為history server是可選的。 應用程序結束以後,YARN資源管理器web UI通過這個地址鏈接到Spark history server UI。 對於這屬性,可以使用YARN屬性變量,且這些變量是Spark在運行時組裝的。 例如,如果Spark history server和YARN資源管理器(ResourceManager)部署在同一台機器上運行, 那麼這個屬性可以設置為 ${hadoopconf-yarn.resourcemanager.hostname}:18080 |
spark.yarn.dist.archives |
(none) | 逗號分隔的文檔列表,其指向的文檔將被提取到每個執行器的工作目錄下。 |
spark.yarn.dist.files |
(none) | 逗號分隔的文件列表,其指向的文件將被複製到每個執行器的工作目錄下。 |
spark.executor.instances |
2 |
執行器個數。注意,這個屬性和 spark.dynamicAllocation.enabled是不兼容的。 如果同時設置了 spark.dynamicAllocation.enabled,那麼動態分配將被關閉,並使用 spark.executor.instances 所設置的值。 |
spark.yarn.executor |
執行器內存 * 0.10或者 384MB中較大者 | 每個執行器所分配的堆外內存(MB)總量。這些內存將被用於存儲VM開銷、字符串常量,以及其他原生開銷等。這會使執行器所需內存增加(典型情況,增加6%~10%) |
spark.yarn.driver |
驅動器內存 * 0.10或者 384MB中較大者 | 每個驅動器所分配的堆外內存(MB)總量。 這些內存將被用於存儲VM開銷、字符串常量,以及其他原生開銷等。 這會使執行器所需內存增加(典型情況,增加6%~10%) |
spark.yarn.am |
Application Master 內存 * 0.10或者 384MB中較大者 |
與 spark.yarn.driver.memoryOverhead 相同,隻是僅用於YARN AM client模式下。 |
spark.yarn.am.port |
(random) | YARN AM所監聽的端口。 在YARN client模式下,用於Spark驅動器(driver)和YARN AM通信。 而在YARN cluster模式下,這個端口將被用於動態執行器特性,這個特性會處理調度器後台殺死執行器的請求。 |
spark.yarn.queue |
default |
Spark應用提交到哪個yarn隊列。 |
spark.yarn.jar |
(none) | Spark jar文件位置,如果需要覆蓋默認位置,請設定這個值。 默認的,Spark on YARN會使用本地的Spark jar包,但Spark jar包同樣可以使用整個集群可讀的HDFS文件位置。 這使YARN可以在各節點上緩存Spark jar包,而不需要每次運行一個應用的時候都要分發。 使用 hdfs:///some/path 來指定HDFS上jar包文件路徑。 |
spark.yarn.access |
(none) | 逗號分隔的HDFS namenodes。 例如 spark.yarn.access.namenodes=hdfs://nn1.com:8032,hdfs://nn2.com:8032。 Spark應用必須有這些機器的訪問權限,並且需要配置好 kerberos(可以在同一個域或者信任的域)。 Spark需要每個namenode的安全token,以便訪問集群中HDFS。 |
spark.yarn.appMasterEnv |
(none) | 增加EnvironmentVariableName所指定的環境變量到YARN AM的進程中。 用戶可以指定多個環境變量。在cluster模式下,這個可以控製Spark驅動器的環境變量; 而在client模式下,隻控製執行器啟動器的環境變量。 |
spark.yarn |
25 |
YARN AM 啟動執行器的容器最多包含多少線程數。 |
spark.yarn.am |
(none) | 在client模式下,傳給YARN AM 的JVM參數。 在cluster模式下,請使用spark.driver.extraJavaOptions |
spark.yarn.am |
(none) | client模式下傳給YARN AM 額外依賴庫。 |
spark.yarn.maxAppAttempts |
yarn .am.max-attempts in YARN |
提交應用最大嚐試次數。不應大於YARN全局配置的最大嚐試次數。 |
spark.yarn.am |
(none) | 定義AM失敗跟蹤校驗間隔。 AM運行了至少要運行這麼多時間後,其失敗計數才被重置。 這個特性隻有配置其值後才會生效,且隻支持Hadoop-2.6+ |
spark.yarn.submit |
true |
在YARN cluster模式下,控製是否客戶端等到Spark應用結束後再退出。 如果設為true,客戶端進程將一直等待,並持續報告應用狀態。 否則,客戶端會在提交完成後退出。 |
spark.yarn.am |
(none) | 一個YARN節點標簽表達式(node label expression),以此來限製AM可以被調度到哪些節點上執行。 隻有Hadoop 2.6+才能支持節點標簽表達式,所以如果用其他版本運行,這個屬性將被忽略。 |
spark.yarn.executor |
(none) | 一個YARN節點標簽表達式(node label expression),以此來限製執行器可以被調度到哪些節點上啟動。 隻有Hadoop 2.6+才能支持節點標簽表達式,所以如果在其他版本上運行時,這個屬性將被忽略。 |
spark.yarn.tags |
(none) | 逗號分隔的字符串,傳遞YARN應用tags。 其值將出現在YARN Application Reports中,可以用來過濾和查詢YARN 應用。 |
spark.yarn.keytab |
(none) | 認證文件keytab的全路徑。 這個文件將被複製到訪問Secure Distributed Cache的YARN 應用節點上,並且周期性的刷新登陸的ticket和代理token(本地模式下也能work) |
spark.yarn.principal |
(none) | 登陸KDC的認證,secure HDFS需要(local模式下也能用) |
spark.yarn.config |
(none) | 某些路徑,可能在網關主機上能正常訪問(Spark應用啟動的地方),而在其他節點上的訪問方式(路徑)可能不同。 對於這樣的路徑,需要本屬性配合 spark.yarn.config.replacementPath組合使用,對於支持異構配置的集群,必須配置好這兩個值,Spark才能正確地啟動遠程進程。 replacement path 通常包含一些YARN導出的環境變量(因此,對Spark containers可見)。 例如,如果網關節點上Hadoop庫安裝在 /disk1/hadoop,並且其導出環境變量為 HADOOP_HOME, 就需要將 spark.yarn.config.gatewayPath 設置為 /disk1/hadoop 並將 replacement path設為 $HADOOP_HOME, 這樣才能在遠程節點上以正確的環境變量啟動進程。 |
spark.yarn.config |
(none) | 見 spark.yarn.config.getewayPath |
spark.yarn.security |
true |
在啟用安全設置的情況下,控製是否對non-HDFS服務,獲取代理token。 默認地,所有支持的服務,都啟用;但你也可以在某些有衝突的情況下,對某些服務禁用。 目前支持的服務有:hive,hbase |
重要提示
- 對CPU資源的請求是否滿足,取決於調度器如何配置和使用。
- cluster模式下,Spark執行器(executor)和驅動器(driver)的local目錄都由YARN配置決定(yarn.nodemanager.local-dirs);如果用戶指定了spark.local.dir,這時候將被忽略。在client模式下,Spark執行器(executor)的local目錄由YARN決定,而驅動器(driver)的local目錄由spark.local.dir決定,因為這時候,驅動器不在YARN上運行。
- 選項參數 –files和 –archives中井號(#)用法類似於Hadoop。例如,你可以指定 –files localtest.txt#appSees.txt,這將會把localtest.txt文件上傳到HDFS上,並重命名為 appSees.txt,而你的程序應用用 appSees.txt來引用這個文件。
- 當你在cluster模式下使用本地文件時,使用選項–jar 才能讓SparkContext.addJar正常工作,而不必使用 HDFS,HTTP,HTTPS或者FTP上的文件。
最後更新:2017-05-19 17:01:57