1. 程式人生 > >《Spark官方文件》在YARN上執行Spark

《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日誌工具訪問。

配置項

名稱 預設值 說明
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),不需要包好http://。預設為空,歷史伺服器是可選的。當應用結束時,Spark資源管理器將應用的連線從資源管理器UI轉換到Spark歷史伺服器UI。這個引數是可變的,可以在Spark執行期間調整。例如,如果歷史伺服器和YARN管理器執行在一個節點上,可以設定為`${hadoopconf-yarn.resourcemanager.hostname}:18080`.
spark.yarn.dist.archives 逗號分隔的列表,用於存放從執行器工作目錄提取的歸檔檔案