在 YARN 上執行 Spark

支援在 YARN (Hadoop NextGen) 上執行已新增至 Spark 0.6.0 版,並在後續版本中進行改善。

安全性

預設情況下,並未啟用身分驗證等安全性功能。在部署開放給網際網路或不受信任網路的叢集時,保護叢集存取權非常重要,以防止未經授權的應用程式在叢集上執行。在執行 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 用戶端程式,該程式會啟動預設的應用程式主控端程序。然後,SparkPi 將作為應用程式主控端程序的子執行緒執行。用戶端會定期輪詢應用程式主控端程序以取得狀態更新,並在主控台中顯示這些更新。應用程式執行完畢後,用戶端將會結束。請參閱下方的 除錯應用程式 部分,了解如何查看驅動程式和執行器記錄。

要在 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 需要一個內建 Spark 的二進制發行版,並支援 YARN。二進制發行版可以從專案網站的下載頁面下載。您可以下載兩種版本的 Spark 二進制發行版。一種是使用特定版本的 Apache Hadoop 預先建置的;此 Spark 發行版包含內建 Hadoop 執行時期,因此我們稱之為with-hadoop Spark 發行版。另一種是使用使用者提供的 Hadoop 預先建置的;由於此 Spark 發行版不包含內建 Hadoop 執行時期,因此較小,但使用者必須另外提供 Hadoop 安裝。我們稱此變體為no-hadoop Spark 發行版。對於with-hadoop Spark 發行版,由於它已經包含內建 Hadoop 執行時期,因此預設情況下,當作業提交至 Hadoop Yarn 集群時,為了避免 jar 衝突,它不會將 Yarn 的類別路徑填入 Spark。若要覆寫此行為,您可以設定 spark.yarn.populateHadoopClasspath=true。對於no-hadoop Spark 發行版,Spark 會預設填入 Yarn 的類別路徑,以取得 Hadoop 執行時期。對於with-hadoop Spark 發行版,如果您的應用程式依賴於僅在叢集中可用的特定函式庫,您可以嘗試透過設定上述屬性來填入 Yarn 類別路徑。如果您這樣做會遇到 jar 衝突問題,您將需要關閉它並將此函式庫包含在您的應用程式 jar 中。

若要自行建置 Spark,請參閱建置 Spark

若要讓 YARN 端可以存取 Spark 執行時期 jar,您可以指定spark.yarn.archivespark.yarn.jars。有關詳細資訊,請參閱Spark 屬性。如果未指定spark.yarn.archivespark.yarn.jars,Spark 會建立一個 zip 檔案,其中包含$SPARK_HOME/jars下的所有 jar,並將其上傳至分散式快取。

設定

對於在 YARN 上的 Spark,大多數設定檔與其他部署模式相同。有關這些設定檔的更多資訊,請參閱設定檔頁面。以下是特定於在 YARN 上的 Spark 的設定檔。

偵錯您的應用程式

在 YARN 術語中,執行器和應用程式主控執行於「容器」內。YARN 有兩種模式用於在應用程式完成後處理容器記錄。如果啟用記錄聚合(使用 yarn.log-aggregation-enable 設定),容器記錄會複製到 HDFS 並在本地機器上刪除。這些記錄可以使用 yarn logs 指令從叢集中的任何位置檢視。

yarn logs -applicationId <app ID>

將列印出所有容器中所有記錄檔案的內容,這些容器來自指定的應用程式。您也可以使用 HDFS 外殼或 API 直接在 HDFS 中檢視容器記錄檔案。它們所在目錄的位置可以透過檢視您的 YARN 設定(yarn.nodemanager.remote-app-log-diryarn.nodemanager.remote-app-log-dir-suffix)找到。這些記錄也在 Spark 網頁 UI 的執行器標籤中提供。您需要同時執行 Spark 歷程記錄伺服器和 MapReduce 歷程記錄伺服器,並在 yarn-site.xml 中正確設定 yarn.log.server.url。Spark 歷程記錄伺服器 UI 上的記錄 URL 會將您重新導向至 MapReduce 歷程記錄伺服器,以顯示聚合記錄。

當記錄聚合未啟用時,記錄會保留在每個機器上的 YARN_APP_LOGS_DIR 下,通常設定為 /tmp/logs$HADOOP_HOME/logs/userlogs,視 Hadoop 版本和安裝而定。檢視容器的記錄需要前往包含這些記錄的主機,並在這個目錄中尋找。子目錄會依據應用程式 ID 和容器 ID 來整理記錄檔案。這些記錄也在 Spark 網頁 UI 的執行器標籤中提供,且不需要執行 MapReduce 歷程記錄伺服器。

若要檢閱每個容器的啟動環境,請將 yarn.nodemanager.delete.debug-delay-sec 增加為較大的值(例如 36000),然後透過容器啟動節點上的 yarn.nodemanager.local-dirs 存取應用程式快取。此目錄包含啟動指令碼、JAR 以及用於啟動每個容器的所有環境變數。此程序特別適用於除錯類別路徑問題。(請注意,啟用此功能需要叢集設定的管理員權限,並重新啟動所有節點管理員。因此,這不適用於已主機的叢集)。

若要對應用程式主控或執行器使用自訂的 log4j 組態,以下是選項

請注意,對於第一個選項,執行器和應用程式主控都會共用相同的 log4j 組態,當它們在同一個節點上執行時可能會造成問題(例如嘗試寫入同一個日誌檔案)。

如果您需要 YARN 中日誌檔案的適當位置參考,以便 YARN 能正確顯示並彙總它們,請在 log4j2.properties 中使用 spark.yarn.app.container.log.dir。例如,appender.file_appender.fileName=${sys: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 在用戶端模式下,YARN 應用程式主控程式要使用的記憶體量,格式與 JVM 記憶體字串相同(例如 512m2g)。在叢集模式下,請改用 spark.driver.memory

請使用小寫字尾,例如 kmgtp,分別代表 kibibyte、mebibyte、gibibyte、tebibyte 和 pebibyte。

1.3.0
spark.yarn.am.resource.{resource-type}.amount (無) 在用戶端模式下,YARN 應用程式主控程式要使用的資源量。在叢集模式下,請改用 spark.yarn.driver.resource.<resource-type>.amount。請注意,此功能只能與 YARN 3.0+ 搭配使用。有關參考,請參閱 YARN 資源模型文件:https://hadoop.dev.org.tw/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceModel.html

範例:若要從 YARN 要求 GPU 資源,請使用:spark.yarn.am.resource.yarn.io/gpu.amount

3.0.0
spark.yarn.applicationType SPARK 定義更具體的應用程式類型,例如 SPARKSPARK-SQLSPARK-STREAMINGSPARK-MLLIBSPARK-GRAPH。請小心不要超過 20 個字元。 3.1.0
spark.yarn.driver.resource.{resource-type}.amount (無) 在叢集模式下,YARN 應用程式主控程式要使用的資源量。請注意,此功能只能與 YARN 3.0+ 搭配使用。有關參考,請參閱 YARN 資源模型文件:https://hadoop.dev.org.tw/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceModel.html

範例:若要從 YARN 要求 GPU 資源,請使用:spark.yarn.driver.resource.yarn.io/gpu.amount

3.0.0
spark.yarn.executor.resource.{resource-type}.amount (無) 每個執行器程序要使用的資源量。請注意,此功能只能與 YARN 3.0 以上版本搭配使用。請參閱 YARN 資源模型文件以供參考:https://hadoop.dev.org.tw/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceModel.html

範例:若要從 YARN 要求 GPU 資源,請使用:spark.yarn.executor.resource.yarn.io/gpu.amount

3.0.0
spark.yarn.resourceGpuDeviceName yarn.io/gpu 指定 Spark 資源類型 gpu 對應到代表 GPU 的 YARN 資源。YARN 預設使用 yarn.io/gpu,但如果 YARN 已設定自訂資源類型,則允許重新對應。在使用 spark.{driver/executor}.resource.gpu.* 設定時套用。 3.2.1
spark.yarn.resourceFpgaDeviceName yarn.io/fpga 指定 Spark 資源類型 fpga 對應到代表 FPGA 的 YARN 資源。YARN 預設使用 yarn.io/fpga,但如果 YARN 已設定自訂資源類型,則允許重新對應。在使用 spark.{driver/executor}.resource.fpga.* 設定時套用。 3.2.1
spark.yarn.am.cores 1 在用戶端模式中,供 YARN 應用程式主控程式使用的核心數。在叢集模式中,請改用 spark.driver.cores 1.3.0
spark.yarn.am.waitTime 100 秒 僅在 叢集 模式中使用。YARN 應用程式主控程式等待 SparkContext 初始化的時間。 1.3.0
spark.yarn.submit.file.replication 預設 HDFS 副本數(通常為 3 應用程式上傳到 HDFS 的檔案的 HDFS 副本層級。這些檔案包括 Spark jar、應用程式 jar,以及任何分散式快取檔案/封存檔。 0.8.1
spark.yarn.stagingDir 檔案系統中目前使用者的家目錄 提交應用程式時使用的暫存目錄。 2.0.0
spark.yarn.preserve.staging.files false 設定為 true 以在工作結束時保留暫存檔案(Spark jar、應用程式 jar、分散式快取檔案),而不是刪除它們。 1.1.0
spark.yarn.scheduler.heartbeat.interval-ms 3000 Spark 應用程式主控程式傳送心跳訊號給 YARN 資源管理員的時間間隔(以毫秒為單位)。此值上限為 YARN 過期間隔設定值的一半,即 yarn.am.liveness-monitor.expiry-interval-ms 0.8.1
spark.yarn.scheduler.initial-allocation.interval 200 毫秒 當有未處理的容器配置要求時,Spark 應用程式主控程式熱切傳送心跳訊號給 YARN 資源管理員的初始間隔。它不應大於 spark.yarn.scheduler.heartbeat.interval-ms。如果仍有未處理的容器,配置間隔將在後續的熱切心跳訊號中加倍,直到達到 spark.yarn.scheduler.heartbeat.interval-ms 為止。 1.4.0
spark.yarn.historyServer.address (無) Spark 歷史記錄伺服器的位址,例如 host.com:18080。位址不應包含架構(http://)。由於歷史記錄伺服器是選用服務,因此預設為未設定。當 Spark 應用程式完成時,此位址會提供給 YARN 資源管理員,以將應用程式從資源管理員 UI 連結到 Spark 歷史記錄伺服器 UI。對於此屬性,YARN 屬性可以用作變數,而 Spark 會在執行階段替換這些變數。例如,如果 Spark 歷史記錄伺服器與 YARN 資源管理員執行在同一個節點上,則可以設定為 ${hadoopconf-yarn.resourcemanager.hostname}:18080 1.0.0
spark.yarn.dist.archives (無) 逗號分隔的檔案清單,將解壓縮到每個執行器的作業目錄中。 1.0.0
spark.yarn.dist.files (無) 逗號分隔的檔案清單,將放置在每個執行器的作業目錄中。 1.0.0
spark.yarn.dist.jars (無) 逗號分隔的 JAR 清單,將放置在每個執行器的作業目錄中。 2.0.0
spark.yarn.dist.forceDownloadSchemes (無) 逗號分隔的方案清單,資源將在加入 YARN 的分散式快取之前下載到本機磁碟。用於 YARN 服務不支援 Spark 支援的方案(例如 http、https 和 ftp)或需要在 YARN 本機用戶端類別路徑中的 JAR 的情況。萬用字元「*」表示下載所有方案的資源。 2.3.0
spark.executor.instances 2 靜態配置的執行器數量。使用 spark.dynamicAllocation.enabled 時,執行器的初始設定至少會這麼大。 1.0.0
spark.yarn.am.memoryOverhead AM 記憶體 * 0.10,最小值為 384 spark.driver.memoryOverhead 相同,但用於用戶端模式中的 YARN 應用程式主控程式。 1.3.0
spark.yarn.queue 預設 提交應用程式的 YARN 佇列名稱。 1.0.0
spark.yarn.jars (無) 包含要分發到 YARN 容器的 Spark 程式碼的函式庫清單。預設情況下,YARN 上的 Spark 會使用本機安裝的 Spark JAR,但 Spark JAR 也可以位於 HDFS 上的全球可讀取位置。這允許 YARN 將其快取在節點上,這樣每次執行應用程式時就不需要分發它。例如,要指向 HDFS 上的 JAR,請將此組態設定為 hdfs:///some/path。允許使用 Glob。 2.0.0
spark.yarn.archive (無) 包含要分發到 YARN 快取的必要 Spark JAR 的檔案。如果設定,此組態會取代 spark.yarn.jars,且檔案會用於所有應用程式的容器中。檔案應在其根目錄中包含 JAR 檔案。與前一個選項一樣,檔案也可以託管在 HDFS 上以加速檔案分發。 2.0.0
spark.yarn.appMasterEnv.[EnvironmentVariableName] (無) EnvironmentVariableName 指定的環境變數新增到在 YARN 上啟動的應用程式主控程式處理程序中。使用者可以指定多個這些變數,並設定多個環境變數。在 cluster 模式中,這會控制 Spark 驅動程式的環境,而在 client 模式中,它只會控制執行器啟動器的環境。 1.1.0
spark.yarn.containerLauncherMaxThreads 25 在 YARN 應用程式主控程式中用於啟動執行器容器的最大執行緒數。 1.2.0
spark.yarn.am.extraJavaOptions (無) 傳遞給用戶端模式中的 YARN 應用程式主控項的額外 JVM 選項字串。在叢集模式中,請改用 spark.driver.extraJavaOptions。請注意,使用此選項設定最大堆積大小 (-Xmx) 設定是非法的。最大堆積大小設定可以使用 spark.yarn.am.memory 設定 1.3.0
spark.yarn.am.extraLibraryPath (無) 在用戶端模式中啟動 YARN 應用程式主控項時設定要使用的特殊函式庫路徑。 1.4.0
spark.yarn.populateHadoopClasspath 對於 with-hadoop Spark 發行版,這設定為 false;對於 no-hadoop 發行版,這設定為 true。 是否從 yarn.application.classpathmapreduce.application.classpath 填入 Hadoop 類別路徑。請注意,如果這設定為 false,則需要一個捆綁 Hadoop 執行時期的 with-Hadoop Spark 發行版,或者使用者必須另外提供 Hadoop 安裝。 2.4.6
spark.yarn.maxAppAttempts YARN 中的 yarn.resourcemanager.am.max-attempts 提交應用程式時將進行的最大嘗試次數。它不應大於 YARN 設定中的最大嘗試次數。 1.3.0
spark.yarn.am.attemptFailuresValidityInterval (無) 定義 AM 失敗追蹤的有效期。如果 AM 至少執行定義的區間,則會重設 AM 失敗計數。如果未設定,則不會啟用此功能。 1.6.0
spark.yarn.am.clientModeTreatDisconnectAsFailed false 將 yarn-client 不乾淨的斷線視為失敗。在 yarn-client 模式中,應用程式通常會始終以 SUCCESS 的最終狀態完成,因為在某些情況下,無法知道應用程式是由使用者故意終止還是發生了真正的錯誤。此設定會變更該行為,如果應用程式主控項與驅動程式不乾淨地斷線(即沒有適當的關閉握手),則應用程式將以 FAILED 的最終狀態終止。這將允許呼叫者決定是否真的是失敗。請注意,如果設定此設定,而使用者只是不當終止用戶端應用程式,則可能會顯示 FAILED 狀態,即使它並非真正 FAILED。 3.3.0
spark.yarn.am.clientModeExitOnError false 在 yarn-client 模式中,當這為 true 時,如果驅動程式收到最終狀態為 KILLED 或 FAILED 的應用程式報告,驅動程式將停止對應的 SparkContext 並以代碼 1 退出程式。請注意,如果這為 true,並從另一個應用程式呼叫,它也會終止父應用程式。 3.3.0
spark.yarn.am.tokenConfRegex (無) 此設定的值是一個正規表示式,用於從作業設定檔(例如 hdfs-site.xml)中 grep 一個設定條目清單,並傳送給 RM,RM 在更新委派權杖時使用這些設定條目。此功能的典型使用案例是在 YARN 叢集需要與多個下游 HDFS 叢集對話的環境中支援委派權杖,其中 YARN RM 可能沒有設定(例如 dfs.nameservices、dfs.ha.namenodes.*、dfs.namenode.rpc-address.*)來連線到這些叢集。在此情況下,Spark 使用者可以指定設定值為 ^dfs.nameservices$|^dfs.namenode.rpc-address.*$|^dfs.ha.namenodes.*$,以從作業的本機設定檔中剖析這些 HDFS 設定。此設定與 mapreduce.job.send-token-conf 非常類似。有關更多詳細資訊,請查看 YARN-5910。 3.3.0
spark.yarn.submit.waitAppCompletion true 在 YARN 集群模式中,控制客戶端是否等到應用程式完成才退出。如果設為 true,客戶端程序將保持運作並報告應用程式的狀態。否則,客戶端程序將在提交後退出。 1.4.0
spark.yarn.am.nodeLabelExpression (無) 一個 YARN 節點標籤表達式,用於限制 AM 將排程到的節點集合。只有大於或等於 2.6 的 YARN 版本支援節點標籤表達式,因此在針對較早版本執行時,此屬性將會被忽略。 1.6.0
spark.yarn.executor.nodeLabelExpression (無) 一個 YARN 節點標籤表達式,用於限制執行器將排程到的節點集合。只有大於或等於 2.6 的 YARN 版本支援節點標籤表達式,因此在針對較早版本執行時,此屬性將會被忽略。 1.4.0
spark.yarn.tags (無) 以逗號分隔的字串清單,作為 YARN 應用程式標籤傳遞,出現在 YARN ApplicationReports 中,可用於在查詢 YARN 應用程式時進行篩選。 1.5.0
spark.yarn.priority (無) YARN 的應用程式優先順序,用於定義待處理應用程式的排序政策,具有較高整數值的應用程式有較高的機會被啟動。目前,YARN 僅在使用 FIFO 排序政策時支援應用程式優先順序。 3.0.0
spark.yarn.config.gatewayPath (無) 在閘道主機(啟動 Spark 應用程式的主機)上有效的路徑,但可能與叢集中其他節點中相同資源的路徑不同。搭配 spark.yarn.config.replacementPath,這用於支援具有異質配置的叢集,以便 Spark 可以正確啟動遠端程序。

替換路徑通常會包含 YARN 匯出的某些環境變數的參考(因此,Spark 容器可見)。

例如,如果閘道節點在 /disk1/hadoop 上安裝了 Hadoop 函式庫,並且 Hadoop 安裝的位置由 YARN 作為 HADOOP_HOME 環境變數匯出,則將此值設為 /disk1/hadoop,並將替換路徑設為 $HADOOP_HOME,將確保用於啟動遠端程序的路徑正確參考本地的 YARN 配置。

1.5.0
spark.yarn.config.replacementPath (無) 請參閱 spark.yarn.config.gatewayPath 1.5.0
spark.yarn.rolledLog.includePattern (無) Java Regex,用於篩選符合定義的包含模式的日誌檔,並且這些日誌檔將以滾動方式聚合。這將與 YARN 的滾動日誌聚合一起使用,要在 YARN 端啟用此功能,應在 yarn-site.xml 中配置 yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds。Spark log4j 附加程式需要變更為使用 FileAppender 或其他附加程式,以便在執行時處理被移除的檔案。根據在 log4j 配置中配置的檔案名稱(例如 spark.log),使用者應設定 regex (spark*) 以包含需要聚合的所有日誌檔。 2.0.0
spark.yarn.rolledLog.excludePattern (無) Java Regex,用於篩選符合定義的排除模式的日誌檔,並且這些日誌檔不會以滾動方式聚合。如果日誌檔名稱同時符合包含和排除模式,則最終將排除此檔案。 2.0.0
spark.yarn.executor.launch.excludeOnFailure.enabled false 啟用排除具有 YARN 資源配置問題的節點的旗標。排除的錯誤限制可透過 spark.excludeOnFailure.application.maxFailedExecutorsPerNode 進行設定。 2.4.0
spark.yarn.exclude.nodes (無) 排除在資源配置之外的 YARN 節點名稱的逗號分隔清單。 3.0.0
spark.yarn.metrics.namespace (無) AM 指標報告的根命名空間。如果未設定,則會使用 YARN 應用程式 ID。 2.4.0
spark.yarn.report.interval 1s 群集模式中目前 Spark 工作狀態報告之間的間隔。 0.9.0
spark.yarn.report.loggingFrequency 30 處理的應用程式報告的最大數量,直到記錄下一個應用程式狀態。如果狀態有變更,則會記錄應用程式狀態,而不論處理的應用程式報告數量為何。 3.5.0
spark.yarn.clientLaunchMonitorInterval 1s 啟動應用程式時,在客戶端模式 AM 狀態要求之間的間隔。 2.3.0
spark.yarn.includeDriverLogsLink false 在群集模式中,客戶端應用程式報告是否包含連結至驅動程式容器記錄檔。這需要輪詢 ResourceManager 的 REST API,因此會對 RM 造成一些額外的負載。 3.1.0
spark.yarn.unmanagedAM.enabled false 在客戶端模式中,是否使用 unmanaged am 作為客戶端的一部分來啟動應用程式主控服務。 3.0.0
spark.yarn.shuffle.server.recovery.disabled false 對於具有較高安全性需求且偏好於不將其機密儲存在資料庫中的應用程式,請設定為 true。此類應用程式的 shuffle 資料在外部 Shuffle 服務重新啟動後將不會復原。 3.5.0

SHS 自訂執行器記錄網址可用的模式

模式意義
{{HTTP_SCHEME}} 根據 YARN HTTP 政策為 http://https://。(透過 yarn.http.policy 設定)
{{NM_HOST}} 執行容器的節點「主機」。
{{NM_PORT}} 執行容器的節點管理員「埠」。
{{NM_HTTP_PORT}} 執行容器的節點管理員 http 伺服器的「埠」。
{{NM_HTTP_ADDRESS}} 配置容器的節點的 Http URI。
{{CLUSTER_ID}} 資源管理員的群集 ID。(透過 yarn.resourcemanager.cluster-id 設定)
{{CONTAINER_ID}} 容器的 ID。
{{USER}} 系統環境中的 SPARK_USER
{{FILE_NAME}} stdoutstderr

例如,假設您想要將記錄網址連結直接指向工作記錄伺服器,而不是讓節點管理員 http 伺服器重新導向它,您可以將 spark.history.custom.executor.log.url 設定如下

{{HTTP_SCHEME}}<JHS_HOST>:<JHS_PORT>/jobhistory/logs/{{NM_HOST}}:{{NM_PORT}}/{{CONTAINER_ID}}/{{CONTAINER_ID}}/{{USER}}/{{FILE_NAME}}?start=-4096

注意:您需要使用實際值取代 <JHS_HOST><JHS_PORT>

資源配置和設定概觀

請務必閱讀設定頁面上的自訂資源排程和設定概觀部分。本部分僅說明 YARN 特有的資源排程面向。

YARN 需要設定才能支援使用者想用於 Spark 的任何資源。YARN 3.1.0 新增了 YARN 的資源排程功能。請參閱 YARN 文件,深入了解如何設定資源並適當設定隔離。理想上,資源應設定為隔離,讓執行器只能看到已分配給它的資源。如果您未啟用隔離,使用者有責任建立探索腳本,確保執行器之間不會共用資源。

YARN 支援使用者定義的資源類型,但已內建 GPU (yarn.io/gpu) 和 FPGA (yarn.io/fpga) 類型。因此,如果您使用其中任何一種資源,Spark 可以將您對 Spark 資源的要求轉換成 YARN 資源,而您只需指定 spark.{driver/executor}.resource. 設定即可。請注意,如果您使用自訂資源類型來處理 YARN 的 GPU 或 FPGA,可以使用 spark.yarn.resourceGpuDeviceNamespark.yarn.resourceFpgaDeviceName 變更 Spark 對應。如果您使用 FPGA 或 GPU 以外的資源,使用者有責任同時為 YARN (spark.yarn.{driver/executor}.resource.) 和 Spark (spark.{driver/executor}.resource.) 指定設定。

例如,使用者想要為每個執行器要求 2 個 GPU。使用者只需指定 spark.executor.resource.gpu.amount=2,Spark 就會處理從 YARN 要求 yarn.io/gpu 資源類型。

如果使用者有使用者定義的 YARN 資源,我們稱之為 acceleratorX,則使用者必須指定 spark.yarn.executor.resource.acceleratorX.amount=2spark.executor.resource.acceleratorX.amount=2

YARN 沒有告訴 Spark 分配給每個容器的資源地址。因此,使用者必須指定一個探索腳本,讓執行器在啟動時執行,以探索該執行器可用的資源。您可以在 examples/src/main/scripts/getGpusResources.sh 中找到範例腳本。腳本必須設定執行權限,而使用者應設定權限,不允許惡意使用者修改腳本。腳本應以 ResourceInformation 類別的格式將 JSON 字串寫入 STDOUT。這包含資源名稱和僅提供給該執行器的資源地址陣列。

階段層級排程概觀

YARN 支援階段層級排程

One thing to note that is YARN specific is that each ResourceProfile requires a different container priority on YARN. The mapping is simply the ResourceProfile id becomes the priority, on YARN lower numbers are higher priority. This means that profiles created earlier will have a higher priority in YARN. Normally this won’t matter as Spark finishes one stage before starting another one, the only case this might have an affect is in a job server type scenario, so its something to keep in mind. Note there is a difference in the way custom resources are handled between the base default profile and custom ResourceProfiles. To allow for the user to request YARN containers with extra resources without Spark scheduling on them, the user can specify resources via the spark.yarn.executor.resource. config. Those configs are only used in the base default profile though and do not get propagated into any other custom ResourceProfiles. This is because there would be no way to remove them if you wanted a stage to not have them. This results in your default profile getting custom resources defined in spark.yarn.executor.resource. plus spark defined resources of GPU or FPGA. Spark converts GPU and FPGA resources into the YARN built in types yarn.io/gpu) and yarn.io/fpga, but does not know the mapping of any other resources. Any other Spark custom resources are not propagated to YARN for the default profile. So if you want Spark to schedule based off a custom resource and have it requested from YARN, you must specify it in both YARN (spark.yarn.{driver/executor}.resource.) and Spark (spark.{driver/executor}.resource.) configs. Leave the Spark config off if you only want YARN containers with the extra resources but Spark not to schedule using them. Now for custom ResourceProfiles, it doesn’t currently have a way to only specify YARN resources without Spark scheduling off of them. This means for custom ResourceProfiles we propagate all the resources defined in the ResourceProfile to YARN. We still convert GPU and FPGA to the YARN build in types as well. This requires that the name of any custom resources you specify match what they are defined as in YARN.

重要注意事項

Kerberos

Spark 中的標準 Kerberos 支援在 安全性 頁面中涵蓋。

在 YARN 模式中,除了 Hadoop 設定中的預設檔案系統之外,存取 Hadoop 檔案系統時,Spark 也會自動取得 Spark 應用程式暫存目錄所 hosting 的服務的委派權杖。

YARN 特定的 Kerberos 設定

屬性名稱預設值意義自版本
spark.kerberos.keytab (無) 包含上面指定的原則主體的 keytab 檔案的完整路徑。此 keytab 會透過 YARN 分散式快取複製到執行 YARN 應用程式主控項的節點,並會用於定期更新登入憑證和委派權杖。等同於 --keytab 命令列引數。
(也適用於「本機」主控項。)
3.0.0
spark.kerberos.principal (無) 在安全叢集上執行時,用於登入 KDC 的主體。等同於 --principal 命令列引數。
(也適用於「本機」主控項。)
3.0.0
spark.yarn.kerberos.relogin.period 1m 檢查是否應更新 kerberos TGT 的頻率。應將此設定為小於 TGT 更新週期(或在未啟用 TGT 更新時為 TGT 使用壽命)的值。預設值應足以應付大多數的部署。 2.3.0
spark.yarn.kerberos.renewal.excludeHadoopFileSystems (無) 逗號分隔的 Hadoop 檔案系統清單,其主機將從資源排程器的委派權杖更新中排除。例如,spark.yarn.kerberos.renewal.excludeHadoopFileSystems=hdfs://nn1.com:8032, hdfs://nn2.com:8032。目前已知這在 YARN 中有效,因此 YARN 資源管理員不會為應用程式更新權杖。請注意,由於資源排程器不會更新權杖,因此任何執行時間長於原始權杖到期時間且嘗試使用該權杖的應用程式都可能會失敗。 3.2.0

Kerberos 疑難排解

除錯 Hadoop/Kerberos 問題可能「很困難」。一個有用的技巧是透過設定 HADOOP_JAAS_DEBUG 環境變數來啟用 Hadoop 中 Kerberos 作業的額外記錄。

export HADOOP_JAAS_DEBUG=true

JDK 類別可透過系統屬性 sun.security.krb5.debugsun.security.spnego.debug=true 來設定,以啟用其 Kerberos 和 SPNEGO/REST 驗證的額外記錄。

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

所有這些選項都可以在應用程式主控程式中啟用

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,記錄將包含取得的所有權杖清單,以及其到期詳細資料

設定外部 Shuffle 服務

若要在 YARN 叢集中的每個 NodeManager 上啟動 Spark Shuffle 服務,請遵循下列說明

  1. 使用 YARN 設定檔 建置 Spark。如果您使用預先封裝的發行版,請略過此步驟。
  2. 找到 spark-<version>-yarn-shuffle.jar。如果您自行建置 Spark,這應位於 $SPARK_HOME/common/network-yarn/target/scala-<version> 中;如果您使用發行版,則位於 yarn 中。
  3. 將此 jar 檔案新增到叢集中所有 NodeManager 的類別路徑中。
  4. 在每個節點的 yarn-site.xml 中,將 spark_shuffle 新增到 yarn.nodemanager.aux-services,然後將 yarn.nodemanager.aux-services.spark_shuffle.class 設定為 org.apache.spark.network.yarn.YarnShuffleService
  5. 透過在 etc/hadoop/yarn-env.sh 中設定 YARN_HEAPSIZE(預設為 1000)來增加 NodeManager 的堆積大小,以避免在洗牌期間發生垃圾回收問題。
  6. 重新啟動叢集中的所有 NodeManager

當洗牌服務在 YARN 上執行時,有以下額外的組態選項可用

屬性名稱預設值意義自版本
spark.yarn.shuffle.stopOnFailure false 當 Spark 洗牌服務初始化失敗時,是否停止 NodeManager。這可防止因在 Spark 洗牌服務未執行的 NodeManager 上執行容器而導致的應用程式失敗。 2.1.0
spark.yarn.shuffle.service.metrics.namespace sparkShuffleService 在將洗牌服務指標發送到 NodeManager 的 Hadoop metrics2 系統時要使用的名稱空間。 3.2.0
spark.yarn.shuffle.service.logs.namespace (未設定) 在形成用於發送 YARN 洗牌服務日誌的記錄器名稱時,會將名稱空間附加到類別名稱,例如 org.apache.spark.network.yarn.YarnShuffleService.logsNamespaceValue。由於某些記錄框架可能會預期記錄器名稱看起來像類別名稱,因此通常建議提供一個有效 Java 套件或類別名稱且不包含空格的值。 3.3.0
spark.shuffle.service.db.backend LEVELDB 當在 YARN 中啟用保留工作的重新啟動時,這用於指定洗牌服務狀態儲存中使用的磁碟基礎儲存,支援 `LEVELDB` 和 `ROCKSDB`,預設值為 `LEVELDB`。`LevelDB/RocksDB` 中的原始資料儲存現在不會自動轉換為另一種儲存。切換儲存類型時,原始資料儲存將被保留,新的類型資料儲存將會建立。 3.4.0

請注意,以上說明假設已使用預設洗牌服務名稱 spark_shuffle。可以在這裡使用任何名稱,但 YARN NodeManager 組態中使用的值必須與 Spark 應用程式中 spark.shuffle.service.name 的值相符。

洗牌服務預設會從 NodeManager 使用的 Hadoop 組態(例如 yarn-site.xml)取得所有組態。但是,也可以使用名為 spark-shuffle-site.xml 的檔案獨立組態洗牌服務,該檔案應放置在洗牌服務的類別路徑中(預設情況下,與 NodeManager 的類別路徑共用)。洗牌服務會將此視為標準 Hadoop 組態資源,並將其覆蓋在 NodeManager 的組態之上。

使用 Apache Oozie 啟動應用程式

Apache Oozie 可以啟動 Spark 應用程式作為工作流程的一部分。在安全叢集中,啟動的應用程式將需要相關的權杖才能存取叢集的服務。如果 Spark 是使用 keytab 啟動的,這將是自動的。然而,如果 Spark 要在沒有 keytab 的情況下啟動,則設定安全性的責任必須交給 Oozie。

可以在 Oozie 網站 的特定版本文件中的「驗證」區段中找到有關為安全叢集設定 Oozie 和取得工作憑證的詳細資訊。

對於 Spark 應用程式,必須設定 Oozie 工作流程,讓 Oozie 要求應用程式所需的所有權杖,包括

為避免 Spark 嘗試 —然後失敗— 取得 Hive、HBase 和遠端 HDFS 權杖,必須將 Spark 設定設定為停用服務的權杖收集。

Spark 設定必須包含以下列

spark.security.credentials.hive.enabled   false
spark.security.credentials.hbase.enabled  false

設定選項 spark.kerberos.access.hadoopFileSystems 必須取消設定。

使用 Spark 歷史記錄伺服器取代 Spark 網頁使用者介面

當應用程式 UI 已停用時,可以使用 Spark 歷程記錄伺服器應用程式頁面作為正在執行的應用程式的追蹤網址。這在安全叢集中可能是必要的,或用於減少 Spark 驅動程式的記憶體使用量。若要透過 Spark 歷程記錄伺服器設定追蹤,請執行下列操作

請注意,歷程記錄伺服器資訊可能不會與應用程式的狀態同步。

執行多個版本的 Spark Shuffle 服務

請注意,此區段僅適用於執行 YARN 版本 >= 2.9.0 時。

在某些情況下,執行多個使用不同 Spark 版本的 Spark Shuffle 服務可能是必要的。這可能很有幫助,例如,在執行 YARN 集群時,其中包含使用多個 Spark 版本的應用程式的混合工作負載,因為某個版本的 shuffle 服務並不總是與其他版本的 Spark 相容。自 2.9.0 以來的 YARN 版本支援在孤立的類別載入器中執行 shuffle 服務(請參閱 YARN-4577),這表示多個 Spark 版本可以在單一 NodeManager 中共存。yarn.nodemanager.aux-services.<service-name>.classpath 和自 YARN 2.10.2/3.1.1/3.2.0 開始的 yarn.nodemanager.aux-services.<service-name>.remote-classpath 選項可用於設定這個。請注意,YARN 3.3.0/3.3.1 有個問題,需要設定 yarn.nodemanager.aux-services.<service-name>.system-classes 作為解決方法。請參閱 YARN-11053 以取得詳細資訊。除了設定個別的類別路徑之外,還必須確保兩個版本宣告不同的埠。這可以使用上面所述的 spark-shuffle-site.xml 檔案來達成。例如,您可能有類似這樣的設定

  yarn.nodemanager.aux-services = spark_shuffle_x,spark_shuffle_y
  yarn.nodemanager.aux-services.spark_shuffle_x.classpath = /path/to/spark-x-path/fat.jar:/path/to/spark-x-config
  yarn.nodemanager.aux-services.spark_shuffle_y.classpath = /path/to/spark-y-path/fat.jar:/path/to/spark-y-config

  yarn.nodemanager.aux-services = spark_shuffle_x,spark_shuffle_y
  yarn.nodemanager.aux-services.spark_shuffle_x.classpath = /path/to/spark-x-path/*:/path/to/spark-x-config
  yarn.nodemanager.aux-services.spark_shuffle_y.classpath = /path/to/spark-y-path/*:/path/to/spark-y-config

兩個 spark-*-config 目錄各包含一個檔案,spark-shuffle-site.xml。這些是 XML 檔案,採用 Hadoop 設定格式,每個都包含一些設定,用於調整埠號和使用的指標名稱字首

<configuration>
  <property>
    <name>spark.shuffle.service.port</name>
    <value>7001</value>
  </property>
  <property>
    <name>spark.yarn.shuffle.service.metrics.namespace</name>
    <value>sparkShuffleServiceX</value>
  </property>
</configuration>

這兩個不同服務的值都應該不同。

然後,在 Spark 應用程式的設定中,應該設定一個

  spark.shuffle.service.name = spark_shuffle_x
  spark.shuffle.service.port = 7001

並設定一個

  spark.shuffle.service.name = spark_shuffle_y
  spark.shuffle.service.port = <other value>