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

《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 。

配置

大多數配置,對於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
.replication
預設的HDFS副本數(通常是3) HDFS檔案副本數。包括Spark jar,app jar以及其他分散式快取檔案和存檔。
spark.yarn.preserve
.staging.files
false 設為true以儲存stage相關檔案(stage相關的jar包和快取)到作業結束,而不是立即刪除。
spark.yarn.scheduler
.heartbeat.interval-ms
3000 Spark AM傳送給YARN資源管理器心跳的間隔(ms)。
這個值最多不能超過YARN配置的超時間隔的一半。(yarn.am.liveness-monitor.expiry-interval-ms)
spark.yarn.scheduler
.initial-allocation.interval
200ms Spark AM的初始帶外心跳間隔(有待定的資源申請時)。
其值不應該大於 spark.yarn.scheduler.heartbeat.interval-ms。
該資源分配間隔會在每次帶外心跳成功後但仍有待定資源申請時倍增,
直至達到 spark.yarn.scheduler.heartbeat.interval-ms 所設定的值。
spark.yarn.max.executor
.failures
執行器個數*2且不小於3 Spark應用最大容忍執行器失敗次數。
spark.yarn.historyServer
.address
(none) Spark history server地址,如:host.com:18080 。
這個地址不要包含協議頭(http://)。
預設不設定,因為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
.memoryOverhead
執行器記憶體 * 0.10或者 384MB中較大者 每個執行器所分配的堆外記憶體(MB)總量。這些記憶體將被用於儲存VM開銷、字串常量,以及其他原生開銷等。這會使執行器所需記憶體增加(典型情況,增加6%~10%)
spark.yarn.driver
.memoryOverhead
驅動器記憶體 * 0.10或者 384MB中較大者 每個驅動器所分配的堆外記憶體(MB)總量。
這些記憶體將被用於儲存VM開銷、字串常量,以及其他原生開銷等。
這會使執行器所需記憶體增加(典型情況,增加6%~10%)
spark.yarn.am
.memoryOverhead
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
.namenodes
(none) 逗號分隔的HDFS namenodes。
例如 spark.yarn.access.namenodes=hdfs://nn1.com:8032,hdfs://nn2.com:8032。
Spark應用必須有這些機器的訪問許可權,並且需要配置好 kerberos(可以在同一個域或者信任的域)。
Spark需要每個namenode的安全token,以便訪問叢集中HDFS。
spark.yarn.appMasterEnv
.[EnvironmentVariableName]
(none) 增加EnvironmentVariableName所指定的環境變數到YARN AM的程序中。
使用者可以指定多個環境變數。在cluster模式下,這個可以控制Spark驅動器的環境變數;
而在client模式下,只控制執行器啟動器的環境變數。
spark.yarn
.containerLauncherMaxThreads
25 YARN AM 啟動執行器的容器最多包含多少執行緒數。
spark.yarn.am
.extraJavaOptions
(none) 在client模式下,傳給YARN AM 的JVM引數。
在cluster模式下,請使用spark.driver.extraJavaOptions
spark.yarn.am
.extraLibraryPath
(none) client模式下傳給YARN AM 額外依賴庫。
spark.yarn.maxAppAttempts yarn
.resourcemanager
.am.max-attempts
 in YARN
提交應用最大嘗試次數。不應大於YARN全域性配置的最大嘗試次數。
spark.yarn.am
.attemptFailuresValidityInterval
(none) 定義AM失敗跟蹤校驗間隔。
AM運行了至少要執行這麼多時間後,其失敗計數才被重置。
這個特性只有配置其值後才會生效,且只支援Hadoop-2.6+
spark.yarn.submit
.waitAppCompletion
true 在YARN cluster模式下,控制是否客戶端等到Spark應用結束後再退出。
如果設為true,客戶端程序將一直等待,並持續報告應用狀態。
否則,客戶端會在提交完成後退出。
spark.yarn.am
.nodeLabelExpression
(none) 一個YARN節點標籤表示式(node label expression),以此來限制AM可以被排程到哪些節點上執行。
只有Hadoop 2.6+才能支援節點標籤表示式,所以如果用其他版本執行,這個屬性將被忽略。
spark.yarn.executor
.nodeLabelExpression
(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
.gatewayPath
(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
.replacementPath
(none) 見 spark.yarn.config.getewayPath
spark.yarn.security
.tokens.${service}.enabled
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上的檔案。