0902 Running Spark on YARN

轉(zhuǎn)載請注明出處,謝謝合作~

在 Yarn 上運行 Spark

對 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.archivespark.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-diryarn.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藐吮,mgtp谣辞,分別代表 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.classpathmapreduce.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=2spark.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.debugsun.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篮灼,需要以下幾個步驟:

  1. YARN profile 一起編譯 Spark忘古,如果使用預置版本請?zhí)^這一步。
  2. 找到 spark-<version>-yarn-shuffle.jar诅诱。如果自定編譯 Spark髓堪,該文件應(yīng)該在 $SPARK_HOME/common/network-yarn/target/scala-<version> 目錄下;如果使用預置版本娘荡,應(yīng)該在目錄 yarn 下干旁。
  3. 將該 Jar 文件添加到集群中所有 NodeManager 的 classpath 中。
  4. 在集群中每個節(jié)點上的配置文件 yarn-site.xml 中炮沐,添加 spark_shuffleyarn.nodemanager.aux-services争群,并將 yarn.nodemanager.aux-services.spark_shuffle.class 設(shè)置為 org.apache.spark.network.yarn.YarnShuffleService
  5. 通過配置文件 etc/hadoop/yarn-env.sh 中的 YARN_HEAPSIZE 環(huán)境變量增加 NodeManager 的堆內(nèi)存(默認為 1000)大年,來避免 shuffle 過程中的垃圾回收問題换薄。
  6. 重啟集群中所有的 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)信息可能不會及時更新丽惶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末带迟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子景描,更是在濱河造成了極大的恐慌券时,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伏伯,死亡現(xiàn)場離奇詭異橘洞,居然都是意外死亡,警方通過查閱死者的電腦和手機说搅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門炸枣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事适肠』羯溃” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵侯养,是天一觀的道長敦跌。 經(jīng)常有香客問我,道長逛揩,這世上最難降的妖魔是什么柠傍? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮辩稽,結(jié)果婚禮上惧笛,老公的妹妹穿的比我還像新娘。我一直安慰自己逞泄,他們只是感情好患整,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喷众,像睡著了一般各谚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上到千,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天嘲碧,我揣著相機與錄音,去河邊找鬼父阻。 笑死,一個胖子當著我的面吹牛望抽,可吹牛的內(nèi)容都是我干的加矛。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼煤篙,長吁一口氣:“原來是場噩夢啊……” “哼斟览!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辑奈,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤苛茂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸠窗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妓羊,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年稍计,在試婚紗的時候發(fā)現(xiàn)自己被綠了躁绸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖净刮,靈堂內(nèi)的尸體忽然破棺而出剥哑,到底是詐尸還是另有隱情,我是刑警寧澤淹父,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布株婴,位于F島的核電站,受9級特大地震影響暑认,放射性物質(zhì)發(fā)生泄漏困介。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一穷吮、第九天 我趴在偏房一處隱蔽的房頂上張望逻翁。 院中可真熱鬧,春花似錦捡鱼、人聲如沸八回。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缠诅。三九已至,卻和暖如春乍迄,著一層夾襖步出監(jiān)牢的瞬間管引,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工闯两, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褥伴,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓漾狼,卻偏偏與公主長得像重慢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逊躁,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361