首先確定 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申請資源。
以下用cluster模式啟動一個spark應用:
例如:
以上例子中,啟動了一個yarn用戶端程式,使用預設的application master。而後sparkpi在application master中的子線程中運作。用戶端會周期性的把application master的狀态資訊拉取下來,并更新到控制台。用戶端會在你的應用程式結束後退出。參考“調試你的應用”,這一節說明了如何檢視驅動器和執行器的日志。
要以client模式啟動一個spark應用,隻需在上面的例子中把cluster換成client。下面這個例子就是以client模式啟動spark-shell:
在cluster模式下,驅動器不在用戶端機器上運作,是以sparkcontext.addjar添加用戶端本地檔案就不好使了。要使用戶端上本地檔案能夠用sparkcontext.addjar來添加,可以用–jars選項:
以下是yarn上專有的配置項。
在yarn術語集中,執行器和application master在容器(container)中運作。yarn在一個應用程式結束後,有兩種處理容器日志的模式。如果開啟了日志聚合(yarn.log-aggregation-enable),那麼容器日志将被複制到hdfs,并删除本地日志。而後這些日志可以在叢集任何節點上用yarn logs指令檢視:
以上指令,将會列印出指定應用的所有日志檔案的内容。你也可以直接在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的日志工具通路和檢視。
property name
default
meaning
<code>spark.yarn.am.memory</code>
<code>512m</code>
yarn application master在client模式下,
使用記憶體總量,與jvm記憶體設定格式相同(如:512m,2g)。
如果是cluster模式下,請設定 spark.driver.memory。
注意使用小寫的字尾,
如:k、m、g、t、p,分别代表 kibi-, mebi, gibi-, tebi- 以及pebibytes。
<code>spark.driver.cores</code>
<code>1</code>
yarn cluster模式下,驅動器使用的cpu core個數。
在cluster模式下,驅動器(driver)和yarn am(application master)使用相同的jvm,是以這個屬性也可以用來控制yarn am。
如果是client模式下,請使用spark.yarn.am.cores來控制yarn am的cpu core個數。
<code>spark.yarn.am.cores</code>
client模式下,用來控制yarn am的cpu core個數。
cluster模式下,請使用 spark.driver.cores。
<code>spark.yarn.am.waittime</code>
<code>100s</code>
在cluster模式下,該屬性表示yarn am等待sparkcontext初始化的時間。
在client模式下,該屬性表示yarn am等待驅動器連接配接的時間。
<code>spark.yarn.submit.file .replication</code>
預設的hdfs副本數(通常是3)
hdfs檔案副本數。包括spark jar,app jar以及其他分布式緩存檔案和存檔。
<code>spark.yarn.preserve .staging.files</code>
<code>false</code>
設為true以儲存stage相關檔案(stage相關的jar包和緩存)到作業結束,而不是立即删除。
<code>spark.yarn.scheduler .heartbeat.interval-ms</code>
<code>3000</code>
spark am發送給yarn資料總管心跳的間隔(ms)。
這個值最多不能超過yarn配置的逾時間隔的一半。(yarn.am.liveness-monitor.expiry-interval-ms)
<code>spark.yarn.scheduler .initial-allocation.interval</code>
<code>200ms</code>
spark am的初始帶外心跳間隔(有待定的資源申請時)。
其值不應該大于 spark.yarn.scheduler.heartbeat.interval-ms。
該資源配置設定間隔會在每次帶外心跳成功後但仍有待定資源申請時倍增,
直至達到 spark.yarn.scheduler.heartbeat.interval-ms 所設定的值。
<code>spark.yarn.max.executor .failures</code>
執行器個數*2且不小于3
spark應用最大容忍執行器失敗次數。
<code>spark.yarn.historyserver .address</code>
(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
<code>spark.yarn.dist.archives</code>
逗号分隔的文檔清單,其指向的文檔将被提取到每個執行器的工作目錄下。
<code>spark.yarn.dist.files</code>
逗号分隔的檔案清單,其指向的檔案将被複制到每個執行器的工作目錄下。
<code>spark.executor.instances</code>
<code>2</code>
執行器個數。注意,這個屬性和 spark.dynamicallocation.enabled是不相容的。
如果同時設定了 spark.dynamicallocation.enabled,那麼動态配置設定将被關閉,并使用 spark.executor.instances 所設定的值。
<code>spark.yarn.executor .memoryoverhead</code>
執行器記憶體 * 0.10或者 384mb中較大者
每個執行器所配置設定的堆外記憶體(mb)總量。這些記憶體将被用于存儲vm開銷、字元串常量,以及其他原生開銷等。這會使執行器所需記憶體增加(典型情況,增加6%~10%)
<code>spark.yarn.driver .memoryoverhead</code>
驅動器記憶體 * 0.10或者 384mb中較大者
每個驅動器所配置設定的堆外記憶體(mb)總量。
這些記憶體将被用于存儲vm開銷、字元串常量,以及其他原生開銷等。
這會使執行器所需記憶體增加(典型情況,增加6%~10%)
<code>spark.yarn.am .memoryoverhead</code>
application master
記憶體 * 0.10或者 384mb中較大者
與 spark.yarn.driver.memoryoverhead 相同,隻是僅用于yarn am client模式下。
<code>spark.yarn.am.port</code>
(random)
yarn am所監聽的端口。
在yarn client模式下,用于spark驅動器(driver)和yarn am通信。
而在yarn cluster模式下,這個端口将被用于動态執行器特性,這個特性會處理排程器背景殺死執行器的請求。
<code>spark.yarn.queue</code>
<code>default</code>
spark應用送出到哪個yarn隊列。
<code>spark.yarn.jar</code>
spark jar檔案位置,如果需要覆寫預設位置,請設定這個值。
預設的,spark on yarn會使用本地的spark jar包,但spark jar包同樣可以使用整個叢集可讀的hdfs檔案位置。
這使yarn可以在各節點上緩存spark jar包,而不需要每次運作一個應用的時候都要分發。
使用 hdfs:///some/path 來指定hdfs上jar封包件路徑。
<code>spark.yarn.access .namenodes</code>
逗号分隔的hdfs namenodes。
例如 spark.yarn.access.namenodes=hdfs://nn1.com:8032,hdfs://nn2.com:8032。
spark應用必須有這些機器的通路權限,并且需要配置好 kerberos(可以在同一個域或者信任的域)。
spark需要每個namenode的安全token,以便通路叢集中hdfs。
<code>spark.yarn.appmasterenv .[environmentvariablename]</code>
增加environmentvariablename所指定的環境變量到yarn am的程序中。
使用者可以指定多個環境變量。在cluster模式下,這個可以控制spark驅動器的環境變量;
而在client模式下,隻控制執行器啟動器的環境變量。
<code>spark.yarn .containerlaunchermaxthreads</code>
<code>25</code>
yarn am 啟動執行器的容器最多包含多少線程數。
<code>spark.yarn.am .extrajavaoptions</code>
在client模式下,傳給yarn am 的jvm參數。
在cluster模式下,請使用spark.driver.extrajavaoptions
<code>spark.yarn.am .extralibrarypath</code>
client模式下傳給yarn am 額外依賴庫。
<code>spark.yarn.maxappattempts</code>
<code>yarn .resourcemanager</code><code>.am.max-attempts</code> in yarn
送出應用最大嘗試次數。不應大于yarn全局配置的最大嘗試次數。
<code>spark.yarn.am .attemptfailuresvalidityinterval</code>
定義am失敗跟蹤校驗間隔。
am運作了至少要運作這麼多時間後,其失敗計數才被重置。
這個特性隻有配置其值後才會生效,且隻支援hadoop-2.6+
<code>spark.yarn.submit .waitappcompletion</code>
<code>true</code>
在yarn cluster模式下,控制是否用戶端等到spark應用結束後再退出。
如果設為true,用戶端程序将一直等待,并持續報告應用狀态。
否則,用戶端會在送出完成後退出。
<code>spark.yarn.am .nodelabelexpression</code>
一個yarn節點标簽表達式(node label expression),以此來限制am可以被排程到哪些節點上執行。
隻有hadoop 2.6+才能支援節點标簽表達式,是以如果用其他版本運作,這個屬性将被忽略。
<code>spark.yarn.executor .nodelabelexpression</code>
一個yarn節點标簽表達式(node label expression),以此來限制執行器可以被排程到哪些節點上啟動。
隻有hadoop 2.6+才能支援節點标簽表達式,是以如果在其他版本上運作時,這個屬性将被忽略。
<code>spark.yarn.tags</code>
逗号分隔的字元串,傳遞yarn應用tags。
其值将出現在yarn application reports中,可以用來過濾和查詢yarn 應用。
<code>spark.yarn.keytab</code>
認證檔案keytab的全路徑。
這個檔案将被複制到通路secure distributed cache的yarn 應用節點上,并且周期性的重新整理登陸的ticket和代理token(本地模式下也能work)
<code>spark.yarn.principal</code>
登陸kdc的認證,secure hdfs需要(local模式下也能用)
<code>spark.yarn.config .gatewaypath</code>
某些路徑,可能在網關主機上能正常通路(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,
這樣才能在遠端節點上以正确的環境變量啟動程序。
<code>spark.yarn.config .replacementpath</code>
見 spark.yarn.config.getewaypath
<code>spark.yarn.security .tokens.${service}.enabled</code>
在啟用安全設定的情況下,控制是否對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上的檔案。