《Spark官方文檔》在YARN上運行Spark
Spark在 0.6.0版本後支持在YARN(hadoop NextGen)上運行,並且在後續版本中不斷改進。
在YARN上啟動Spark
首先,確認 HADOOP_CONF_DIR或YARN_CONF_DIR指向的包含了Hadoop集群的配置文件。這些配置用於操作HDFS和連接YARN資源管理器。在這個目錄下的這些配置文件將被分發到YARN集群中,因此應用所使用的容器能夠使用相同的配置。如果配置中的java係統參數或環境變量沒有被YARN所管理,就必須設置在Spark應用的配置中(驅動、執行器、和運行在客戶端模式下的應用Master)
有兩種模式能夠在YARN下啟動Spark應用,YARN集群模式和YARN客戶端模式。在Yarn集群方式,Spark驅動運行在,YARN管理的運行在集群上的應用主進程中,客戶端程序在應用初始化後就結。在YARN何況模式下,驅動運行在客戶端進程中,應用主進程隻能使用在YARN中請求的資源。
不同於standalone和Mesos模式中通過 –master 參數指定master 地址。在YARN模式中,資源管理器地址在HADOOP配置中獲取。所以, –master參數可選yarn-client或yarn-cluster。
下麵的命令能夠在YARN cluster下運行SPARK 應用:
./bin/spark-submit --class path.to.your.Class --master yarn-cluster [options] [app options]
例如:
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--num-executors 3 \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
lib/spark-examples*.jar \
10
上麵的命令啟動了一個YARN端程序,調用默認的應用Master,SparkPi作為Master的子線程運行。客戶端定期連向應用Master更新並在console中顯示狀態。當應用結束後客戶端進程也會退出。在後麵的“調試應用”小節,將介紹如何查看驅動器和執行器的日誌。
同樣可以在YARN客戶端模式下運行Spark應用,隻需要將“yarn-cluster”換成“yarn-client”
$ ./bin/spark-shell --master yarn-client
添加其他JAR包
在yarn-culster模式下,驅動器和客戶端在不同的集群上運行,所以在保存在客戶端上文件不能通過SparkContext.addJar加入到運行沙盒中。為了讓SparkContext.addJar能夠使用客戶端上的這些文件,需要把他們通過–jar選項加入到啟動命令中。
$ ./bin/spark-submit --class my.main.Class \
--master yarn-cluster \
--jars my-other-jar.jar,my-other-other-jar.jar
my-main-jar.jar
app_arg1 app_arg2
準備工作
在YARN上運行Spark需要一個支持YARN的Spark二進製包,這個包可以在Spark項目網站上下載。
配置
Spark在YARN上的大部分配置項和其他部署模式相同,可以在後麵配置項一節獲得更多關於此的信息,這些配置僅用於在YARN上運行Spark。
應用調試
用YARN術語來說,執行器、應用Master都在容器(container)內運行。在應用結束後YARN會采用2種方式處理容器日誌。如果開啟了日誌歸集(yarn.log-aggregation-enable),日誌將被拷到HDFS上,本地文件將被刪除。這些日誌可以通過’yarn logs’命令在集群的任何節點查看。
yarn logs -applicationId
上麵的命令會打印出應用所有容器的日誌文件內容。當然也可以直接在hdfs查看容器日誌。存入日誌的目錄通過yarn.nodemanager.remote-app-log-dir和yarn.nodemanager.remote-app-log-dir-suffix配置。同樣,也可以在Spark web UI的執行器Tab頁下查看相關日誌。前提是需要在 yarn-site.xml中配置 yarn.log.server.url,並保證Spark曆史服務器和MapReduce曆史服務器正常運行。Spark曆史服務器UI上的log連接會重定向到MapReduce曆史服務器來顯示歸集的日誌。
如果沒有開啟日誌歸集,日誌會保存在各個機器的YARN_APP_LOGS_DIR下,根據Hadoop版本或安裝的不同一般是/tmp/logs 或 $HADOOP_HOME/logs/userlogs。需要登錄到各台機器上去查看日誌,這些日誌會按應用id和容器id的結構來分子目錄保存。同樣可以通過Spark Web Ui來查看日誌,而不需要MapReduce曆史服務器。
通過增加yarn.nodemanager.delete.debug-delay-sec,如36000,可以在容器啟動的各個節點yarn.nodemanager.local-dirs目錄保留的應用緩存中查看每個容器的啟動環境。這個目錄下保存了啟動腳本、Jar包、啟動是的環境變量等信息。這對調試,特別是Classpath問題很有用。注,這些設置需要集群管理員權限,並且要重啟所有的節點管理器,所以在托管集群上很難完成。
有幾種可選方式給應用Master和執行器配置定製化的log4j配置:
- 1.通過在上傳應用的時候(spark-submit),在-file裏增加log4j.properties文件
- 2.在執行器的spark.driver.extraJavaOptions,或在驅動器的spark.executor.extraJavaOptions 選項,增加-Dlog4j.configuration=;。注,如果使用文件,需要明確指定,並且需要在所有節點存在。
- 3. 更新$SPARK_CONF_DIR/log4j.properties文件,此配置會和其他配置一起自動上傳。注:如果指定了多個選項,另外2個選項的優先級高於本配置。
如果采用第一個方式,需要注意的是,執行器和應用Master使用同一個log4j配置,當他們跑在同一個節點的時候會有問題(如,嚐試寫同一個日誌文件)。
如果需要在YARN上顯示、匯聚日誌,需要通過在log4j.properties用spark.yarn.app.container.log.dir配置相對路徑。例如,log4j.appender.file_appender.File=${spark.yarn.app.container.log.dir}/spark.log
對於streaming應用,配置configuring RollingFileAppender並把路徑設置到YARN目錄裏,可以避免由於日誌過大而硬盤空間不夠的問題。同時這些log還可以用YARN日誌工具訪問。
配置項
在YANR上,大部分的配置和其他部署方式相同。可以參考https://spark.apache.org/docs/latest/configuration.html
但是下列是在YARN環境特有的配置項
名稱 | 默認值 | 說明 |
---|---|---|
spark.yarn.am.memory | 512m | 在終端模式下YARN應用Master使用的內存總量,和JVM配置的格式一樣(如,512m、2g)在集群模式下,用spark.driver.memory設定 |
spark.driver.cores | 1 | 在YARN集群模式下,驅動器使用的內核數。集群模式下,驅動器與YARN應用Master運行在同一個JVM中,所以這個參數還限定了應用Master使用的內核數。在終端摩梭下,用spark.yarn.am.cores設定應用Master使用的內核數 |
spark.yarn.am.cores | 1 | 在終端模式下,YARN應用Master使用的內核數 |
spark.yarn.am.waitTime | 100s | 在YARN集群模式下,代表應用Master等待SparkContxt進行初始化的時間。在YARN終端模式下,代表應用Master等待驅動器連接的時間 |
spark.yarn.submit.file.replication | HDFS 默認副本數(一般是3) | 應用上次文件到HDFS時使用的HDFS複製數量。包括Spark jar、應用Jar,或者其他任意分布式緩存文件或歸檔。 |
spark.yarn.preserve.staging.files | false | 如果設置為true,在任務結束時保留中文件,Spark Jar,App Jar,分布式緩存文件等。 |
spark.yarn.scheduler.heartbeat.interval-ms | 3000 | Spark 應用Master與YARN資源管理器保持心跳的周期,單位為毫秒(ms)。上限是YARN失效周期(yarn.am.liveness-monitor.expiry-interval-ms)的一半 |
spark.yarn.scheduler.initial-allocation.interval | 200ms | 當有未處理的容器分配請求時,Spark應用master與YARN資源管理器間的心跳周期。不能大於spark.yarn.scheduler.heartbeat.interval-ms。如果未處理的容器分配請求持續存在,這個周期將會加倍,一直達到spark.yarn.scheduler.heartbeat.interval-ms。 |
spark.yarn.max.executor.failures | numExecutors * 2,至少3 | 當失敗的執行器數大於spark.yarn.max.executor.failures,應用將被標記為失敗 |
spark.yarn.historyServer.address | Spark 曆史服務器地址(例如, host.com:18080),不需要包好https://。默認為空,曆史服務器是可選的。當應用結束時,Spark資源管理器將應用的連接從資源管理器UI轉換到Spark曆史服務器UI。這個參數是可變的,可以在Spark運行期間調整。例如,如果曆史服務器和YARN管理器運行在一個節點上,可以設置為`${hadoopconf-yarn.resourcemanager.hostname}:18080`. | |
spark.yarn.dist.archives | 逗號分隔的列表,用於存放從執行器工作目錄提取的歸檔文件 |
最後更新:2017-05-19 14:33:36