Spark 在YARN上運行

在YARN上運行Spark

在0.6.0版中,Spark添加了對在YARN(Hadoop NextGen)上運行的支持,並在後續發行版中進行了改進。

安全

默認情況下,Spark中的安全性處於關閉狀態。這可能意味着您默認情況下容易受到攻擊。在運行Spark之前,請參閱Spark安全性和本文檔中的特定安全性部分。

在YARN上啓動Spark

確保HADOOP_CONF_DIRYARN_CONF_DIR指向包含Hadoop集羣的(客戶端)配置文件的目錄。這些配置用於寫入HDFS並連接到YARN ResourceManager。此目錄中包含的配置將分發到YARN羣集,以便應用程序使用的所有容器都使用相同的配置。如果配置引用不是由YARN管理的Java系統屬性或環境變量,則還應該在Spark應用程序的配置(在客戶端模式下運行時的驅動程序,執行程序和AM)中進行設置。

有兩種部署模式可用於在YARN上啓動Spark應用程序。在cluster模式下,Spark驅動程序在由YARN在羣集上管理的應用程序主進程中運行,並且客戶端可以在啓動應用程序後消失。在client模式下,驅動程序在客戶端進程中運行,而應用程序主控僅用於從YARN請求資源。

與Spark支持的其他集羣管理器(在--master 參數中指定了主服務器的地址)不同,在YARN模式下,ResourceManager的地址是從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 \

    examples/jars/spark-examples*.jar \

    10

上面啓動了一個YARN客戶端程序,該程序啓動了默認的Application Master。然後,SparkPi將作爲Application Master的子線程運行。客戶端將定期輪詢Application Master以獲取狀態更新,並將其顯示在控制檯中。應用程序完成運行後,客戶端將退出。請參閱下面的“調試應用程序”部分,以瞭解如何查看驅動程序和執行程序日誌。

要以client模式啓動Spark應用程序,請執行相同的操作,但替換clusterclient。下面顯示瞭如何spark-shellclient模式下運行:

$ ./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支持構建的Spark二進制分發版。二進制發行版可以從項目網站的下載頁面下載。要自己構建Spark,請參閱構建Spark

要使YARN端可以訪問Spark運行時jar,可以指定spark.yarn.archivespark.yarn.jars。有關詳細信息,請參閱Spark屬性。如果既未指定也spark.yarn.archivespark.yarn.jars指定,Spark將創建一個包含所有jar的zip文件,$SPARK_HOME/jars並將其上傳到分佈式緩存。

組態

YARN上的Spark的大多數配置與其他部署模式相同。有關這些的更多信息,請參見配置頁面。這些是特定於YARN上Spark的配置。

調試您的應用程序

用YARN術語來說,執行者和應用程序主管在“容器”內部運行。在應用程序完成之後,YARN有兩種處理容器日誌的模式。如果啓用了日誌聚合(使用yarn.log-aggregation-enable配置),則將容器日誌複製到HDFS並在本地計算機上刪除。可以使用yarn logs命令從羣集的任何位置查看這些日誌。

yarn logs -applicationId <app ID>

將從給定應用程序的所有容器中打印出所有日誌文件的內容。您還可以使用HDFS Shell或API在HDFS中直接查看容器日誌文件。通過查看您的YARN配置(yarn.nodemanager.remote-app-log-diryarn.nodemanager.remote-app-log-dir-suffix)可以找到它們所在的目錄。日誌也可在Spark Web UI的“執行程序”選項卡下使用。您需要同時運行Spark歷史記錄服務器和MapReduce歷史記錄服務器並yarn.log.server.url進行yarn-site.xml正確配置。Spark歷史記錄服務器UI上的日誌URL會將您重定向到MapReduce歷史記錄服務器以顯示聚合的日誌。

如果未啓用日誌聚合,則日誌將在本地的每臺計算機上本地保留YARN_APP_LOGS_DIR,通常配置爲Hadoop的版本和安裝,/tmp/logs$HADOOP_HOME/logs/userlogs取決於Hadoop的版本和安裝。要查看容器的日誌,需要轉到包含它們的主機並在此目錄中查找。子目錄按應用程序ID和容器ID組織日誌文件。日誌也可以在Spark Web UI的“執行程序”選項卡下使用,並且不需要運行MapReduce歷史記錄服務器。

要查看每個容器的啓動環境,請增加yarn.nodemanager.delete.debug-delay-sec一個較大的值(例如36000),然後yarn.nodemanager.local-dirs 在啓動容器的節點上訪問應用程序緩存。該目錄包含啓動腳本,JAR和用於啓動每個容器的所有環境變量。該過程對於調試類路徑問題特別有用。(請注意,啓用此功能需要對羣集設置具有管理員權限,並需要重新啓動所有節點管理器。因此,這不適用於託管羣集)。

要將自定義log4j配置用於應用程序主服務器或執行程序,請使用以下選項:

  • 通過將自定義添加到要隨應用程序上傳的文件列表中,log4j.properties使用來上傳自定義。spark-submit--files
  • 添加-Dlog4j.configuration=<location of configuration file>spark.driver.extraJavaOptions (對於驅動程序)或spark.executor.extraJavaOptions(對於執行程序)。請注意,如果使用文件,file:則應明確提供協議,並且文件必須在所有節點上本地存在。
  • 更新$SPARK_CONF_DIR/log4j.properties文件,它將與其他配置一起自動上傳。請注意,如果指定了多個選項,則其他2個選項的優先級高於此選項。

請注意,對於第一種選擇,執行器和應用程序主控器將共享相同的log4j配置,這可能在它們在同一節點上運行時引起問題(例如,嘗試寫入同一日誌文件)。

如果您需要引用適當的位置以將日誌文件放入YARN中,以便YARN可以正確顯示和聚合它們,請spark.yarn.app.container.log.dir在中使用log4j.properties。例如,log4j.appender.file_appender.File=${spark.yarn.app.container.log.dir}/spark.log。對於流應用程序,RollingFileAppender將文件位置配置和設置到YARN的日誌目錄將避免由大日誌文件引起的磁盤溢出,並且可以使用YARN的日誌實用程序訪問日誌。

要將自定義metrics.properties用於應用程序主服務器和執行程序,請更新$SPARK_CONF_DIR/metrics.properties文件。它會自動以其他配置上傳,因此您無需使用手動指定它--files

Spark特性

物業名稱

默認

含義

spark.yarn.am.memory

512m

的存儲器的量在客戶機模式中使用用於紗線的應用萬事達,在相同的格式JVM存儲器串(例如512m2g)。在羣集模式下,請spark.driver.memory改用。

使用小寫字母后綴,例如kmgt,和p,爲kibi-,mebi-,gibi-,tebi-和pebibytes,分別。

spark.yarn.am.cores

1

客戶端模式下用於YARN Application Master的核心數。在羣集模式下,請spark.driver.cores改用。

spark.yarn.am.waitTime

100s

僅在cluster模式下使用。YARN Application Master等待SparkContext初始化的時間。

spark.yarn.submit.file.replication

默認的HDFS複製(通常爲3

上傳到應用程序的HDFS中的文件的HDFS複製級別。其中包括Spark jar,app jar和任何分佈式緩存文件/歸檔。

spark.yarn.stagingDir

文件系統中當前用戶的主目錄

提交應用程序時使用的登臺目錄。

spark.yarn.preserve.staging.files

false

設置爲true在作業結束時保留暫存的文件(Spark jar,app jar,分佈式緩存文件),而不是刪除它們。

spark.yarn.scheduler.heartbeat.interval-ms

3000

Spark應用程序主設備心跳到YARN ResourceManager中的時間間隔(以毫秒爲單位)。該值的上限爲YARN配置值的一半(即) yarn.am.liveness-monitor.expiry-interval-ms

spark.yarn.scheduler.initial-allocation.interval

200ms

當存在掛起的容器分配請求時,Spark應用程序主服務器急切地向YARN ResourceManager發出心跳的初始時間間隔。不得大於 spark.yarn.scheduler.heartbeat.interval-ms。如果仍存在掛起的容器,spark.yarn.scheduler.heartbeat.interval-ms則分配間隔將在連續的緊急心跳中加倍,直到達到爲止 。

spark.yarn.max.executor.failures

numExecutors * 2,最少3個

在使應用程序失敗之前,執行程序失敗的最大次數。

spark.yarn.historyServer.address

(沒有)

Spark歷史記錄服務器的地址,例如host.com:18080。該地址不應包含方案(http://)。由於歷史記錄服務器是一項可選服務,因此默認情況下未設置。當Spark應用程序完成將應用程序從ResourceManager UI鏈接到Spark歷史記錄服務器UI時,此地址將提供給YARN ResourceManager。對於此屬性,可以將YARN屬性用作變量,並且在運行時將其替換爲Spark。例如,如果Spark歷史記錄服務器與YARN ResourceManager在同一節點上運行,則可以將其設置爲${hadoopconf-yarn.resourcemanager.hostname}:18080

spark.yarn.dist.archives

(沒有)

以逗號分隔的存檔列表,將其提取到每個執行程序的工作目錄中。

spark.yarn.dist.files

(沒有)

以逗號分隔的文件列表,將其放置在每個執行程序的工作目錄中。

spark.yarn.dist.jars

(沒有)

以逗號分隔的jar列表,​​將其放置在每個執行程序的工作目錄中。

spark.yarn.dist.forceDownloadSchemes

(none)

以逗號分隔的方案列表,其資源將在添加到YARN的分佈式緩存之前先下載到本地磁盤。適用於YARN服務不支持Spark支持的方案(如http,https和ftp)或本地YARN客戶端的類路徑中需要的jar的情況。表示通配符“ *”以下載所有方案的資源。

spark.executor.instances

2

靜態分配的執行程序數。使用spark.dynamicAllocation.enabled,初始執行器集至少會這麼大。

spark.yarn.am.memoryOverhead

AM內存* 0.10,最少384

與相同spark.driver.memoryOverhead,但用於客戶端模式下的YARN Application Master。

spark.yarn.queue

default

提交應用程序的YARN隊列的名稱。

spark.yarn.jars

(沒有)

包含要分發到YARN容器的Spark代碼的庫列表。默認情況下,YARN上的Spark將使用本地安裝的Spark jar,但是Spark jar也可以位於HDFS上的世界可讀位置。這使YARN可以將其緩存在節點上,因此不需要在每次運行應用程序時將其分發。例如,要指向HDFS上的jar,請將此配置設置爲hdfs:///some/path。允許使用小球。

spark.yarn.archive

(沒有)

包含所需的Spark jar的歸檔文件,用於分發到YARN緩存。如果設置,將替換此配置,spark.yarn.jars並且在所有應用程序容器中使用存檔。歸檔文件應在其根目錄中包含jar文件。與上一個選項一樣,存檔文件也可以託管在HDFS上,以加快文件分發速度。

spark.yarn.appMasterEnv.[EnvironmentVariableName]

(沒有)

將指定的環境變量添加EnvironmentVariableName到在YARN上啓動的Application Master進程中。用戶可以指定多個,並設置多個環境變量。在cluster模式下,它控制Spark驅動程序的環境,在client模式下,它僅控制執行程序啓動器的環境。

spark.yarn.containerLauncherMaxThreads

25

YARN Application Master中用於啓動執行程序容器的最大線程數。

spark.yarn.am.extraJavaOptions

(沒有)

在客戶端模式下傳遞給YARN Application Master的一串額外的JVM選項。在羣集模式下,請spark.driver.extraJavaOptions改用。請注意,使用此選項設置最大堆大小(-Xmx)設置是非法的。最大堆大小設置可以使用spark.yarn.am.memory

spark.yarn.am.extraLibraryPath

(沒有)

設置在客戶端模式下啓動YARN Application Master時要使用的特殊庫路徑。

spark.yarn.maxAppAttempts

yarn.resourcemanager.am.max-attempts 在紗

提交申請的最大嘗試次數。它不應大於YARN配置中的最大最大嘗試次數。

spark.yarn.am.attemptFailuresValidityInterval

(沒有)

定義AM故障跟蹤的有效間隔。如果AM已經運行了至少已定義的時間間隔,則AM故障計數將被重置。如果未配置,則不會啓用此功能。

spark.yarn.executor.failuresValidityInterval

(沒有)

定義執行程序失敗跟蹤的有效間隔。超過有效間隔的執行器故障將被忽略。

spark.yarn.submit.waitAppCompletion

true

在YARN羣集模式下,控制客戶端是否等待退出直到應用程序完成。如果設置爲true,則客戶端進程將保持活動狀態,報告應用程序的狀態。否則,客戶端進程將在提交後退出。

spark.yarn.am.nodeLabelExpression

(沒有)

將調度限制節點AM集合的YARN節點標籤表達式。只有大於或等於2.6的YARN版本才支持節點標籤表達式,因此在針對早期版本運行時,將忽略此屬性。

spark.yarn.executor.nodeLabelExpression

(沒有)

將調度限制節點執行程序集的YARN節點標籤表達式。只有大於或等於2.6的YARN版本才支持節點標籤表達式,因此在針對早期版本運行時,將忽略此屬性。

spark.yarn.tags

(沒有)

將以逗號分隔的字符串列表作爲YARN ApplicationReports中出現的YARN應用程序標籤傳遞,可用於查詢YARN應用程序時進行過濾。

spark.yarn.config.gatewayPath

(沒有)

在網關主機(啓動Spark應用程序的主機)上有效的路徑,但對於集羣中其他節點中相同資源的路徑可能會有所不同。與結合使用 spark.yarn.config.replacementPath,它用於支持具有異構配置的集羣,以便Spark可以正確啓動遠程進程。

替換路徑通常將包含對YARN導出的某些環境變量的引用(因此對Spark容器可見)。

例如,如果網關節點在上安裝了Hadoop庫/disk1/hadoop,並且YARN將Hadoop安裝的位置作爲HADOOP_HOME 環境變量導出 ,則將該值設置爲/disk1/hadoop,並將替換路徑設置爲, $HADOOP_HOME將確保用於啓動遠程進程的路徑正確引用本地YARN配置。

spark.yarn.config.replacementPath

(沒有)

請參閱spark.yarn.config.gatewayPath

spark.yarn.rolledLog.includePattern

(沒有)

Java Regex過濾與定義的包含模式匹配的日誌文件,這些日誌文件將以滾動方式聚合。這將與YARN的滾動日誌聚合一起使用,要在YARN端啓用此功能, yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds應在yarn-site.xml中進行配置。此功能只能與Hadoop 2.6.4+一起使用。需要將Spark log4j附加程序更改爲使用FileAppender或另一個附加程序,該附加程序可以在運行時處理要刪除的文件。基於在log4j配置中配置的文件名(例如spark.log),用戶應將正則表達式(spark *)設置爲包括所有需要彙總的日誌文件。

spark.yarn.rolledLog.excludePattern

(沒有)

Java Regex用於過濾與定義的排除模式匹配的日誌文件,並且這些日誌文件不會以滾動方式聚合。如果日誌文件名與包含和排除模式均匹配,則該文件最終將被排除。

spark.yarn.blacklist.executor.launch.blacklisting.enabled

啓用對具有YARN資源分配問題的節點的黑名單的標記。可以通過配置黑名單的錯誤限制 spark.blacklist.application.maxFailedExecutorsPerNode

spark.yarn.metrics.namespace

(沒有)

AM指標報告的根名稱空間。如果未設置,則使用YARN應用程序ID。

重要筆記

  • 在調度決策中是否遵循核心請求取決於所使用的調度程序及其配置方式。
  • cluster模式下,Spark執行程序和Spark驅動程序使用的本地目錄將是爲YARN(Hadoop YARN config yarn.nodemanager.local-dirs)配置的本地目錄。如果用戶指定spark.local.dir,它將被忽略。在client模式下,Spark執行程序將使用爲YARN配置的本地目錄,而Spark驅動程序將使用中定義的本地目錄spark.local.dir。這是因爲Spark驅動程序不在YARN羣集上以client模式運行,只有Spark執行程序運行。
  • --files--archives選項支持類似於Hadoop的該#指定文件名。例如,您可以指定:--files localtest.txt#appSees.txt並且這會將您本地命名的文件上載localtest.txt到HDFS,但這將通過name鏈接到appSees.txt,並且您的應用程序appSees.txt在YARN上運行時應使用該名稱作爲引用。
  • 如果您將其與本地文件一起使用並在模式下運行,則該--jars選項可使該SparkContext.addJar功能正常工作cluster。如果將它與HDFS,HTTP,HTTPS或FTP文件一起使用,則無需使用它。

的Kerberos

“ 安全性”頁面涵蓋了Spark中的標準Kerberos支持。

在YARN模式下,訪問Hadoop文件系統時,Spark將自動獲取以下內容的委託令牌:

  • 託管Spark應用程序登臺目錄的文件系統(如果spark.yarn.stagingDir未設置,則爲默認文件系統);
  • 如果啓用了Hadoop聯合身份驗證,則配置中的所有聯合文件系統。

如果應用程序需要與其他安全的Hadoop文件系統進行交互,則需要在啓動時將其URI明確提供給Spark。通過在spark.yarn.access.hadoopFileSystems屬性中列出它們來完成此操作 ,如下面的配置部分所述。

YARN集成還使用Java服務機制來支持自定義委託令牌提供者(請參閱參考資料java.util.ServiceLoader)。org.apache.spark.deploy.yarn.security.ServiceCredentialProvider通過在jar的META-INF/services目錄中相應文件中列出其名稱,可以使Spark的實現 可用。通過將設置spark.security.credentials.{service}.enabled爲 false,可以單獨禁用這些提供程序,其中{service}憑證提供程序的名稱。

YARN特定的Kerberos配置

物業名稱

默認

含義

spark.yarn.keytab

(沒有)

包含上面指定的主體的密鑰表的文件的完整路徑。該密鑰表將通過YARN分佈式緩存複製到運行YARN Application Master的節點,並將用於定期更新登錄憑單和委託令牌。等效於--keytab命令行參數。
(也可以與“本地”母版一起使用。)

spark.yarn.principal

(沒有)

在安全羣集上運行時用於登錄KDC的主體。等效於 --principal命令行參數。
(也可以與“本地”母版一起使用。)

spark.yarn.access.hadoopFileSystems

(沒有)

您的Spark應用程序將要訪問的安全Hadoop文件系統的列表,以逗號分隔。例如,spark.yarn.access.hadoopFileSystems=hdfs://nn1.com:8032,hdfs://nn2.com:8032, webhdfs://nn3.com:50070。Spark應用程序必須有權訪問列出的文件系統,並且必須正確配置Kerberos才能訪問它們(在同一領域或在受信任領域)。Spark爲每個文件系統獲取安全令牌,以便Spark應用程序可以訪問那些遠程Hadoop文件系統。

spark.yarn.kerberos.relogin.period

1m

多久檢查一次是否應更新kerberos TGT。該值應設置爲短於TGT更新週期(如果未啓用TGT更新,則爲TGT生存期)。對於大多數部署,默認值應該足夠。

Kerberos故障排除

調試Hadoop / Kerberos問題可能很“困難”。一種有用的技術是通過設置HADOOP_JAAS_DEBUG 環境變量來在Hadoop中啓用Kerberos操作的額外日誌記錄。

export HADOOP_JAAS_DEBUG=true

可以將JDK類配置爲通過系統屬性sun.security.krb5.debug 和屬性來啓用其Kerberos和SPNEGO / REST身份驗證的額外日誌記錄sun.security.spnego.debug=true

-Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true

所有這些選項都可以在Application Master中啓用:

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設置爲DEBUG,則該日誌將包含所有獲得的令牌的列表以及它們的有效期詳細信息

配置外部隨機播放服務

NodeManager在YARN羣集中的每個羣集上啓動Spark Shuffle服務,請按照以下說明進行操作:

  1. 使用YARN配置文件構建Spark 。如果您使用預打包的發行版,請跳過此步驟。
  2. 找到spark-<version>-yarn-shuffle.jar$SPARK_HOME/common/network-yarn/target/scala-<version>如果您自己構建Spark,則應位於此目錄下; 如果yarn使用發行版, 則應位於該目錄下。
  3. 將此jar添加到NodeManager集羣中所有的類路徑。
  4. yarn-site.xml每個節點上,將添加spark_shuffleyarn.nodemanager.aux-services,然後設置yarn.nodemanager.aux-services.spark_shuffle.class爲 org.apache.spark.network.yarn.YarnShuffleService
  5. NodeManager's通過設置YARN_HEAPSIZE(默認etc/hadoop/yarn-env.sh 爲1000)來增加堆大小,以避免在隨機播放期間出現垃圾回收問題。
  6. 重新啓動NodeManager集羣中的所有。

在YARN上運行隨機播放服務時,可以使用以下附加配置選項:

物業名稱

默認

含義

spark.yarn.shuffle.stopOnFailure

false

Spark Shuffle Service的初始化失敗時是否停止NodeManager。這樣可以防止由於未運行Spark Shuffle服務的NodeManager上運行容器而導致應用程序故障。

使用Apache Oozie啓動您的應用程序

Apache Oozie可以在工作流程中啓動Spark應用程序。在安全的羣集中,啓動的應用程序將需要相關令牌來訪問羣集的服務。如果使用密鑰表啓動Spark,則這是自動的。但是,如果要在沒有密鑰表的情況下啓動Spark,則必須將設置安全性的職責移交給Oozie。

在特定發行版文檔的“身份驗證”部分的Oozie網站上可以找到爲安全羣集配置Oozie以及獲取作業憑據的詳細信息。

對於Spark應用程序,必須爲Oozie設置Oozie工作流,以請求該應用程序需要的所有令牌,包括:

  • YARN資源管理器。
  • 本地Hadoop文件系統。
  • 任何用作I / O源或目標的遠程Hadoop文件系統。
  • 蜂巢-如果使用的話。
  • HBase-如果使用的話。
  • YARN時間軸服務器(如果應用程序與此交互)。

爲了避免Spark嘗試(然後失敗)獲取Hive,HBase和遠程HDFS令牌,必須將Spark配置設置爲禁用服務的令牌收集。

Spark配置必須包括以下幾行:

spark.security.credentials.hive.enabled   false

spark.security.credentials.hbase.enabled  false

spark.yarn.access.hadoopFileSystems必須取消配置選項。

使用Spark History Server替換Spark Web UI

禁用應用程序UI時,可以將Spark History Server應用程序頁面用作運行應用程序的跟蹤URL。在安全羣集上或減少Spark驅動程序的內存使用量可能是理想的。要通過Spark History Server設置跟蹤,請執行以下操作:

  • 在應用程序端,spark.yarn.historyServer.allowTracking=true在Spark的配置中進行設置。如果禁用了應用程序的UI,這將告訴Spark使用歷史服務器的URL作爲跟蹤URL。
  • 在Spark History Server上,添加org.apache.spark.deploy.yarn.YarnProxyRedirectFilter 到spark.ui.filters配置中的過濾器列表。

請注意,歷史記錄服務器信息可能不是與應用程序狀態有關的最新信息。

 

發佈了382 篇原創文章 · 獲贊 132 · 訪問量 66萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章