轉(zhuǎn)載請注明出處,謝謝合作~
在 Yarn 上運行 Spark
- 安全機制(Security)
- 在 Yarn 上啟動 Spark(Launching Spark on YARN)
- 添加額外依賴(Adding Other JARs)
- 準備工作(Preparations)
- 配置參數(shù)(Configuration)
- 調(diào)試應(yīng)用程序(Debugging your Application)
- Spark 屬性(Spark Properties)
- SHS 自定義 executor 日志 URL 可用的匹配模式(Available patterns for SHS custom executor log URL)
- 資源分配和配置概述(Resource Allocation and Configuration Overview)
- 重要事項(Important notes)
- Kerberos(Kerberos)
- Yarn 的 Kerberos 配置(YARN-specific Kerberos Configuration)
- Kerberos 疑難解答(Troubleshooting Kerberos)
- 配置 External Shuffle Service(Configuring the External Shuffle Service)
- 使用 Apache Oozie 啟動應(yīng)用程序(Launching your application with Apache Oozie)
- 使用 Spark History Server 代替 Spark Web 界面(Using the Spark History Server to replace the Spark Web UI)
對 Yarn(YARN (Hadoop NextGen))的支持自 Spark 0.6.0 開始刻盐,并在之后的版本中持續(xù)改進郑气。
安全機制
Spark 中的安全機制默認是關(guān)閉的幅垮,這意味著在默認情況下你的 Spark 系統(tǒng)很容易收到攻擊。請在運行 Spark 之前閱讀 Spark Security 文檔和本文檔中的安全章節(jié)。
在 Yarn 上啟動 Spark
請確保環(huán)境變量 HADOOP_CONF_DIR
或者 YARN_CONF_DIR
指向了包含 Hadoop 集群配置文件(客戶端)的目錄忙芒,這些配置用來寫入 HDFS 以及連接 Yarn 的 ResourceManager示弓。目錄中包含的配置文件將會分發(fā)到 Yarn 集群中,所有應(yīng)用程序使用的容器都會使用相同的配置文件呵萨。
如果這些配置涉及的 Java 系統(tǒng)屬性或者環(huán)境變量不是由 Yarn 管理的奏属,還應(yīng)該將它們加入到 Spark 應(yīng)用程序的配置參數(shù)中(driver,executor潮峦,和 client
模式下的 AM)囱皿。
將應(yīng)用程序提交到 Yarn 上有兩種模式。在 cluster
模式下忱嘹,Spark 的 driver 端運行在由 Yarn 管理的應(yīng)用程序管理器(application master嘱腥,AM)進程中,客戶端可以在應(yīng)用程序初始化完成之后退出拘悦。在 client
模式下齿兔,driver 運行在客戶端進程中,AM 只用來向 Yarn 申請資源础米。
不像其他 Spark 支持的集群管理器那樣需要在參數(shù) --master
中傳遞集群地址分苇,在 Yarn 模式下,ResourceManager 的地址會從 Hadoop 配置文件中獲取屁桑。所以參數(shù) --master
的值為 yarn
医寿。
以 cluster
模式提交 Spark 應(yīng)用程序:
$ ./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 \
examples/jars/spark-examples*.jar \
10
上面的示例啟動一個 Yarn 客戶端程序,啟動默認的 AM蘑斧。SparkPi 將會以 AM 的子線程的方式運行靖秩。客戶端程序會定時向 AM 獲取狀態(tài)數(shù)據(jù)并展示在控制臺竖瘾『悖客戶端程序會在任務(wù)運行完成之后退出男摧。如何查看 driver 和 executor 日志參見「調(diào)試應(yīng)用程序」章節(jié)废赞。
以 client
模式啟動 Spark 應(yīng)用程序和上面基本一樣买乃,只是需要將 cluster
替換為 client
捞蚂。下面的命令展示了如何在 client
模式下運行 spark-shell
:
$ ./bin/spark-shell --master yarn --deploy-mode client
添加其他依賴
在 cluster
模式下奈揍,driver 和客戶端運行在不同的節(jié)點上厦章,所以 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 需要內(nèi)置 Yarn 支持的 Spark 二進制版本,可以從項目網(wǎng)站的下載頁 downloads page 下載条霜。如果需要自行編譯催什,參見 Building Spark。
讓 Yarn 可以訪問 Spark 運行時依賴宰睡,需要指定參數(shù) spark.yarn.archive
或者 spark.yarn.jars
蒲凶。詳情參見 Spark Properties气筋。如果 spark.yarn.archive
和 spark.yarn.jars
都沒有指定,Spark 會將 $SPARK_HOME/jars
下的依賴壓縮成一個 zip 文件上傳到分布式緩存目錄中旋圆。
配置參數(shù)
在 Yarn 模式下運行的大部分配置參數(shù)與其他的部署模式別無二致宠默。詳情參見 configuration page,其中包含了 Yarn 模式下特定的配置參數(shù)灵巧。
調(diào)試應(yīng)用程序
在 Yarn 的術(shù)語中搀矫,executor 和 AM 都運行在「容器」中。Yarn 有兩種模式處理應(yīng)用程序運行完成之后的日志刻肄。如果開啟了日志聚合功能(由參數(shù) yarn.log-aggregation-enable
控制)瓤球,日志會被拷貝到 HDFS,之后刪除本地機器上的日志敏弃。這些日志可以在集群中的任何一個節(jié)點上通過 yarn logs
命令查看卦羡。
yarn logs -applicationId <app ID>
該命令會打印出指定應(yīng)用程序所有容器中的日志。還可以直接通過 HDFS shell 或者 API 查看容器日志权她,可以通過 Yarn 的配置文件找到這些日志的存儲目錄(yarn.nodemanager.remote-app-log-dir
和 yarn.nodemanager.remote-app-log-dir-suffix
)虹茶。日志還可以從 Spark 應(yīng)用程序界面上的 executor Tab 頁面查看,需要同時運行 Spark history server 和 MapReduce history server隅要,并在 yarn-site.xml
文件中配置好參數(shù) yarn.log.server.url
蝴罪。Spark history server 界面上的日志 URL 會重定向到 MapReduce history server,來展示聚合后的日志步清。
如果日志聚合沒有開啟要门,日志將會保留在容器所在節(jié)點的 YARN_APP_LOGS_DIR
目錄下,通常是 /tmp/logs
或者 $HADOOP_HOME/logs/userlogs
廓啊,取決于 Hadoop 的版本和部署欢搜。查看日志需要到相應(yīng)的節(jié)點上的日志目錄中找到日志文件。子目錄通過應(yīng)用程序 ID 和容器 ID 組織日志文件谴轮。在不運行 MapReduce history server 的情況下炒瘟,日志還可以從 Spark 界面上的 executor Tab 頁面查看。
如果需要回顧容器的運行環(huán)境第步,需要將參數(shù) yarn.nodemanager.delete.debug-delay-sec
設(shè)置為一個較大的值(例如疮装,36000
),之后在容器運行的節(jié)點上通過參數(shù) yarn.nodemanager.local-dirs
配置的目錄訪問應(yīng)用程序緩存文件粘都。該目錄包含了容器啟動腳本廓推,依賴庫,以及啟動容器使用的環(huán)境變量翩隧。這種方式尤其適用于調(diào)試程序的 classpath樊展。(注意,開啟該功能需要集群管理員權(quán)限,并重啟所有的 NodeManager专缠。所以雷酪,不適用于托管集群。)
如果需要為 executor 或者 AM 指定自定義的 log4j 配置文件藤肢,有以下幾種方式:
- 通過
spark-submit
腳本的--files
選項上傳一份自定義的log4j.properties
文件太闺。 - 在參數(shù)
spark.driver.extraJavaOptions
(driver 端)或者spark.executor.extraJavaOptions
(executor 端)中添加-Dlog4j.configuration=<location of configuration file>
。注意嘁圈,如果使用單獨的文件省骂,必須顯示指定file:
協(xié)議,而且文件必須存在于集群上的每個節(jié)點中最住。 - 更新
$SPARK_CONF_DIR/log4j.properties
文件钞澳,它會和其他配置文件一起被上傳。注意涨缚,如果使用了多種方式轧粟,前面兩種方式擁有更高的優(yōu)先級。
注意脓魏,對于第一種方式兰吟,所有的 executor 和 AM 會共享同一份 log4j 配置文件,當它們運行在一個節(jié)點上時可能會造成不便(例如茂翔,executor 和 AM 會嘗試去寫同一個日志文件)混蔼。
為了讓 Yarn 能夠順利的展示和聚合日志文件,可以將 spark.yarn.app.container.log.dir
配置到 log4j.properties
文件中珊燎。例如惭嚣,log4j.appender.file_appender.File=${spark.yarn.app.container.log.dir}/spark.log
。對于流式應(yīng)用程序悔政,配置 RollingFileAppender
并將文件位置配置為 Yarn 的日志目錄可以避免大文件導致的磁盤溢出晚吞,還能夠通過 Yarn 的日志工具進行訪問。
如果應(yīng)用程序需要為 AM 和 executor 指定自定義的 metrics.properties
文件谋国,請更新 $SPARK_CONF_DIR/metrics.properties
文件槽地,它會和其他配置文件一起被上傳,所以不需要通過 --files
選項手動指定芦瘾。
Spark 屬性
屬性名稱 | 默認值 | 含義 | 起始版本 |
---|---|---|---|
spark.yarn.am.memory |
512m |
在 client 模式下 Yarn AM 的內(nèi)存用量闷盔,格式與 JVM 內(nèi)存字符串形式相同(例如,512m ,2g )旅急。在 cluster 模式下,請使用 spark.driver.memory 代替牡整。請使用小寫后綴 k 藐吮,m ,g ,t 和 p 谣辞,分別代表 KB迫摔,MB,GB泥从,TB 和 PB句占。 |
1.3.0 |
spark.yarn.am.resource.{resource-type}.amount |
(none) |
在 client 模式下 Yarn AM 的資源用量。在 cluster 模式下躯嫉,請使用 spark.yarn.driver.resource.<resource-type>.amount 代替纱烘。請注意該功能只適用于 YARN 3.0 及以上版本,參見 Yarn 資源模型文檔 https://hadoop.apache.org/docs/r3.0.1/hadoop-yarn/hadoop-yarn-site/ResourceModel.htmlExample祈餐。從 Yarn 申請 GPU 資源請使用:spark.yarn.am.resource.yarn.io/gpu.amount
|
3.0.0 |
spark.yarn.driver.resource.{resource-type}.amount |
(none) |
在 cluster 模式下 Yarn AM 的資源用量擂啥。請注意該功能只適用于 YARN 3.0 及以上版本,參見 Yarn 資源模型文檔 https://hadoop.apache.org/docs/r3.0.1/hadoop-yarn/hadoop-yarn-site/ResourceModel.htmlExample帆阳。從 Yarn 申請 GPU 資源請使用:spark.yarn.driver.resource.yarn.io/gpu.amount
|
3.0.0 |
spark.yarn.executor.resource.{resource-type}.amount |
(none) |
每個 executor 的資源用量哺壶。請注意該功能只適用于 YARN 3.0 及以上版本,參見 Yarn 資源模型文檔 https://hadoop.apache.org/docs/r3.0.1/hadoop-yarn/hadoop-yarn-site/ResourceModel.htmlExample蜒谤。從 Yarn 申請 GPU 資源請使用:spark.yarn.executor.resource.yarn.io/gpu.amount
|
3.0.0 |
spark.yarn.am.cores |
1 |
在 client 模式下 Yarn AM 使用的核數(shù)山宾。在 cluster 模式下,請使用 spark.driver.cores 代替鳍徽。 |
1.3.0 |
spark.yarn.am.waitTime |
100s |
只在 cluster 模式下生效资锰,Yarn AM 等待 SparkContext 初始化完成的超時時間。 |
1.3.0 |
spark.yarn.submit.file.replication |
HDFS 默認副本系數(shù)(通常是 3) | 應(yīng)用程序上傳到 HDFS 的文件的副本系數(shù)旬盯,包括 Spark Jar 依賴台妆,應(yīng)用 Jar 文件,和分布式緩存文件胖翰。 | 0.8.1 |
spark.yarn.stagingDir |
文件系統(tǒng)中當前用戶的家目錄 | 提交應(yīng)用程序時所使用的階段計算目錄接剩。 | 2.0.0 |
spark.yarn.preserve.staging.files |
false |
設(shè)置為 true 時,在任務(wù)完成時會保留階段文件(Spark Jar 依賴萨咳,應(yīng)用 Jar 文件懊缺,和分布式緩存文件),而不是刪除它們培他。 |
1.1.0 |
spark.yarn.scheduler.heartbeat.interval-ms |
3000 |
Spark 應(yīng)用的 AM 和 Yarn ResourceManager 之間的心跳時間間隔鹃两。該值的最大值為 Yarn 過期時間間隔(yarn.am.liveness-monitor.expiry-interval-ms )的一半。 |
0.8.1 |
spark.yarn.scheduler.initial-allocation.interval |
200ms |
當申請容器的請求未被滿足時 Spark 應(yīng)用 AM 向 Yarn ResourceManager 發(fā)送心跳信息的初始時間間隔舀凛。該值不應(yīng)該大于 spark.yarn.scheduler.heartbeat.interval-ms 俊扳。如果等待分配的容器依舊存在的話,申請分配的時間間隔會在成功收到心跳信息后翻倍猛遍,直到時間達到 spark.yarn.scheduler.heartbeat.interval-ms 馋记。(這里有點亂) |
1.4.0 |
spark.yarn.max.executor.failures |
numExecutors * 2号坡,最小值為 3 | 判定應(yīng)用程序失敗前 executor 異常的最大次數(shù)。 | 1.0.0 |
spark.yarn.historyServer.address |
(none) | Spark history server 的監(jiān)聽地址梯醒,例如 host.com:18080 宽堆。該地址不應(yīng)該包含協(xié)議模式(http:// )。默認為空茸习,因為 history server 是一個可選的服務(wù)畜隶。該地址提供給 Yarn ResourceManager,在 Spark 應(yīng)用程序結(jié)束之后号胚,將 ResourceManager UI 鏈接到 Spark history server UI籽慢。為此,Yarn 屬性可以用變量替代涕刚,會在 Spark 運行時進行替換嗡综。例如,如果 Spark history server 運行在和 YARN ResourceManager 相同的節(jié)點上杜漠,可以被設(shè)置為 ${hadoopconf-yarn.resourcemanager.hostname}:18080 极景。 |
1.0.0 |
spark.yarn.dist.archives |
(none) | 每個 executor 的工作目錄中需要抽取的以逗號分隔的歸檔文件的列表。 | 1.0.0 |
spark.yarn.dist.files |
(none) | 需要放到每個 executor 的工作目錄中的以逗號分隔的文件的列表驾茴。 | 1.0.0 |
spark.yarn.dist.jars |
(none) | 需要放到每個 executor 的工作目錄中的以逗號分隔的 Jar 文件的列表盼樟。 | 2.0.0 |
spark.yarn.dist.forceDownloadSchemes |
(none) |
以逗號分隔的模式列表,資源將會下載到本地硬盤锈至,而不是 Yarn 的分布式緩存晨缴。適用于 Yarn 不支持但是 Spark 支持的模式的場景,比如 http峡捡,https 和 ftp击碗,或者需要的 Jar 文件應(yīng)該加入到 Yarn 本地客戶端 classpath 中。通配符「*」表示下載所有模式的資源们拙。 | 2.3.0 |
spark.executor.instances |
2 |
靜態(tài)資源分配的 executor 數(shù)量稍途。如果開啟了 spark.dynamicAllocation.enabled ,初始 executor 數(shù)量最少會是這么多砚婆。 |
1.0.0 |
spark.yarn.am.memoryOverhead |
AM memory * 0.10, with minimum of 384 | 與 spark.driver.memoryOverhead 相同械拍,但是針對的是 client 模式下的 YARN AM。 |
1.3.0 |
spark.yarn.queue |
default |
應(yīng)用程序提交到的 Yarn 隊列装盯。 | 1.0.0 |
spark.yarn.jars |
(none) | Spark 依賴文件列表坷虑,會分發(fā)到 Yarn 的容器中。默認情況下埂奈,會使用本地安裝的 Spark 依賴迄损,但是 Spark 依賴也可以存放在全局可讀的 HDFS 路徑中。這種方式可以讓 Yarn 將依賴緩存到節(jié)點上账磺,而不需要在每次應(yīng)用程序啟動時都分發(fā)一次海蔽。例如共屈,對于指向 HDFS 路徑的依賴,可以配置為 hdfs:///some/path 党窜,支持通配符的使用。 |
2.0.0 |
spark.yarn.archive |
(none) | 一個包含 Spark 依賴的歸檔文件(壓縮文件)借宵,用于 Yarn 的分布式緩存依賴幌衣。如果設(shè)置了該配置項,會替代配置項 spark.yarn.jars 壤玫,該歸檔文件會應(yīng)用到所有的應(yīng)用程序容器中豁护。依賴應(yīng)該在歸檔文件中的根路徑中。跟前一個配置一樣欲间,歸檔文件可以放到 HDFS 上來加速分發(fā)楚里。 |
2.0.0 |
spark.yarn.appMasterEnv.[EnvironmentVariableName] |
(none) | 為 Yarn 上啟動的 AM 添加環(huán)境變量 EnvironmentVariableName 。用戶可以設(shè)置多個該配置項來指定多個環(huán)境變量猎贴。在 cluster 模式下該配置控制 driver 的運行環(huán)境班缎,在 client 模式下值控制 executor 啟動器的運行環(huán)境。 |
1.1.0 |
spark.yarn.containerLauncherMaxThreads |
25 |
AM 啟動 executor 容器的最大線程數(shù)她渴。 | 1.2.0 |
spark.yarn.am.extraJavaOptions |
(none) | 在 client 模式下傳遞給 AM 的額外的 JVM 選項字符串达址,在 cluster 模式下,請使用 spark.driver.extraJavaOptions 代替趁耗。注意沉唠,通過該選項配置最大堆內(nèi)存(-Xmx)是不合法的。最大堆內(nèi)存可以通過 spark.yarn.am.memory 配置苛败。 |
1.3.0 |
spark.yarn.am.extraLibraryPath |
(none) | 在 client 模式下满葛,設(shè)置啟動 AM 的特定的依賴庫。 |
1.4.0 |
spark.yarn.populateHadoopClasspath |
true | 是否通過 yarn.application.classpath 和 mapreduce.application.classpath 填充 Hadoop 的 classpath罢屈。注意嘀韧,如果該配置設(shè)置為 false ,就需要 with-Hadoop 的 Spark 版本儡遮,其中包含了 Hadoop 運行時依賴乳蛾,或者用戶必須單獨提供 Hadoop 的部署。 |
2.4.6 |
spark.yarn.maxAppAttempts |
yarn.resourcemanager.am.max-attempts in YARN |
提交應(yīng)用程序的最大嘗試次數(shù)鄙币。該值應(yīng)該不大于 Yarn 配置中的最大嘗試次數(shù)肃叶。 | 1.3.0 |
spark.yarn.am.attemptFailuresValidityInterval |
(none) | 定義跟蹤 AM 失敗的有效時間間隔。如果 AM 已經(jīng)運行了該值這么久十嘿,AM 的失敗計數(shù)將會被重置因惭。如果沒有配置則不啟用該功能。 | 1.6.0 |
spark.yarn.executor.failuresValidityInterval |
(none) | 定義跟蹤 executor 失敗的有效時間間隔绩衷。超過該值的 executor 失敗會被忽略蹦魔。 | 2.0.0 |
spark.yarn.submit.waitAppCompletion |
true |
在 cluster 模式下激率,控制客戶端是否等待應(yīng)用程序運行結(jié)束。如果設(shè)置為 true 勿决,客戶端進程將會持續(xù)報告應(yīng)用程序的狀態(tài)乒躺。否則,客戶端進程會在任務(wù)提交成功之后退出低缩。 |
1.4.0 |
spark.yarn.am.nodeLabelExpression |
(none) | 用來限制可以運行 AM 的節(jié)點的標簽表達式嘉冒。只有版本高于 2.6 的 Yarn 才支持標簽表達式,所以如果使用較早的版本咆繁,該配置將會被忽略讳推。 | 1.6.0 |
spark.yarn.executor.nodeLabelExpression |
(none) | 用來限制可以運行 executor 的節(jié)點的標簽表達式。只有版本高于 2.6 的 Yarn 才支持標簽表達式玩般,所以如果使用較早的版本银觅,該配置將會被忽略。 | 1.4.0 |
spark.yarn.tags |
(none) | 以逗號分隔的字符串列表坏为,代表應(yīng)用程序的標簽究驴,會在 應(yīng)用程序報告中展示,可以在查詢 Yarn 應(yīng)用程序時用作過濾條件久脯。 | 1.5.0 |
spark.yarn.priority |
(none) | 用于定義掛起應(yīng)用程序排序策略的優(yōu)先級纳胧,擁有較高數(shù)值的應(yīng)用程序?qū)袡C會被激活。目前帘撰,Yarn 只支持在使用 FIFO 排序策略的時候使用優(yōu)先級跑慕。 | 3.0.0 |
spark.yarn.config.gatewayPath |
(none) | 一個網(wǎng)關(guān)主機(Spark 應(yīng)用程序啟動的主機)上有效的路徑,但是對于集群中不同的節(jié)點可能不一樣摧找。與參數(shù) spark.yarn.config.replacementPath 一起使用核行,該參數(shù)用來支持節(jié)點配置不盡相同的集群,讓 Spark 能夠正確的啟動遠端進程蹬耘。替換路徑通常包含由 Yarn 暴露的環(huán)境變量的引用(所以對 Spark 應(yīng)用程序容器是可見的)芝雪。例如,如果網(wǎng)關(guān)節(jié)點的 Hadoop 依賴安裝在目錄 /disk1/hadoop 综苔,該位置作為環(huán)境變量 HADOOP_HOME 被 Yarn 暴露出來惩系,此時將該參數(shù)設(shè)置為 /disk1/hadoop ,并將替換路徑設(shè)置為 $HADOOP_HOME 可以保證在啟動遠端進程時使用的路徑是正確的如筛。 |
1.5.0 |
spark.yarn.config.replacementPath |
(none) | 參見 spark.yarn.config.gatewayPath 堡牡。 |
1.5.0 |
spark.yarn.rolledLog.includePattern |
(none) | 用于過濾日志文件名稱的 Java 正則表達式,匹配的日志文件將會以滾動的方式聚合杨刨。該參數(shù)應(yīng)該和 Yarn 的滾動日志聚合一起使用晤柄。在 Yarn 上開啟該功能需要在 yarn-site.xml 文件中配置參數(shù) yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds 。Spark 的 log4j appender 需要修改為使用 FileAppender 或者其他可以處理日志文件被清理的 appender妖胀〗婢保基于在 log4j 中配置的文件名稱(比如 spark.log )惠勒,用戶應(yīng)該將正則表達式設(shè)置為 spark*,來將所有需要被聚合的日志都包含在內(nèi)爬坑。 |
2.0.0 |
spark.yarn.rolledLog.excludePattern |
(none) | 用于過濾日志文件名稱的 Java 正則表達式纠屋,匹配的日志文件將會被聚合操作排除在外。如果文件名稱同時匹配 include 模式和 exclude 模式盾计,該文件最終會被排除在外巾遭。 | 2.0.0 |
spark.yarn.blacklist.executor.launch.blacklisting.enabled |
false | 是否開啟節(jié)點黑名單機制。判斷是否加入黑名單的故障次數(shù)可以通過參數(shù) spark.blacklist.application.maxFailedExecutorsPerNode 配置闯估。 |
2.4.0 |
spark.yarn.exclude.nodes |
(none) | 在資源分配中剔除的 Yarn 節(jié)點,以逗號分隔吼和。 | 3.0.0 |
spark.yarn.metrics.namespace |
(none) | AM 統(tǒng)計信息報告的根命名空間涨薪。如果未設(shè)置,則使用 Yarn 應(yīng)用程序 ID炫乓。 | 2.4.0 |
SHS 自定義 executor 日志 URL 可用的匹配模式
官網(wǎng)上就是這樣的刚夺,也沒懂起這是啥
Pattern | Meaning |
---|---|
http:// or https:// according to YARN HTTP policy. (Configured via yarn.http.policy ) |
|
The "host" of node where container was run. | |
The "port" of node manager where container was run. | |
The "port" of node manager's http server where container was run. | |
Http URI of the node on which the container is allocated. | |
The cluster ID of Resource Manager. (Configured via yarn.resourcemanager.cluster-id ) |
|
The ID of container. | |
'SPARK_USER' on system environment. | |
stdout , stderr . |
例如,如果你想將日志 URL 直接鏈接到 Job History Server末捣,而不是讓 NodeManager 的 http server 重定向侠姑,可以配置參數(shù) spark.history.custom.executor.log.url
為:
<JHS_HOST>:<JHS_PORT>/jobhistory/logs/:////?start=-4096
注意:需要將 <JHS_POST>
和 <JHS_PORT>
替換為實際的值。
資源分配和配置概述
請確保已經(jīng)閱讀了配置文檔 configuration page 中的「自定義資源調(diào)度和配置概覽」章節(jié)(Custom Resource Scheduling and Configuration Overview)箩做。本章節(jié)只討論有關(guān) Yarn 相關(guān)的資源調(diào)度莽红。
Yarn 通過配置來支持用戶 Spark 程序需要的資源,Yarn 上的資源調(diào)度在 Yarn 3.1.0 版本中引入邦邦。配置資源和隔離的詳情參見 Yarn 官方文檔安吁。理想情況下容器資源是隔離的,executor 只能訪問分配給它的資源燃辖。如果沒有開啟資源隔離鬼店,用戶就要自己負責創(chuàng)建一個發(fā)現(xiàn)腳本來保證資源沒有被多個 executor 共享。
Yarn 目前支持任意用戶自定義的資源類型黔龟,除了內(nèi)置的 GPU(yarn.io/gpu
)和 FPGA(yarn.io/fpga
)類型妇智。所以,如果使用了這兩種資源氏身,Spark 可以將 spark 資源翻譯為 Yarn 資源巍棱,需要做的只是設(shè)置參數(shù) spark.{driver/executor}.resource.
。如果使用了 FPGA 或者 GPU 之外的資源類型观谦,用戶需要自己設(shè)置 Yarn(spark.yarn.{driver/executor}.resource.
)和 Spark(spark.{driver/executor}.resource.
)的參數(shù)拉盾。
例如,如果需要為每個 executor 申請兩個 GPU豁状,用戶可以指定 spark.executor.resource.gpu.amount=2
捉偏,Spark 會負責向 Yarn 申請 yarn.io/gpu
資源倒得。
如果使用了自定義的 Yarn 資源類型,假設(shè)為 acceleratorX
夭禽,那么用戶必須同時指定 spark.yarn.executor.resource.acceleratorX.amount=2
和 spark.executor.resource.acceleratorX.amount=2
霞掺。
Yarn 并沒有告訴 Spark 分配給各個容器的資源的地址,所以讹躯,用戶必須指定一個 executor 在啟動時運行的發(fā)現(xiàn)腳本來發(fā)現(xiàn)可用的資源菩彬。在 Spark 安裝目錄中有一個示例腳本 examples/src/main/scripts/getGpusResources.sh
。該腳本必須有執(zhí)行權(quán)限潮梯,用戶還應(yīng)該為其設(shè)置權(quán)限避免惡意用戶的修改骗灶。該腳本需要以 ResourceInformation
的格式向標準輸出寫入一個 JSON 字符串,其中包含一個資源名稱以及一個資源地址的數(shù)組秉馏。
重要事項
- 調(diào)度決策中核數(shù)申請是否會被滿足取決于采用的何種類似的調(diào)度器及其是如何配置的耙旦。
- 在
cluster
模式下,driver 和 executor 所用的本地目錄就是 Yarn 中所配置的本地目錄(Hadoop Yarn 配置項yarn.nodemanager.local-dirs
)萝究。如果用戶指定了spark.local.dir
免都,該參數(shù)會被忽略。在client
模式下帆竹,executor 所用的本地目錄就是 Yarn 中所配置的本地目錄绕娘,而 driver 會使用參數(shù)spark.local.dir
定義的目錄。因為在client
模式下 driver 沒有運行在 Yarn 的集群中栽连,只有 executor 在集群上運行险领。 - 選項
--files
和--archives
支持用 # 指定文件名稱,和 Hadoop 類似升酣。例如舷暮,如果指定--files localtest.txt#appSees.txt
,那么將會本地名稱為localtest.txt
的文件上傳到 HFDS噩茄,但是會被鏈接為名稱為appSees.txt
的文件下面,應(yīng)用程序在 Yarn 上運行時應(yīng)該使用名稱appSees.txt
來訪問該文件。 - 如果使用本地文件但是在
cluster
模式下運行绩聘,選項--jars
指定的 Jar 文件可以通過SparkContext.addJar
方法訪問沥割。如果使用 HDFS,HTTP凿菩,HTTPS 或者 FTP 文件則不需要使用該選項机杜。
Kerberos
標準的 Kerberos 支持參見 Security 文檔。
在 Yarn 模式下訪問 Hadoop 文件系統(tǒng)時衅谷,除了 Hadoop 配置文件中的默認文件系統(tǒng)椒拗,Spark 還會自動獲取代理 token 來服務(wù)應(yīng)用程序的 stage 目錄。
Yarn 的 Kerberos 配置
屬版本性名稱 | 默認值 | 含義 | 起始版本 |
---|---|---|---|
spark.kerberos.principal |
(none) | 在安全集群中運行時用來登錄 KDC 的 Principal,等同于命令行參數(shù) --principal 蚀苛。(也適用于 master 為「local」的場景) |
3.0.0 |
spark.kerberos.keytab |
(none) | 上述 principal 相應(yīng)的 keytab 文件的完整路徑在验。該 keytab 文件在會被拷貝到運行 Yarn AM 的節(jié)點上的分布式緩存中,用來定期更新 ticket 和代理 tocken堵未。等同于命令行參數(shù) --keytab 腋舌。(也適用于 master 為「local」的場景) |
3.0.0 |
spark.yarn.kerberos.relogin.period |
1m | 多久檢查一次 kerberos TGT 應(yīng)該被更新,該值應(yīng)該比 TGT 續(xù)約時間短(或者 TGT 聲明周期渗蟹,如果 TGT 續(xù)約時間沒有被更新的話)块饺。默認值應(yīng)該可以滿足大多數(shù)場景的需要。 | 2.3.0 |
Kerberos 疑難解答
調(diào)試 Hadoop/Kerberos 問題是很困難的雌芽。一個有效的技巧就是啟動 Hadoop 中 Kerberos 操作的額外日志輸出授艰,可以通過設(shè)置 HADOOP_JAAS_DEBUG
環(huán)境變量來設(shè)置。
export HADOOP_JAAS_DEBUG=true
可以通過系統(tǒng)屬性 sun.security.krb5.debug
和 sun.security.spnego.debug
來配置 JDK 類開啟 Kerberos 和 SPNEGO/REST 認證的額外日志輸出世落。
-Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true
所有這些選項都可以在 AM 中開啟:
spark.yarn.appMasterEnv.HADOOP_JAAS_DEBUG true
spark.yarn.am.extraJavaOptions -Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true
最后想诅,如果 org.apache.spark.deploy.yarn.Client
的日志輸出級別設(shè)置為 DEBUG
,日志將會包含所獲得的的 token 列表岛心,以及它們的過期時間信息。
配置 External Shuffle Service
如果要在 Yarn 集群中的每個 NodeManager
上啟動 Spark Shuffle Service篮灼,需要以下幾個步驟:
- 和 YARN profile 一起編譯 Spark忘古,如果使用預置版本請?zhí)^這一步。
- 找到
spark-<version>-yarn-shuffle.jar
诅诱。如果自定編譯 Spark髓堪,該文件應(yīng)該在$SPARK_HOME/common/network-yarn/target/scala-<version>
目錄下;如果使用預置版本娘荡,應(yīng)該在目錄yarn
下干旁。 - 將該 Jar 文件添加到集群中所有
NodeManager
的 classpath 中。 - 在集群中每個節(jié)點上的配置文件
yarn-site.xml
中炮沐,添加spark_shuffle
到yarn.nodemanager.aux-services
争群,并將yarn.nodemanager.aux-services.spark_shuffle.class
設(shè)置為org.apache.spark.network.yarn.YarnShuffleService
。 - 通過配置文件
etc/hadoop/yarn-env.sh
中的YARN_HEAPSIZE
環(huán)境變量增加NodeManager
的堆內(nèi)存(默認為 1000)大年,來避免 shuffle 過程中的垃圾回收問題换薄。 - 重啟集群中所有的
NodeManager
。
下面的額外配置項在 shuffle service 運行到 Yarn 集群上時可以使用:
屬性名稱 | 默認值 | 含義 |
---|---|---|
spark.yarn.shuffle.stopOnFailure |
false |
是否在 Spark Shuffle Service 初始化失敗時停止該 NodeManager翔试。開啟后會防止應(yīng)用程序因為 Spark Shuffle Service 沒有在運行而出現(xiàn)運行異常轻要。 |
Launching your application with Apache Oozie
Apache Oozie 可以將 Spark 應(yīng)用程序作為工作流的一部分來啟動。在一個安全集群中垦缅,啟動的應(yīng)用程序需要相應(yīng)的 token 來訪問集群服務(wù)冲泥。如果 Spark 啟動時攜帶了 keytab 文件,這些會自動完成。然而凡恍,如果沒有攜帶 keytab 文件志秃,那么安全機制的責任就會傳遞給 Oozie。
關(guān)于在安全集群上配置 Oozie 以及為某個任務(wù)獲取認證文件的詳情參見相應(yīng)版本 Oozie web site 的「Authentication」章節(jié)咳焚。
對于 Spark 應(yīng)用程序洽损,Oozie 工作流必須獲取應(yīng)用程序需要的所有 token,包括:
- YARN 資源管理器革半。
- 本地 Hadoop 文件系統(tǒng)
- 作為 IO 數(shù)據(jù)源或者目的地用到的遠程 Hadoop 文件系統(tǒng)碑定。
- Hive — 如果用到的話。
- HBase — 如果用到的話又官。
- YARN 時間線服務(wù)器延刘,如果應(yīng)用程序與之交互的話。
為了避免 Spark 嘗試獲取 Hive六敬,HBase 以及遠程 HDFS token——然后失數饫怠(很尷尬),Spark 配置必須禁用這些服務(wù)的 token 收集外构。
Spark 配置文件必須包含:
spark.security.credentials.hive.enabled false
spark.security.credentials.hbase.enabled false
配置項 spark.kerberos.access.hadoopFileSystems
必須不設(shè)定普泡。
使用 Spark History Server 代替 Spark Web 界面
在應(yīng)用程序界面被禁用時,可以使用 Spark History Server 的應(yīng)用程序頁面來跟蹤正在運行的應(yīng)用程序的進度审编。這種方式適用于安全集群撼班,還可以降低 driver 端的內(nèi)存消耗。啟用 Spark History Server垒酬,需要以下步驟:
- 在應(yīng)用程序端砰嘁,設(shè)置參數(shù)
spark.yarn.historyServer.allowTracking=true
,該配置會告訴 Spark 如果沒有開啟應(yīng)用程序界面則使用 history server 的 URL 來跟蹤應(yīng)用程序勘究。 - 在 the Spark History Server 端象迎,添加
org.apache.spark.deploy.yarn.YarnProxyRedirectFilter
到參數(shù)spark.ui.filters
的過濾器列表中拴孤。
需要知道的是 history server 中的應(yīng)用程序狀態(tài)信息可能不會及時更新丽惶。