(一)什么是SparkONYarn模式
Spark on YARN(Yet Another Resource Negotiator)是 Spark 框架在 Hadoop 集群中運行的一種部署模式,它借助 Hadoop YARN 來管理資源和調度任務。
架構組成
ResourceManager:作為 YARN 的核心,負責整個集群的資源管理和調度。它會接收來自各個應用程序的資源請求,并根據集群資源的使用情況進行合理分配。
NodeManager:部署在集群中的每個節點上,負責管理該節點上的資源使用情況,監控容器的運行狀態,并且與 ResourceManager 保持通信,匯報節點的資源使用信息。
ApplicationMaster:在 Spark 應用啟動時,YARN 會為其分配一個 ApplicationMaster。它的主要職責是向 ResourceManager 申請資源,并且與 NodeManager 協作,啟動和管理 Spark 的 Executor 進程。
Spark Driver:負責執行用戶編寫的 Spark 應用程序代碼,將其轉化為一系列的任務,并調度這些任務到各個 Executor 上執行。
Executor:運行在 NodeManager 管理的容器中,負責具體執行 Spark 任務,并將執行結果返回給 Driver。
(二)運行流程
提交應用:用戶通過命令行或者其他方式向 YARN 提交 Spark 應用程序。
啟動 ApplicationMaster:ResourceManager 接收到應用程序的請求后,會在集群中的某個節點上啟動一個 ApplicationMaster 進程。
申請資源:ApplicationMaster 向 ResourceManager 注冊,并根據應用程序的需求申請資源。
啟動 Executor:ResourceManager 根據資源分配情況,通知相應的 NodeManager 啟動 Executor 進程。
任務執行:Spark Driver 將任務分發給各個 Executor 執行,Executor 執行完任務后將結果返回給 Driver。
應用結束:當所有任務執行完畢后,ApplicationMaster 向 ResourceManager 注銷,釋放占用的資源。
(三)模式分類
Client 模式:Driver 運行在客戶端進程中,客戶端會與 ApplicationMaster 和 Executor 進行通信。這種模式適用于交互式應用,例如使用 Spark Shell 進行數據探索和分析。在這種模式下,用戶可以在客戶端直接看到 Driver 的輸出和日志信息,方便調試和監控應用程序的運行狀態。
Cluster 模式:Driver 運行在集群中的某個節點上,由 ApplicationMaster 負責管理。這種模式適用于生產環境中的長時間運行的應用程序。在 Cluster 模式下,客戶端提交應用程序后可以斷開連接,應用程序會在集群中獨立運行,不受客戶端的影響。
(四)配置集群
1.上傳并解壓spark-3.1.2-bin-hadoop3.2.tgz,重命名解壓之后的目錄為spark-yarn。對應的命令是:tar -zxvf spark-3.3.1-bin-hadoop3.tgz -C /opt/module
2. 修改一下spark的環境變量,/etc/profile.d/my_env.sh 。
# spark 環境變量
export SPARK_HOME=/opt/module/spark-yarn
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
同步給其他的設備: xsync ?/etc/profile.d/
3.修改hadoop的配置。/opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml。因為測試環境虛擬機內存較少,防止執行過程進行被意外殺死,添加如下配置。
<!--是否啟動一個線程檢查每個任務正使用的物理內存量,如果任務超出分配值,則直接將其殺掉,默認是true --><property><name>yarn.nodemanager.pmem-check-enabled</name><value>false</value></property><!--是否啟動一個線程檢查每個任務正使用的虛擬內存量,如果任務超出分配值,則直接將其殺掉,默認是true --><property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value></property>
把這個設置分發到其他節點。使用xsync /opt/module/hadoop-3.1.3/etc/hadoop/同步一下。
4.修改spark配置。 把三個文件的名字重新設置一下。
workers.tempalte 改成 workers,spark-env.sh.template 改成 spark-env.sh,
spark-defaults.conf.template 改成 spark-defaults.conf。
然后,在workers文件中添加
hadoop100
hadoop101
hadoop102
在spark-env.sh文件中,添加如下
SPARK_MASTER_HOST=hadoop100SPARK_MASTER_PORT=7077HADOOP_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoopYARN_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop
export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://hadoop100:8020/directory"
在spark-defaults.conf文件中,添加如下
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop100:8020/directory
spark.yarn.historyServer.address=hadoop100:18080
spark.history.ui.port=18080
5.同步配置文件到其他設備。xsync /opt/module/spark-yarn/sbin
(五)啟動集群
注意這里要同時啟動hadoop和spark。
1.啟動hdfs和yarn。使用我們之前配置的腳本:myhadoop start
2. 啟動spark和spark的歷史服務器。進入/opt/module/spart-yarn/sbin,運行: ./start-all.sh 和 ./start-history-server.sh
并通過jps去檢查是否有對應的進程。
(六)提交任務到集群
使用spark-submit提交任務
spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster /opt/module/spark-standalone/examples/jars/spark-examples_2.12-3.1.1.jar 10
代碼說明:
spark-submit:這是 Spark 提供的用于提交 Spark 應用程序的腳本。
2. --class org.apache.spark.examples.SparkPi:指定了應用程序的主類,也就是包含 main 方法的類。這里的 org.apache.spark.examples.SparkPi 是 Spark 自帶的示例程序,用于通過蒙特卡羅方法估算圓周率 π的值。
3. --master yarn:指定了 Spark 應用程序的運行模式為 YARN。YARN 是 Hadoop 的資源管理系統,能夠為 Spark 應用程序分配資源。
4. --deploy-mode cluster:指定了應用程序的部署模式為集群模式。在集群模式下,Driver 進程會在 YARN 集群內部的某個節點上運行。
5. /opt/module/spark-standalone/examples/jars/spark-examples_2.12-3.1.1.jar:指定了包含應用程序代碼的 JAR 文件的路徑。
6. 10:這是傳遞給應用程序的參數,在 SparkPi 示例中,這個參數表示用于估算π的采樣點數。
(七)查看運行結果
1. 在yarn任務面板頁面中可以看到任務的信息。http://hadoop101:8088/cluster
如果可以看任務信息,說明任務運行成功!