翻譯: https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_ig_running_spark_on_yarn.html
版本: 5.14.2
在YARN上運行Spark應(yīng)用程序
當(dāng)Spark應(yīng)用程序在YARN集群管理器上運行時,資源管理,調(diào)度和安全性由YARN控制。
繼續(xù)閱讀:
- 部署模式
- 配置環(huán)境
- 在YARN上運行Spark Shell應(yīng)用程序
- 將Spark應(yīng)用程序提交給YARN
- 監(jiān)視和調(diào)試Spark應(yīng)用程序
- 例如:在YARN上運行SparkPi
- 在YARN應(yīng)用程序上配置Spark
- 動態(tài)分配
- 優(yōu)化CDH部署中的YARN模式
部署模式
在YARN中芙贫,每個應(yīng)用程序?qū)嵗加幸粋€ApplicationMaster進(jìn)程费坊,該進(jìn)程是為該應(yīng)用程序啟動的第一個容器麸粮。應(yīng)用程序負(fù)責(zé)從ResourceManager請求資源。一旦分配了資源澈驼,應(yīng)用程序?qū)⒅甘綨odeManagers代表它啟動容器走搁。ApplicationMasters消除了對活動客戶端的需求:客戶端上啟動應(yīng)用程序的進(jìn)程可以終止独柑,YARN進(jìn)行協(xié)作管理的進(jìn)程繼續(xù)進(jìn)行迈窟。
有關(guān)指定部署模式的選項私植,請參閱spark-submit選項。
群集部署模式
在集群模式下车酣,Spark驅(qū)動程序在集群主機(jī)上的ApplicationMaster中運行曲稼。YARN容器中的單個進(jìn)程負(fù)責(zé)驅(qū)動應(yīng)用程序并向YARN請求資源。啟動應(yīng)用程序的客戶端不需要在應(yīng)用程序的生命周期中運行湖员。
集群模式不太適合交互式使用Spark贫悄。需要用戶輸入的Spark應(yīng)用程序,例如 spark-shell and pyspark娘摔,需要Spark驅(qū)動程序在啟動Spark應(yīng)用程序的客戶端進(jìn)程中運行窄坦。
客戶端部署模式
在客戶端模式下,Spark驅(qū)動程序在提交作業(yè)的主機(jī)上運行。ApplicationMaster僅負(fù)責(zé)從YARN請求執(zhí)行程序容器鸭津。容器啟動后彤侍,客戶端與容器通信以安排工作。
Deployment Mode Summary
Mode | YARN客戶端模式 | YARN集群模式 |
---|---|---|
Driver runs in | 客戶 | ApplicationMaster |
Requests resources | ApplicationMaster | ApplicationMaster |
Starts executor processes | YARN NodeManager | YARN NodeManager |
Persistent services | YARN ResourceManager和NodeManagers | YARN ResourceManager和NodeManagers |
Supports Spark Shell | YES | No |
配置環(huán)境
Spark要求客戶端配置文件包含 HADOOP_CONF_DIR or YARN_CONF_DIR 環(huán)境變量逆趋,指向集群目錄盏阶。這些配置用于寫入HDFS并連接到Y(jié)ARN ResourceManager。如果您使用Cloudera Manager部署闻书,則會自動配置這些變量名斟。如果您使用的是非托管部署,請確保按照在YARN上運行Spark中所述設(shè)置變量魄眉。
在YARN上運行Spark Shell應(yīng)用程序
在YARN上使用運行spark-shell or pyspark 砰盐,使用 --master yarn --deploy-mode client 啟動應(yīng)用程序。
如果您正在使用Cloudera Manager部署坑律,則會自動配置這些屬性楞卡。
將Spark應(yīng)用程序提交給YARN
要向YARN提交應(yīng)用,請使用spark-submit脾歇,指定--master yarn 選項蒋腮,請參閱spark-submit參數(shù)。
監(jiān)視和調(diào)試Spark應(yīng)用程序
要獲取有關(guān)Spark應(yīng)用程序行為的信息藕各,可以參考YARN日志和Spark Web應(yīng)用程序UI池摧。這兩種方法提供補(bǔ)充信息。有關(guān)如何查看由Spark應(yīng)用程序和Spark Web應(yīng)用程序UI創(chuàng)建的日志的信息激况,請參閱監(jiān)控Spark應(yīng)用程序作彤。
例如:在YARN上運行SparkPi
這些例子演示了如何使用 spark-submit 用各種選項提交SparkPi Spark示例應(yīng)用程序。在這些例子中乌逐,在JAR控制了逼近應(yīng)該與pi接近多少之后通過的參數(shù)竭讳。
在CDH部署中,SPARK_HOME 默認(rèn)為/usr/lib/spark 在包裝安裝和 </opt/cloudera/parcels/CDH/lib/spark在包裹安裝中浙踢。在Cloudera Manager部署中绢慢,shell也可從 /usr/bin。
在YARN集群模式下運行SparkPi
在集群模式下運行SparkPi:
- CDH 5.2和更低
spark-submit --class org.apache.spark.examples.SparkPi --master yarn \
--deploy-mode cluster SPARK_HOME/examples/lib/spark-examples.jar 10
- CDH 5.3和更高
spark-submit --class org.apache.spark.examples.SparkPi --master yarn \
--deploy-mode cluster SPARK_HOME/lib/spark-examples.jar 10
該命令會打印狀態(tài)洛波,直到作業(yè)完成或您按下control-C胰舆。終止spark-submit 集群模式下的進(jìn)程不會像在客戶端模式下那樣終止Spark應(yīng)用程序。要監(jiān)視正在運行的應(yīng)用程序的狀態(tài)蹬挤,請運行yarn application -list.
在YARN客戶端模式下運行SparkPi
在客戶端模式下run SparkPi:
- CDH 5.2和更低
spark-submit --class org.apache.spark.examples.SparkPi --master yarn \
--deploy-mode client SPARK_HOME/examples/lib/spark-examples.jar 10
- CDH 5.3和更高
spark-submit --class org.apache.spark.examples.SparkPi --master yarn \
--deploy-mode client SPARK_HOME/lib/spark-examples.jar 10
在YARN集群模式下運行Python SparkPi
- 解壓縮Python示例存檔:
sudo su gunzip SPARK_HOME/lib/python.tar.gz
sudo su tar xvf SPARK_HOME/lib/python.tar
- run pi.py 文件:
spark-submit --master yarn --deploy-mode cluster SPARK_HOME/lib/pi.py 10
在YARN應(yīng)用程序上配置Spark
除了spark-submit選項之外缚窿,在YARN上運行spark-submit的其他選項。
spark-submit on YARN Options
選項 | 描述 |
---|---|
archives | 逗號分隔的archives列表焰扳,被提取到每個執(zhí)行者的工作目錄中倦零。對于 客戶端部署模式误续,路徑必須指向本地文件。對于集群部署模式扫茅,路徑可以是本地文件女嘲,也可以是集群內(nèi)全局可見的URL; 請參閱高級依賴關(guān)系管理。 |
executor-cores | 每個執(zhí)行器上分配的處理器內(nèi)核數(shù)量诞帐⌒滥幔或者,您可以使用 spark.executor.cores 屬性停蕉。 |
executor-memory | 分配給每個執(zhí)行程序的最大堆大小愕鼓。或者慧起,您可以使用spark.executor.memory 屬性菇晃。 |
num-executors | 為此應(yīng)用程序分配的YARN容器總數(shù)◎炯罚或者磺送,您可以使用spark.executor.instances 屬性。 |
queue | 提交作業(yè)的YARN隊列灿意。有關(guān)更多信息估灿,請參閱將應(yīng)用程序和查詢分配給資源池。默認(rèn): default缤剧。 |
在初始安裝期間馅袁,Cloudera Manager根據(jù)您的群集環(huán)境調(diào)整屬性。
除了命令行選項外荒辕,還提供以下屬性:
屬性 | 描述 |
---|---|
spark.yarn.driver.memoryOverhead | 每個驅(qū)動程序可以從YARN請求的額外off-heap 存儲量汗销。結(jié)合spark.driver.memory,這是YARN可用于為驅(qū)動程序進(jìn)程創(chuàng)建JVM的總內(nèi)存抵窒。 |
spark.yarn.executor.memoryOverhead | 每個執(zhí)行程序進(jìn)程可從YARN請求的額外堆外存量弛针。結(jié)合spark.executor.memory,這是YARN可用于為執(zhí)行程序進(jìn)程創(chuàng)建JVM的總內(nèi)存李皇。 |
動態(tài)分配
動態(tài)分配允許Spark根據(jù)工作負(fù)載動態(tài)擴(kuò)展分配給應(yīng)用程序的集群資源削茁。當(dāng)啟用動態(tài)分配并且Spark應(yīng)用程序有待處理任務(wù)的積壓時,它可以請求執(zhí)行程序疙赠。當(dāng)應(yīng)用程序空閑時付材,其執(zhí)行程序?qū)⒈会尫挪⒖杀黄渌麘?yīng)用程序獲取朦拖。
從CDH 5.5開始圃阳,默認(rèn)啟用動態(tài)分配。動態(tài)分配屬性描述了控制動態(tài)分配的屬性璧帝。
如果你設(shè)置spark.dynamicAllocation.enabled 為false 或使用 --num-executors 命令行參數(shù)或設(shè)置 spark.executor.instances 時捍岳,動態(tài)分配被禁用。有關(guān)動態(tài)分配如何工作的更多信息,請參閱資源分配策略锣夹。
當(dāng)啟用Spark動態(tài)資源分配時页徐,所有資源都會分配給第一個可用的作業(yè),導(dǎo)致后續(xù)應(yīng)用程序排隊银萍。為了允許應(yīng)用程序并行獲取資源变勇,將資源分配給池,在池中運行應(yīng)用程序贴唇,并允許池中運行的應(yīng)用程序被搶占搀绣。請參閱動態(tài)資源池。
如果您正在使用Spark Streaming戳气,請參閱Spark Streaming和Dynamic Allocation中的建議链患。
動態(tài)分配屬性
優(yōu)化非 CM 部署CDH中的YARN模式
在不由Cloudera Manager管理的CDH部署中,Spark每次(spark-submit)運行時都會將Spark程序集JAR文件復(fù)制到HDFS 瓶您。您可以通過執(zhí)行以下任一操作來避免此復(fù)制:
- 設(shè)置 spark.yarn.jar 為 JAR的本地路徑:local:/usr/lib/spark/lib/spark-assembly.jar. 麻捻。
- 上傳JAR并配置JAR位置:
- 手動將Spark程序集JAR文件上傳到HDFS:
$ hdfs dfs -mkdir -p /user/spark/share/lib
$ hdfs dfs -put SPARK_HOME/assembly/lib/spark-assembly_*.jar /user/spark/share/lib/spark-assembly.jar
每次將Spark升級到新的 CDH版本時,您都必須手動上載JAR呀袱。
2. 設(shè)置spark.yarn.jar 為 HDFS路徑:
spark.yarn.jar=hdfs://namenode:8020/user/spark/share/lib/spark-assembly.jar