01-Spark環境部署

1 Spark的部署方式介紹

? Spark部署模式分為Local模式(本地模式)集群模式(集群模式又分為Standalone模式、Yarn模式和Mesos模式)

1.1 Local模式

Local模式常用于本地開發程序與測試,如在idea中

1.2 Standalone模式

? Standalone模式被稱為集群單機模式。Spark與Hadoop1.0版本有點類似,Spark本身自帶了完整的資源調度管理服務(但這不是它的強項,因為Spark主要是一個計算框架),可以獨立部署到集群中,無須依賴任何其他的資源管理系統,在該模式下,Spark集群架構為主從模式,即一臺Master節點與多臺Slave節點,Slave節點啟動的進程名稱為Worker,此時集群會存在單點故障。(單點故障可利用Spark HA 與zookeeper解決)

這種模式下, Driver 和 Worker 是啟動在節點上的進程,運行在JVM 中的進程

  • Driver 與集群節點之間有頻繁的通信
  • Driver 負責任務(task)的分發和結果的回收 即任務的調度。如果task的計算結果非常大就不要回收了。會造成OOM
  • Worker 是 Standalone 資源調度框架里面資源管理的從節點,也是JVM進程
    • 管理每個節點中的資源狀態,啟動進程,執行Task任務
  • Master 是 Standalone 資源調度框架里面資源管理的主節點,也是JVM進程
    • 管理所有資源狀態

簡單來說:

? Master類似于 yarn的 RM,Driver類似于 yarn的 AM(ApplicationMaster),Slaves類似于 yarn的 NM

? Worker、Master是常駐進程、Driver是當有任務來時才會啟動

1.3 Yarn模式

? Yarn模式被稱為 Spark on Yarn 模式,即把Spark作為一個客戶端,將作業提交給Yarn服務,由于在生產環境中,很多時候要與Hadoop使用同一個集群,因此采用Yarn來管理資源調度,可以有效提高資源利用率

Yarn模式又分為Yarn Cluster模式、Yarn Client模式

  • Yarn Cluster:用于生產環境,所以的資源調度和計算都在集群上運行
  • Yarn Client:用于交互、調試環境

若要基于 yarn 來進行資源調度,必須實現 ApplicationMaster 接口,Spark 實現了這個接口,所以可以基于 Yarn 來進行資源調度

1.4 Mesos模式

? Mesos模式被稱為 Spark on Mesos 模式,Mesos與Yarn同樣是一款資源調度管理系統,可以為Spark提供服務,由于Spark與Mesos存在密切的關系,因此在設計Spark框架時充分考慮到了對Mesos的集成,但如果同時運行Hadoop和Spark,從兼容性的角度來看,Spark on Yarn是更好的選擇

1.5 小結

Spark作為一個數據處理框架和計算引擎,被設計在所有常見的集群環境中運行, 在國內工作中主流的環境為Yarn,不過逐漸容器式環境也慢慢流行起來。接下來,我們就分別看看不同環境下Spark的運行

2 Spark環境部署

2.1 Local模式

Local模式,就是不需要其他任何節點資源就可以在本地執行Spark代碼的環境,一般用于教學,調試,演示等

這種模式最為簡單,解壓即用不需要進入任何配置

1)將壓縮包上傳至Linux并解壓到指定目錄

[nhk@kk01 opt]$ tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/
[nhk@kk01 opt]$ cd /opt/software/
[nhk@kk01 software]$ mv spark-3.2.0-bin-hadoop3.2-scala2.13 spark-local

2)配置文件spark-env.sh

[nhk@kk01 conf]$ pwd
/opt/software/spark-local/conf
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
[nhk@kk01 conf]$ vim spark-env.sh
# 添加如下配置JAVA_HOME=/opt/software/jdk1.8.0_152
SCALA_HOME=/opt/software/scala-2.13.5HADOOP_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop

3)啟動spark shell

命令

spark-shell -master local | local[k]| local[*]   # 建議 k>= 2

其中k表示啟動線程數目(CPU Core核數)

Value
localRuns Spark locally with one worker thread. There will be no multiple threads running in parallel
local[k]Runs Spark locally with k number of threads.( K is ideally the number of cores in your machine.)
local[*]Runs Spark locally with a number of worker threads that equals the number of logical cores in your machine.
# 進入解壓縮后的路徑,執行如下指令
[nhk@kk01 software]$ cd spark-local/
[nhk@kk01 spark-local]$ bin/spark-shell
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to____              __/ __/__  ___ _____/ /___\ \/ _ \/ _ `/ __/  '_//___/ .__/\_,_/_/ /_/\_\   version 3.2.0/_/Using Scala version 2.13.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_152)
Type in expressions to have them evaluated.
Type :help for more information.
23/04/13 07:08:48 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark context Web UI available at http://kk01:4040
Spark context available as 'sc' (master = local[*], app id = local-1681384129891).
Spark session available as 'spark'.scala> 

3)輸入網址進入web ui監控頁面訪問

http://kk01:4040

注意:

? 這里的kk01是在hosts文件配置了ip地址映射,如果沒有,默認填寫ip

4)退出Local本地模式

兩種方式:

1、直接按ctrl+c 或 ctrl+d

2、輸入Scala指令

:quit

5)提交應用

[nhk@kk01 spark-local]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10# --class 表示要執行的程序的主類(可以可以根據我們自己編寫的程序做出相應修改)
# --master local[2] 部署模式,默認為本地模式,數字表示分配的虛擬cpu核數量
# spark-examples_2.13-3.2.0.jar 運行的應用類所在的jar包(實際使用時可設定為我們自己打的jar報)
# 數字10表示程序的入口參數,用于設定當前應用的任務數量

2.2 Standalone模式

? 真實工作中還是要將應用提交到對應的集群中去執行,這里我們來看看只使用Spark自身節點運行的集群模式,也就是我們所謂的獨立部署(Standalone)模式

Spark的 Standalone 模式體現了經典的master-slave模式

注意:

? 搭建集群之前需要確認 jdk版本為8

0)集群規劃

kk01kk02kk03
Worker MasterWorkerWorker

1)將壓縮包上傳至Linux并解壓到指定目錄

[nhk@kk01 opt]$ tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/
[nhk@kk01 opt]$ cd /opt/software/
[nhk@kk01 software]$ mv spark-3.2.0-bin-hadoop3.2-scala2.13 spark-standalone

2)修改配置文件

  • 進入spark-standalone/conf目錄,修改workers.template文件名為workes(保守做法可以選擇復制)
[nhk@kk01 software]$ cd spark-standalone/conf/
[nhk@kk01 conf]$ cp workers.template workers
  • 修改workes文件,添加worker節點
[nhk@kk01 conf]$ vim workers
# 將文件內容替換為如下kk01
kk02
kk03
  • 修改spark-env.sh.template文件名為spark-env.sh (保守做法可以選擇復制)
[nhk@kk01 conf]$ cd /opt/software/spark-standalone/conf/
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
  • 修改spark-env.sh文件,添加JAVA_HOME環境變量和集群對應的master節點
[nhk@kk01 conf]$ vim spark-env.sh 
# 在文件末尾添加如下內容# 配置 jdk 環境
export JAVA_HOME=/opt/software/jdk1.8.0_152
# 配置 Master 的 IP 端口
export SPARK_MASTER_HOST=kk01
export SPARK_MASTER_PORT=7077# 注意:7077端口,相當于kk01內部通信的8020端口(此處的端口需要確認自己的Hadoop)

3)分發spark-standalone目錄

# 使用scp或rsync分發,scp或rsync區別在于 scp是完全拷貝 rsync只對差異文件進行拷貝# 由于是第一次配置standalone模式,因此這里使用scp
[nhk@kk01 software]$ scp -r /opt/software/spark-standalone/ kk02:/opt/software/spark-standalone/
[nhk@kk01 software]$ scp -r /opt/software/spark-standalone/ kk03:/opt/software/spark-standalone/# 如果定義了分發腳本 xsync ,則使用自定義腳本
[nhk@kk01 software]$ xsync spark-standalone

4)啟動集群

[nhk@kk01 spark-standalone]$ sbin/start-all.sh 

5)查看服務器進程

[nhk@kk01 spark-standalone]$ jps
2480 Master
2695 Jps
2586 Worker[nhk@kk02 ~]$ jps
2497 Jps
2414 Worker[nhk@kk03 ~]$ jps
2416 Worker
2499 Jps

6)查看Master資源監控Web UI界面

http://kk01:8080

注意:

? kk01這里默認是填寫服務器ip,但是我們在hosts文件里映射了ip,因此填主機名也可以

7)提交應用(client模式)

[root@kk01 spark-standalone]# bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077 \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10# --class 表示要執行的程序的主類(可以可以根據我們自己編寫的程序做出相應修改)
# --master spark://kk01:7077 獨立部署模式,連接到Spark集群
# spark-examples_2.13-3.2.0.jar 運行的應用類所在的jar包
# 數字10表示程序的入口參數,用于設定當前應用的任務數量
  • 執行任務時,會產生多個Java進程

    ? CoarseGrainedExecutorBackend 執行節點進程

    ? SparkSumbit 提交節點進程

    [nhk@kk01 ~]$ jps
    2611 DataNode
    3027 ResourceManager
    3171 NodeManager
    3687 Master
    3783 Worker
    2473 NameNode
    3581 JobHistoryServer
    4205 Jps
    3998 SparkSubmit
    
  • 執行任務時,默認采用服務器集群節點的總核數,每個節點內存1024M。

任務執行流程

  1. client 模式提交任務后,會在客戶端啟動 Driver進程
  2. Driver 回向 Master 申請啟動 Application 啟動的資源
  3. 資源申請成功,Driver 端將 task 分發到worker 端執行,啟動 executor進程(任務的分發)
  4. Worker 端(executor進程) 將task 執行結果返回到 Driver 端(任務結果的回收)

提交參數說明

在提交應用中,一般會同時一些提交參數

bin/spark-submit \
--class <main-class>
--master <master-url> \
... # other options
<application-jar> \
[application-arguments]
參數解釋可選值舉例
–classSpark程序中包含主函數的類
–masterSpark程序運行的模式(環境)模式:local[*]、spark://linux1:7077、Yarn
–executor-memory 1G指定每個executor可用內存為1G
(這里越大計算能力越強)
–total-executor-cores 2指定所有executor使用的cpu核數為2個
–executor-cores指定每個executor使用的cpu核數
application-jar打包好的應用jar,包含依賴。
這個URL在集群中全局可見。
比如hdfs:// 共享存儲系統。
如果是file://path,那么所有的節點的path都包含同樣的jar
application-arguments傳給main()方法的參數

總結:

? **client模式適用于測試調試程序。**Driver進程是在客戶端啟動的,這里的客戶端指的是提交應用程序的當前節點。在Driver端可以看到 task執行的情況

? **生成環境中不能使用client模式。**因為:假設要提交100個application 到集群運行,Driver每次都會在 client端啟動,那么就會導致客戶端100網卡流量暴增的問題。

8)提交應用(cluster模式)

[nhk@kk01 spark-standalone]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077 \
--deploy-mode cluster \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10

2.3 standalone配置歷史服務器

? 由于spark-shell停止掉后,集群監控kk01:4040頁面就看不到歷史任務的運行情況,所以開發時都配置歷史服務器記錄任務運行情況。(說白點,就是Driver節點停止了)

1)修改spark-defaults.conf.template文件名為spark-defaults.conf

[nhk@kk01 conf]$ cd /opt/software/spark-standalone/conf/
[nhk@kk01 conf]$ cp spark-defaults.conf.template spark-defaults.conf

2)修改spark-default.conf文件,配置日志存儲路徑

[nhk@kk01 conf]$ vim spark-defaults.conf 
# 在文件末尾加入如下內容spark.eventLog.enabled          true
spark.eventLog.dir               hdfs://kk01:8020/spark-history 

注意:

? 需要啟動hadoop集群,HDFS上的spark-history 目錄需要提前存在。

3)在創建HDFS上的spark-history 目錄

[nhk@kk01 conf]$ start-dfs.sh   # Hadoop配置了環境變量,腳本全局可用
[nhk@kk01 conf]$ hadoop fs -mkdir  /spark-history

4)修改spark-env.sh文件, 添加日志配置

[nhk@kk01 conf]$ pwd
/opt/software/spark-standalone/conf
[nhk@kk01 conf]$ vim spark-env.sh # 在文件中添加如下內容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history
-Dspark.history.retainedApplications=30"# 參數說明
#	參數1含義:WEB UI訪問的端口號為18080
#	參數2含義:指定歷史服務器日志存儲路徑
#	參數3含義:指定保存Application歷史記錄的個數,如果超過這個值,舊的應用程序信息將被刪除,這個是內存中的應用數,而不是頁面上顯示的應用數

5)分發配置文件

# 使用rsync命名更新差異文件  # 因為我們只更改了conf目錄下的文件,因此只分發conf目錄即可
[nhk@kk01 spark-standalone]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/[nhk@kk01 spark-standalone]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/# 參數說明
#	-a 歸檔拷貝
#	-v 顯示拷貝過程

6)重新啟動集群和歷史服務

# 先確保hdfs集群、spark集群關閉
[nhk@kk01 spark-standalone]$  stop-dfs.sh 
[nhk@kk01 spark-standalone]$  sbin/stop-all.sh # 重啟
[nhk@kk01 spark-standalone]$ start-dfs.sh 
[nhk@kk01 spark-standalone]$ sbin/start-all.sh 
[nhk@kk01 spark-standalone]$ sbin/start-history-server.sh

7)查看進程

[nhk@kk01 spark-standalone]$ jps
5921 Master
6052 Worker
5558 DataNode
5371 NameNode
6235 Jps
6174 HistoryServer

8)重新執行任務

[nhk@kk01 spark-standalone]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077 \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10

9)查看歷史服務

確保歷史服務可用

http://kk01:18080/

2.4 standalone配置高可用(HA)基于Zookeeper

當前集群中的Master節點只有一個,所以會存在單點故障問題。所以為了解決單點故障問題,需要在集群中配置多個Master節點,一旦處于活動狀態的Master發生故障時,由備用Master提供服務,保證作業可以繼續執行。這里的高可用一般采用Zookeeper設置

集群規劃

kk01	Worker ZooKeeper Masterkk02	Worker ZooKeeper Masterkk03	Worker ZooKeeper 

1)停止集群(可選)

在確保hdfs集群、spark集群停止的情況下,才開始配置HA

[nhk@kk01 spark-standalone]$ sbin/stop-all.sh 
[nhk@kk01 spark-standalone]$ stop-dfs.sh 

2)啟動Zookeeper集群

[nhk@kk01 spark-standalone]$ zkServer.sh start
[nhk@kk02 ~]$ zkServer.sh start
[nhk@kk03 ~]$ zkServer.sh start# 也可以使用自定義腳本啟動集群(如果你定義了的話)
[nhk@kk01 spark-standalone]$ xzk.sh start

3)修改spark-env.sh文件添加如下配置

[nhk@kk01 conf]$ pwd
/opt/software/spark-standalone/conf
[nhk@kk01 conf]$ vim spark-env.sh注釋如下內容:
#SPARK_MASTER_HOST=kk01
#SPARK_MASTER_PORT=7077添加如下內容:
#Master監控頁面默認訪問端口為8080,但是可能會和Zookeeper沖突,所以改成8989,也可以自定義,訪問UI監控頁面時請注意
SPARK_MASTER_WEBUI_PORT=8989export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER 
-Dspark.deploy.zookeeper.url=kk01,kk02,kk03 
-Dspark.deploy.zookeeper.dir=/spark"

參考配置文件如下

export JAVA_HOME=/opt/software/jdk1.8.0_152
#SPARK_MASTER_HOST=kk01
#SPARK_MASTER_PORT=7077export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history 
-Dspark.history.retainedApplications=30"#Master監控頁面默認訪問端口為8080,但是可能會和Zookeeper沖突,所以改成8989,也可以自定義,訪問UI監控頁面時請注意
SPARK_MASTER_WEBUI_PORT=8989export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER 
-Dspark.deploy.zookeeper.url=kk01,kk02,kk03 
-Dspark.deploy.zookeeper.dir=/spark"

4)分發配置文件

[nhk@kk01 conf]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/[nhk@kk01 conf]$ rsync -av /opt/software/spark-standalone/conf/ kk03:/opt/software/spark-standalone/conf/

5)啟動集群

啟動spark集群前先啟動hdfs集群,確定歷史服務器正常,當然也需要確保zookeeper集群正常啟動

[nhk@kk01 conf]$ start-dfs.sh  # 啟動hdfs集群[nhk@kk01 spark-standalone]$ pwd
/opt/software/spark-standalone
[nhk@kk01 spark-standalone]$ sbin/start-all.sh [nhk@kk01 spark-standalone]$ sbin/start-history-server.sh 	# 啟動歷史服務進程

6) 啟動kk02的單獨Master節點,此時kk02節點Master狀態處于備用狀態

[nhk@kk02 ~]$ cd /opt/software/spark-standalone/
[nhk@kk02 spark-standalone]$ sbin/start-master.sh 

7)查看進程

[nhk@kk01 spark-standalone]$ jps
7697 NameNode
8385 Worker
8504 Jps
7289 QuorumPeerMain
8250 Master
7884 DataNode
6174 HistoryServer   # 歷史服務器進程[nhk@kk02 spark-standalone]$ jps
4546 DataNode
4315 QuorumPeerMain
5003 Jps
4909 Master   # 備份master
4798 Worker[nhk@kk03 ~]$ jps
4688 SecondaryNameNode
4256 Worker
4347 Jps
3884 QuorumPeerMain
4111 DataNodes

8)提交應用到高可用集群

[nhk@kk01 spark-standalone]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077,kk02:7077 \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10

9)查看kk01的Master 資源監控Web UI

http://kk01:8989/

發現狀態為 Status: ALIVE

10)手動停止kk01的Master資源監控進程

[nhk@kk01 spark-standalone]$ jps
7697 NameNode
8385 Worker
7289 QuorumPeerMain
8250 Master
7884 DataNode
6174 HistoryServer
8910 Jps
[nhk@kk01 spark-standalone]$ kill -9 8250

11) 查看kk02的Master 資源監控Web UI,稍等一段時間后,kk02節點的Master狀態提升為活動狀態

http://kk02:8989/

狀態變化

? Status:STANDBY ====> Status: ALIVE

2.5 Yarn模式

? 獨立部署(Standalone)模式由Spark自身提供計算資源,無需其他框架提供資源。這種方式降低了和其他第三方資源框架的耦合性,獨立性非常強。但是你也要記住,**Spark主要是計算框架,而不是資源調度框架,所以本身提供的資源調度并不是它的強項,所以還是和其他專業的資源調度框架集成會更靠譜一些。**所以接下來我們來學習在強大的Yarn環境下Spark是如何工作的(其實是因為在國內工作中,Yarn使用的非常多)。

注意:

? Spark on Yarn 不需要單獨開啟spark相關的進程

Spark On Yarn的本質

  • Master 角色由YARN的 ResourceManager 擔任
  • Worker 角色由YARN的 NodeManager 擔任
  • Driver 角色運行在YARN容器內 或 提交任務的客戶端進程
  • 真正干活的Executor運行在YARN提供的容器

1)上傳并解壓縮文件

將spark-3.2.0-bin-hadoop3.2-scala2.13.tgz文件上傳到linux并解壓縮,放置在指定位置。

[nhk@kk01 ~]$ cd /opt/software/
[nhk@kk01 software]$ rz[nhk@kk01 software]$ tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/

2)重命名

[nhk@kk01 software]$ mv spark-3.2.0-bin-hadoop3.2-scala2.13/ spark-yarn

3)修改配置文件yarn-site.xml

修改hadoop配置文件/opt/software/hadoop-3.1.3/etc/hadoop/yarn-site.xml

修改這個配置文件的原因是因為:

[nhk@kk01 hadoop]$ pwd
/opt/software/hadoop-3.1.3/etc/hadoop
[nhk@kk01 hadoop]$ vim yarn-site.xml 
# 添加如下內容<!-- 是否將對容器實施物理內存限制 生產中可產生改配置-->
<!--是否啟動一個線程檢查每個任務正使用的物理內存量,如果任務超出分配值,則直接將其殺掉,默認是true -->
<property><name>yarn.nodemanager.pmem-check-enabled</name><value>true</value>
</property><!-- 是否將對容器實施虛擬內存限制 生產中可產生改配置-->
<property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value>
</property><!-- 開啟日志聚集-->
<property><name>yarn.log-aggregation-enable</name><value>true</value>
</property>
<!-- 設置yarn歷史服務器地址-->
<property><name>yarn.log.server.url</name><value>http://kk01:19888/jobhistory/logs</value>
</property><property><name>yarn.nodemanager.remote-app-log-dir</name><value>/tmp/logs</value>
</property>	
<!-- 歷史日志保存的時間 7天-->
<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value>
</property>

4)同步修改的文件至所有服務器

[nhk@kk01 hadoop]$ rsync -av /opt/software/hadoop-3.1.3/etc/hadoop/ kk02:/opt/software/hadoop-3.1.3/etc/hadoop/[nhk@kk01 hadoop]$ rsync -av /opt/software/hadoop-3.1.3/etc/hadoop/ kk03:/opt/software/hadoop-3.1.3/etc/hadoop/

5) 修改conf/spark-env.sh

當Spark Application連接到yarn集群上運行時,需要設置環境變量HADOOP_CONF_DIR指向Hadoop配置目錄,以獲取集群信息

在 $SPARK_HOME/conf/spark-env.sh 文件中

修改conf/spark-env.sh,添加 JAVA_HOME和YARN_CONF_DIR配置

[nhk@kk01 hadoop]$ cd /opt/software/spark-yarn/conf/
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
[nhk@kk01 conf]$ vim spark-env.sh
# 添加如下內容export JAVA_HOME=/opt/software/jdk1.8.0_152HADOOP_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop
# 下面這個也可以不配,因為和上面一樣
YARN_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop

6)啟動HDFS集群、YARN集群

# 我們配置過Hadoop環境變量,因此可以直接使用腳本一鍵啟動
[nhk@kk01 conf]$ start-dfs.sh 
[nhk@kk01 conf]$ start-yarn.sh 

7)提交應用(cluster模式)

[nhk@kk01 spark-yarn]$ pwd
/opt/software/spark-yarn
[nhk@kk01 spark-yarn]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10# 或者[nhk@kk01 spark-yarn]$ pwd
/opt/software/spark-yarn
[nhk@kk01 spark-yarn]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10

查看http://kk01:8088頁面,查看歷史頁面,查看任務調度情況,點擊History,查看歷史頁面

yarn client 任務執行流程

  1. 客戶端提交一個 Application,在客戶端會啟動一個 Driver進程
  2. 應用程序啟動后會向 RM(ResourceMananger)(相當于 standalone模式下的master進程)發送請求,啟動AM(ApplicationMaster)
  3. RM收到請求,隨機選擇一臺 NM(NodeManager)啟動AM。這里的NM相當于standalone中的Worker進程
  4. AM啟動后,會向 RM 請求一批 container資源,用于啟動Executor
  5. RM會找到一批 NM(包含container)返回給AM,用于啟動Executor
  6. AM 會向 NM發送命令啟動 Executor
  7. Executor啟動后,會方向注冊給 Driver,Driver發送 task 到 Executor ,執行情況和結果返回給Driver端

總結:

? yarn-client模式同樣是適用于測試,因為Driver 運行在本地,Driver會與yarn集群中的Executor 進行大量的通信,提交的 application 過多同樣會造成客戶機網卡流量的大量增加

? ApplicationMaster(executorLauncher)在次模式中的作用:

  • 為當前的 Application 申請資源
  • 給 NodeManager 發送消息啟動 Executor

注意:ApplicationMaster 在此模式下有 launchExecutor和申請資源的功能,沒有作業調度的功能

2.6 Yarn配置歷史服務器

? 配置了 historyServer,停止程序后,可以在web ui 中 Completed Application 對應的 ApplicationID 中能查看history

1)spark-defaults.conf

修改spark-defaults.conf.template 文件名為 spark-defaults.conf

[nhk@kk01 spark-yarn]$ cd conf/
[nhk@kk01 conf]$ pwd
/opt/software/spark-yarn/conf
[nhk@kk01 conf]$ cp spark-defaults.conf.template spark-defaults.conf

2)修改spark-default.conf文件**,配置日志存儲路徑**

[nhk@kk01 conf]$  vim spark-defaults.conf 
# 在文件末尾加入如下內容# 開啟記錄事件日志的功能
spark.eventLog.enabled          true
# 設置事件日志存儲的路徑
spark.eventLog.dir               hdfs://kk01:8020/spark-history 
spark.history.fs.logDirectory    hdfs://kk01:8020/spark-history # 日志優化選項,壓縮日志
spark.eventLog.compress 		true

注意:

? 需要啟動hadoop集群,HDFS上的spark-history 目錄需要提前存在

3)在創建HDFS上的directory目錄

[nhk@kk01 conf]$ start-dfs.sh   # Hadoop配置了環境變量,腳本全局可用
[nhk@kk01 conf]$ hadoop fs -mkdir  /spark-history

4)修改spark-env.sh文件, 添加日志配置

[nhk@kk01 conf]$  pwd
/opt/software/spark-yarn/conf
[nhk@kk01 conf]$  vim spark-env.sh # 在文件中添加如下內容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history 
-Dspark.history.retainedApplications=30"# 參數說明
#	參數1含義:WEB UI訪問的端口號為18080
#	參數2含義:指定歷史服務器日志存儲路徑
#	參數3含義:指定保存Application歷史記錄的個數,如果超過這個值,舊的應用程序信息將被刪除,這個是內存中的應用數,而不是頁面上顯示的應用數

5)修改spark-defaults.conf配置SparkHistoryServer

[nhk@kk01 conf]$ vim spark-defaults.conf
# 添加如下配置spark.yarn.historyServer.address=kk01:18080
spark.history.ui.port=18080

6)啟動歷史服務器

[nhk@kk01 conf]$ cd ..
[nhk@kk01 spark-yarn]$ sbin/start-history-server.sh 
starting org.apache.spark.deploy.history.HistoryServer, logging to /opt/software/spark-yarn/logs/spark-nhk-org.apache.spark.deploy.history.HistoryServer-1-kk
01.out[nhk@kk01 spark-yarn]$ jps
2627 NameNode
2771 DataNode
3331 JobHistoryServer	# 這個是Hadoop的歷史服務器
4677 Jps
4605 HistoryServer		# 這個是Spark的歷史服務器
3134 NodeManager

7)重新提交應用(client模式)

[nhk@kk01 spark-yarn]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10

8)Web頁面查看日志

http://kk01:18080/

配置依賴Spark jar包(優化配置)

當Spark Application應用提交運行在YARN上時,默認情況下,每次提交應用都需要將Spark相關jar包上傳到YARN集群上,為了節省提交時間和存儲空間,將Spark相關jar包上傳到HDFS目錄,設置屬性告知Spark Application應用

說明:

? 該項配置屬于優化配置,可酌情考慮配置與否

上傳Spark jar包前需要確保HDFS集群開啟

# 在HDFS上創建目錄,用于存放jar包
[nhk@kk01 ~]$ hadoop fs -mkdir sparkjars# 上傳$SPARK_HOME/jars中所有的jar包
[nhk@kk01 ~]$ hadoop fs -put /opt/software/spark-yarn/jars/* /sparkjars

在$SPARK_HOME/conf/spark-defaults.conf文件增加spark 相關jar包存儲在HDFS上的位置信息

[nhk@kk01 ~]$ vim /opt/software/spark-yarn/conf/spark-defaults.conf
# 添加如下配置spark.yarn.jars hdfs://kk01:8020/sparkjars/*

同步配置到所有節點

[nhk@kk01 ~]$ sudo /home/nhk/bin/xsync /opt/software/spark-yarn/

3 部署模式對比

模式Spark安裝機器數需啟動的進程所屬者應用場景
Local1Spark測試
Standalone3Master及WorkerSpark單獨部署
Yarn1Yarn及HDFSHadoop混合部署

4 常見端口號

  • Spark查看當前Spark-shell運行任務情況端口號:4040(計算)

  • Spark Master內部通信服務端口號:7077

  • Standalone模式下,Spark Master Web端口號:8080(資源)

  • Spark歷史服務器端口號:18080

  • Hadoop YARN任務運行情況查看端口號:8088

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36518.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PAT 1039 Course List for Student

個人學習記錄&#xff0c;代碼難免不盡人意。 Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists of all the courses, you are supposed to output the registered course list for each student who comes for a query. …

netty學習分享 二

操作系統IO模型與實現原理 阻塞IO 模型 應用程序調用一個IO函數&#xff0c;導致應用程序阻塞&#xff0c;等待數據準備好。如果數據沒有準備好&#xff0c;一直等待….數據準備好了&#xff0c;從內核拷貝到用戶空間,IO函數返回成功指示。 當調用recv()函數時&#xff0c;系…

釉面陶瓷器皿SOR/2016-175標準上架亞馬遜加拿大站

親愛的釉面陶瓷器皿和玻璃器皿制造商和賣家&#xff0c;亞馬遜加拿大站將執行SOR/2016-175法規。這是一份新的法規&#xff0c;規定了含有鉛和鎘的釉面陶瓷器和玻璃器皿需要滿足的要求。讓我們一起來看一看&#xff0c;為什么要實行SOR/2016-175法規&#xff1f;這是一個保護消…

yolo源碼注釋3——模型配置文件

代碼基于yolov5 v6.0 目錄&#xff1a; yolo源碼注釋1——文件結構yolo源碼注釋2——數據集配置文件yolo源碼注釋3——模型配置文件yolo源碼注釋4——yolo-py 模型配置文件一般放在 models 文件夾下的 XXX.yaml 文件中&#xff0c;以 yolov5s.yaml 為例&#xff1a; # YOLOv…

使用SpringAop切面編程通過Spel表達式實現Controller權限控制

目錄 參考一、概念SpEL表達式 二、開發引入包定義注解定義切面定義用戶上下文 三、測試新建Service在方法上注解新建Service在類上注解運行 參考 SpringBoot&#xff1a;SpEL讓復雜權限控制變得很簡單 一、概念 對于在Springboot中&#xff0c;利用自定義注解切面來實現接口…

opencv實戰項目 手勢識別-手勢音量控制(opencv)

本項目是使用了谷歌開源的框架mediapipe&#xff0c;里面有非常多的模型提供給我們使用&#xff0c;例如面部檢測&#xff0c;身體檢測&#xff0c;手部檢測等。 手勢識別系列文章 1.opencv實現手部追蹤&#xff08;定位手部關鍵點&#xff09; 2.opencv實戰項目 實現手勢跟蹤…

8月14日,每日信息差

1、FF正式交付首輛FF 91 2.0 Futurist Alliance給塔尖用戶 2、消息稱iPhone SE 4設計基于iPhone 14&#xff0c;但仍是后置單攝像頭 3、阿聯酋力推電動汽車發展。該政策將作為一個監管框架&#xff0c;明確電動汽車充電站等基礎設施建設的標準&#xff0c;并推動全國標準統一…

Jay17 2023.8.12日報

8.12 今天做了2題&#xff0c;CTFshow 紅包挑戰8&#xff08;PHP create_function()&#xff09;和BUU [RoarCTF 2019]Easy Java&#xff08;web.xml泄露&#xff09;。 此外一直在打NepCTF&#xff0c;出了一題&#xff08;ez_java_checkin&#xff09;簡單了解了java中shri…

Kafka消息隊列學習(一)

文章目錄 概述核心概念生產者示例同步 / 異步發送消息生產者參數配置ack-確認機制retries - 重試次數compression_type - 消息壓縮類型 分區機制分區策略 消費者消息有序性提交和偏移量偏移量提交方式手動提交 高可用設計 SpringBoot集成Kafka基本使用傳遞對象消息 概述 核心概…

HTTP之cookie基礎學習

目錄 Cookie 什么是Cookie Cookie分類 Cookie版本 Cookie工作原理 Cookie詳解 創建cookie cookie編碼 cookie過期時間選項 Cookie流程 Cookie使用 會話管理 個性化信息 記錄用戶的行為 Cookie屬性 domain選項 path選項 secure選項 cookie…

帶著問題學習分布式系統

寫在前面 聽過很多道理&#xff0c;卻依然過不好這一生。 看過很多關于學習的技巧、方法&#xff0c;卻沒應用到自己的學習中。 隨著年紀變大&#xff0c;記憶力越來越差&#xff0c;整塊的時間也越來越少&#xff0c;于是&#xff0c;越來越希望能夠更高效的學習。學習是一種習…

香港大學余濤組推出開源XLANG Agent!支持三種Agent模式

作者 |小戲、ZenMoore 一個新的未來又逐漸開始從理論走向現實走到我們身邊了。 語言的意義在于使用&#xff0c;而從 ChatGPT 以來這些大規模語言模型的意義&#xff0c;也必然絕不止于 Chat&#xff0c;在四個月前&#xff0c;我們介紹了清華大學關于工具學習的綜述《清華發布…

Python-OpenCV中的圖像處理-圖像特征

Python-OpenCV中的圖像處理-圖像特征 圖像特征Harris角點檢測亞像素級精度的角點檢測Shi-Tomasi角點檢測SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features) 圖像特征 特征理解特征檢測特征描述 Harris角點檢測 cv2.cornerHarris(img, blockSize, ks…

海格里斯HEGERLS四向穿梭車倉儲解決方案在電子商務行業中的應用

隨著現代物流&#xff0c;尤其是智能化物流的飛速發展&#xff0c;河北沃克金屬制品有限公司看到了智能物流領域背后的巨大價值和市場空間&#xff0c;深知物流與供應鏈對企業發展的重要性。于是&#xff0c;引進了先進的高科技智能技術—HEGERLS四向穿梭車技術&#xff0c;并迅…

【日常積累】Linux下文件亂碼解決

linux下刪除亂碼文件、目錄 由于編碼原因&#xff0c;在linux服務器上上傳、創建中文文件或目錄時&#xff0c;會產生亂碼&#xff0c;如果想刪除它&#xff0c;有時候發現用rm命令是刪除不了的 這種情況下&#xff0c;用find命令可以刪除亂碼的文件或目錄。 首先進入亂碼文件…

docker 網絡訪問診斷

本地docker開啟nginx服務等&#xff0c; 發現linux系統重啟之后&#xff0c;無法訪問&#xff0c; 進入容器內部&#xff0c;發現可以訪問 但是容器外部&#xff0c;映射端口無法訪問&#xff1b; 診斷之前&#xff0c;發現docker0沒有IP綁定 rootbook:/etc/docker# ip addr …

自制手寫機器人

寫字機器人模擬在畫圖板上寫字效果 寫了一套寫字機器人代碼&#xff0c;有多種字體可供選擇&#xff0c;需要的朋友私信獲取代碼和軟件

Spring5學習筆記— 工廠高級特性

?作者簡介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;熱愛Java后端開發者&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;Leo的博客 &#x1f49e;當前專欄&#xff1a; Spring專欄 ?特色專欄&#xff1a; M…

創建型模式-原型模式

文章目錄 一、原型模式1. 概述2. 結構3. 實現4. 案例1.5 使用場景1.6 擴展&#xff08;深克隆&#xff09; 一、原型模式 1. 概述 用一個已經創建的實例作為原型&#xff0c;通過復制該原型對象來創建一個和原型對象相同的新對象。 2. 結構 原型模式包含如下角色&#xff1a; …

微服務架構和分布式架構的區別

微服務架構和分布式架構的區別 有&#xff1a;1、含義不同&#xff1b;2、概念層面不同&#xff1b;3、解決問題不同&#xff1b;4、部署方式不同&#xff1b;5、耦合度不同。其中&#xff0c;含義不同指微服務架構是一種將一個單一應用程序開發為一組小型服務的方法&#xff…