# 在YARN上運行Spark
### 配置
大部分為`Spark on YARN`模式提供的配置與其它部署模式提供的配置相同。下面這些是為`Spark on YARN`模式提供的配置。
### Spark屬性
| Property Name | Default | Meaning |
|-----|-----|-----|
| spark.yarn.applicationMaster.waitTries | 10 | ApplicationMaster等待Spark master的次數以及SparkContext初始化嘗試的次數 |
| spark.yarn.submit.file.replication | HDFS默認的復制次數(3) | 上傳到HDFS的文件的HDFS復制水平。這些文件包括Spark jar、app jar以及任何分布式緩存文件/檔案 |
| spark.yarn.preserve.staging.files | false | 設置為true,則在作業結束時保留階段性文件(Spark jar、app jar以及任何分布式緩存文件)而不是刪除它們 |
| spark.yarn.scheduler.heartbeat.interval-ms | 5000 | Spark application master給YARN ResourceManager發送心跳的時間間隔(ms) |
| spark.yarn.max.executor.failures | numExecutors * 2,最小為3 | 失敗應用程序之前最大的執行失敗數 |
| spark.yarn.historyServer.address | (none) | Spark歷史服務器(如host.com:18080)的地址。這個地址不應該包含一個模式([http://)。默認情況下沒有設置值,這是因為該選項是一個可選選項。當Spark應用程序完成從ResourceManager](http://)。默認情況下沒有設置值,這是因為該選項是一個可選選項。當Spark應用程序完成從ResourceManager) UI到Spark歷史服務器UI的連接時,這個地址從YARN ResourceManager得到 |
| spark.yarn.dist.archives | (none) | 提取逗號分隔的檔案列表到每個執行器的工作目錄 |
| spark.yarn.dist.files | (none) | 放置逗號分隔的文件列表到每個執行器的工作目錄 |
| spark.yarn.executor.memoryOverhead | executorMemory * 0.07,最小384 | 分配給每個執行器的堆內存大小(以MB為單位)。它是VM開銷、interned字符串或者其它本地開銷占用的內存。這往往隨著執行器大小而增長。(典型情況下是6%-10%) |
| spark.yarn.driver.memoryOverhead | driverMemory * 0.07,最小384 | 分配給每個driver的堆內存大小(以MB為單位)。它是VM開銷、interned字符串或者其它本地開銷占用的內存。這往往隨著執行器大小而增長。(典型情況下是6%-10%) |
| spark.yarn.queue | default | 應用程序被提交到的YARN隊列的名稱 |
| spark.yarn.jar | (none) | Spark jar文件的位置,覆蓋默認的位置。默認情況下,Spark on YARN將會用到本地安裝的Spark jar。但是Spark jar也可以HDFS中的一個公共位置。這允許YARN緩存它到節點上,而不用在每次運行應用程序時都需要分配。指向HDFS中的jar包,可以這個參數為"hdfs:///some/path" |
| spark.yarn.access.namenodes | (none) | 你的Spark應用程序訪問的HDFS namenode列表。例如,`spark.yarn.access.namenodes=hdfs://nn1.com:8032,hdfs://nn2.com:8032`,Spark應用程序必須訪問namenode列表,Kerberos必須正確配置來訪問它們。Spark獲得namenode的安全令牌,這樣Spark應用程序就能夠訪問這些遠程的HDFS集群。 |
| spark.yarn.containerLauncherMaxThreads | 25 | 為了啟動執行者容器,應用程序master用到的最大線程數 |
| spark.yarn.appMasterEnv.[EnvironmentVariableName] | (none) | 添加通過`EnvironmentVariableName`指定的環境變量到Application Master處理YARN上的啟動。用戶可以指定多個該設置,從而設置多個環境變量。在yarn-cluster模式下,這控制Spark driver的環境。在yarn-client模式下,這僅僅控制執行器啟動者的環境。 |
### 在YARN上啟動Spark
確保`HADOOP_CONF_DIR`或`YARN_CONF_DIR`指向的目錄包含Hadoop集群的(客戶端)配置文件。這些配置用于寫數據到dfs和連接到YARN ResourceManager。
有兩種部署模式可以用來在YARN上啟動Spark應用程序。在yarn-cluster模式下,Spark driver運行在application master進程中,這個進程被集群中的YARN所管理,客戶端會在初始化應用程序之后關閉。在yarn-client模式下,driver運行在客戶端進程中,application master僅僅用來向YARN請求資源。
和Spark單獨模式以及Mesos模式不同,在這些模式中,master的地址由"master"參數指定,而在YARN模式下,ResourceManager的地址從Hadoop配置得到。因此master參數是簡單的`yarn-client`和`yarn-cluster`。
在yarn-cluster模式下啟動Spark應用程序。
~~~
./bin/spark-submit --class path.to.your.Class --master yarn-cluster [options] <app jar> [app options]
~~~
例子:
~~~
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--num-executors 3 \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
lib/spark-examples*.jar \
10
~~~
以上啟動了一個YARN客戶端程序用來啟動默認的 Application Master,然后SparkPi會作為Application Master的子線程運行。客戶端會定期的輪詢Application Master用于狀態更新并將更新顯示在控制臺上。一旦你的應用程序運行完畢,客戶端就會退出。
在yarn-client模式下啟動Spark應用程序,運行下面的shell腳本
~~~
$ ./bin/spark-shell --master yarn-client
~~~
### 添加其它的jar
在yarn-cluster模式下,driver運行在不同的機器上,所以離開了保存在本地客戶端的文件,`SparkContext.addJar`將不會工作。為了使`SparkContext.addJar`用到保存在客戶端的文件,在啟動命令中加上`--jars`選項。
~~~
$ ./bin/spark-submit --class my.main.Class \
--master yarn-cluster \
--jars my-other-jar.jar,my-other-other-jar.jar
my-main-jar.jar
app_arg1 app_arg2
~~~
### 注意事項
- 在Hadoop 2.2之前,YARN不支持容器核的資源請求。因此,當運行早期的版本時,通過命令行參數指定的核的數量無法傳遞給YARN。在調度決策中,核請求是否兌現取決于用哪個調度器以及如何配置調度器。
- Spark executors使用的本地目錄將會是YARN配置(yarn.nodemanager.local-dirs)的本地目錄。如果用戶指定了`spark.local.dir`,它將被忽略。
- `--files`和`--archives`選項支持指定帶 * # * 號文件名。例如,你能夠指定`--files localtest.txt#appSees.txt`,它上傳你在本地命名為`localtest.txt`的文件到HDFS,但是將會鏈接為名稱`appSees.txt`。當你的應用程序運行在YARN上時,你應該使用`appSees.txt`去引用該文件。
- 如果你在yarn-cluster模式下運行`SparkContext.addJar`,并且用到了本地文件, `--jars`選項允許`SparkContext.addJar`函數能夠工作。如果你正在使用 HDFS, HTTP, HTTPS或FTP,你不需要用到該選項
- Introduction
- 快速上手
- Spark Shell
- 獨立應用程序
- 開始翻滾吧!
- 編程指南
- 引入 Spark
- 初始化 Spark
- Spark RDDs
- 并行集合
- 外部數據集
- RDD 操作
- RDD持久化
- 共享變量
- 從這里開始
- Spark Streaming
- 一個快速的例子
- 基本概念
- 關聯
- 初始化StreamingContext
- 離散流
- 輸入DStreams
- DStream中的轉換
- DStream的輸出操作
- 緩存或持久化
- Checkpointing
- 部署應用程序
- 監控應用程序
- 性能調優
- 減少批數據的執行時間
- 設置正確的批容量
- 內存調優
- 容錯語義
- Spark SQL
- 開始
- 數據源
- RDDs
- parquet文件
- JSON數據集
- Hive表
- 性能調優
- 其它SQL接口
- 編寫語言集成(Language-Integrated)的相關查詢
- Spark SQL數據類型
- GraphX編程指南
- 開始
- 屬性圖
- 圖操作符
- Pregel API
- 圖構造者
- 頂點和邊RDDs
- 圖算法
- 例子
- 提交應用程序
- 獨立運行Spark
- 在yarn上運行Spark
- Spark配置