Spark詳解(03) - Spark3.0.0運行環境安裝


Spark詳解(03) - Spark3.0.0運行環境安裝

Spark運行模式

Spark常見部署模式:

Local模式:在本地部署單個Spark服務

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

在IDEA中運行代碼的環境稱之為開發環境,和Local模式還是有區別的。

Standalone模式Spark自帶的任務調度模式。(國內常用)

YARN模式Spark使用HadoopYARN組件進行資源與任務調度。(國內常用)

Windows模式:為了方便在學習測試spark程序,Spark提供了可以在windows系統下啟動本地集群的方式,這樣,在不使用虛擬機或服務器的情況下,也能滿足Spark的基本使用。

Mesos & K8S模式:(了解)。

MesosApache下的開源分布式資源管理框架,它被稱為是分布式系統的內核,Twitter得到廣泛使用,管理着Twitter超過30,0000台服務器上的應用部署,但是在國內,依然使用着傳統的Hadoop大數據框架,所以國內使用Mesos框架的並不多,但是原理都差不多。

容器化部署是目前業界很流行的一項技術,基於Docker鏡像運行能夠讓用戶更加方便地對應用進行管理和運維。容器管理工具中最為流行的就是Kubernetesk8s),而Spark也在最近的版本中支持了k8s部署模式。詳情參考官網地址:https://spark.apache.org/docs/latest/running-on-kubernetes.html

Spark安裝地址

官網地址:http://spark.apache.org/

文檔查看地址:https://spark.apache.org/docs/3.0.0/

官網下載地址:https://spark.apache.org/downloads.html

鏡像歷史版本下載地址:https://archive.apache.org/dist/spark/

本文使用的版本下載地址:https://archive.apache.org/dist/spark/spark-3.0.0/spark-3.0.0-bin-hadoop3.2.tgz

Local模式安裝(測試環境)

Local模式就是運行在一台計算機上的模式,通常就是用於測試環境。

安裝

Local模式的安裝非常簡單,直接將安裝包上傳到服務器並解壓即可使用,具體操作步驟如下

上傳安裝包park-3.0.0-bin-hadoop3.2.tgz到服務器

解壓安裝包

[root@hadoop102 software]# tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module/

[root@hadoop102 software]# cd /opt/module/

[root@hadoop102 module]# mv spark-3.0.0-bin-hadoop3.2/ spark-local

使用

官方求PI案例驗證安裝結果

[root@hadoop102 spark-local]# bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[2] ./examples/jars/spark-examples_2.12-3.0.0.jar 10

運行結果展示

提交命令參數說明

--class:表示要執行程序的主類;

--master local[2]

1local: 沒有指定線程數,則所有計算都運行在一個線程當中,沒有任何並行計算

2local[K]:指定使用KCore來運行計算,比如local[2]就是運行2Core來執行

3local[*]:默認模式。自動按照CPU最多核來設置線程數。比如CPU8核,Spark自動設置8個線程計算。

spark-examples_2.12-3.0.0.jar:要運行的程序jar包名稱;

10:要運行程序的輸入參數(這里表示計算圓周率π的次數,計算次數越多,准確率越高);

可以查看spark-submit所有參數:

[root@hadoop102 spark-local]# bin/spark-submit

官方WordCount案例

1)需求:讀取多個輸入文件,統計每個單詞出現的總次數。

2)需求分析:

代碼實現:

1)准備文件

mkdir input

input下創建2個文件1.txt2.txt,並輸入內容

echo "hello hadoop" >> 1.txt

echo "hello spark" >> 1.txt

echo "hello hadoop" >> 2.txt

echo "hello spark" >> 2.txt

2)使用bin/spark-shell命令啟動spark-shell

注意:scSparkCore程序的入口;sparkSparkSQL程序入口;master = local[*]表示本地模式運行。

Spark context Web UI available at http://192.168.194.102:4040

Spark context available as 'sc' (master = local[*], app id = local-1646410143774).

再開啟一個hadoop102遠程連接窗口,使用jps查看SparkSubmit進程

[root@hadoop102 ~]# jps

1370 Jps

1276 SparkSubmit

運行任務方式說明:

spark-submit,是將jar上傳到集群,執行Spark任務;

spark-shell,相當於命令行工具,本身也是一個Application

3)登錄hadoop102:4040,查看程序運行情況(注意:spark-shell窗口關閉掉,則hadoop102:4040頁面關閉)

說明:本地模式下,默認的調度器為FIFO

5)運行WordCount程序

scala> sc.textFile("/opt/module/spark-local/input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

res0: Array[(String, Int)] = Array((hello,4), (spark,2), (hadoop,2))

注意:只有collect開始執行時,才會加載數據。

登錄hadoop102:4040查看程序運行結果

Standalone(獨立)模式

Standalone模式(也稱獨立模式)是Spark自帶的資源調動引擎,構建一個由Master + Slave構成的Spark集群,Spark運行在集群中。

這個要和Hadoop中的Standalone區別開來。這里的Standalone是指只用Spark來搭建一個集群,不需要借助HadoopYarnMesos等其他框架。

安裝

Hadoop102 Master, Worker

Hadoop103Worker

Hadoop104Worker

安裝jdk環境

配置hosts文件

ssh免密登錄

生成key

ssh-keygen

四個回車

key拷貝到其他機器

ssh-copy-id hadoop102

ssh-copy-id hadoop103

ssh-copy-id hadoop104

關閉防火牆

[root@hadoop102 module]# tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module/

[root@hadoop102 module]# cd /opt/module/

[root@hadoop102 module]# mv spark-3.0.0-bin-hadoop3.2/ spark-standlone

[root@hadoop102 module]# cd spark-standlone/conf/

[root@hadoop102 conf]# mv slaves.template slaves

[root@hadoop102 conf]# vi slaves

清空原來內容,添加如下內容

hadoop102

hadoop103

hadoop104

[root@hadoop102 conf]# mv spark-env.sh.template spark-env.sh

[root@hadoop102 conf]# vi spark-env.sh

在文件末尾添加如下內容

SPARK_MASTER_HOST=hadoop102

SPARK_MASTER_PORT=7077

[root@hadoop102 spark-standlone]# cd ../

[root@hadoop102 spark-standlone]# vi /opt/module/spark-standlone/sbin/spark-config.sh

在文件末尾添加如下內容

export JAVA_HOME=export JAVA_HOME=/usr/local/jdk1.8.0_191

如果不配置JAVA_HOME環境變量,在執行sbin/start-all.sh命令啟動spark集群的時候可能會出現JAVA_HOME is not set 異常

[root@hadoop102 conf]# cd /opt/module/

[root@hadoop102 module]# scp -r spark-standlone/ hadoop103:/opt/module/spark-standlone

[root@hadoop102 module]# scp -r spark-standlone/ hadoop104:/opt/module/spark-standlone

[root@hadoop102 module]# cd /opt/module/spark-standlone/

[root@hadoop102 spark-standlone]# sbin/start-all.sh

[root@hadoop102 spark-standlone]# jps

2128 Worker

2183 Jps

2059 Master

 

[root@hadoop103 module]# jps

1739 Worker

1788 Jps

 

[root@hadoop104 module]# jps

1669 Worker

1718 Jps

    目前還看不到任何任務的執行信息。

Spark集群測試案例

[root@hadoop102 spark-standlone]# bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://hadoop102:7077 ./examples/jars/spark-examples_2.12-3.0.0.jar 10

參數:--master spark://hadoop102:7077指定要連接集群的master,如果不設置—master參數會默認使用本機,當遠程提交spark任務時必須要制定該參數才能正確的找到spark集群

頁面查看http://hadoop102:8080/,發現執行本次任務,默認采用三台服務器節點的總核數3核,每個節點內存1024M

配置Executor可用內存為2G,使用CPU核數為2

bin/spark-submit \

--class org.apache.spark.examples.SparkPi \

--master spark://hadoop102:7077 \

--executor-memory 2G \

--total-executor-cores 2 \

./examples/jars/spark-examples_2.12-3.0.0.jar \

10

Spark任務提交設置參數的基本語法

bin/spark-submit \

--class <main-class>

--master <master-url> \

... # other options

<application-jar> \

[application-arguments]

相關參數說明

參數

解釋

可選值舉例

--class

Spark程序中包含主函數的類

 

--master

Spark程序運行的模式

本地模式:local[*]spark://hadoop102:7077

Yarn

--executor-memory 1G

指定每個executor可用內存為1G

符合集群內存配置即可,具體情況具體分析。

--total-executor-cores 2

指定所有executor使用的cpu核數為2

application-jar

打包好的應用jar,包含依賴。這個URL在集群中全局可見。 比如hdfs:// 共享存儲系統,如果是file:// path,那么所有的節點的path都包含同樣的jar

application-arguments

傳給main()方法的參數

配置歷史服務

由於spark-shell停止掉后,hadoop102:4040頁面就看不到歷史任務的運行情況,所以開發時都配置歷史服務器記錄任務運行情況。

1)修改spark-default.conf.template名稱

cd spark-standlone/conf

mv spark-defaults.conf.template spark-defaults.conf

2)修改spark-default.conf文件,配置日志存儲路徑(寫),並同步到其他服務器上

vi spark-defaults.conf

修改一下內容

spark.eventLog.enabled true

spark.eventLog.dir hdfs://hadoop102:8020/directory

將修改后的文件同步到其他服務上

xsync spark-defaults.conf

3)修改spark-env.sh文件,:

vi spark-env.sh

添加如下配置

export SPARK_HISTORY_OPTS="

-Dspark.history.ui.port=18080

-Dspark.history.fs.logDirectory=hdfs://hadoop102:8020/directory

-Dspark.history.retainedApplications=30"

# 參數1 Dspark.history.ui.port:WEBUI訪問的端口號為18080

# 參數2 Dspark.history.fs.logDirectory:指定歷史服務器日志存儲路徑(讀)

# 參數3 Dspark.history.retainedApplications:指定保存Application歷史記錄的個數,如果超過這個值,舊的應用程序信息將被刪除,這個是內存中的應用數,而不是頁面上顯示的應用數。

4)同步配置文件

xsync spark-env.sh

啟動Hadoop集群,並在HDFS上創建/directory目錄。

sbin/start-dfs.sh

hadoop fs -mkdir /directory

5)啟動歷史服務

sbin/start-history-server.sh

6)再次執行任務

bin/spark-submit \

--class org.apache.spark.examples.SparkPi \

--master spark://hadoop102:7077 \

--executor-memory 1G \

--total-executor-cores 2 \

./examples/jars/spark-examples_2.12-3.0.0.jar \

10

7)查看Spark歷史服務地址:hadoop102:18080

配置高可用(HA)

停止集群

sbin/stop-all.sh

安裝Zookeeper集群並啟動:《Zookeeper詳解(02) - zookeeper安裝部署-單機模式-集群模式》

zk.sh start

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

vi spark-env.sh

 

#注釋掉如下內容:

#SPARK_MASTER_HOST=hadoop102

#SPARK_MASTER_PORT=7077

 

#添加如下內容。配置由Zookeeper管理Master

export SPARK_DAEMON_JAVA_OPTS="

-Dspark.deploy.recoveryMode=ZOOKEEPER

-Dspark.deploy.zookeeper.url=hadoop102,hadoop103,hadoop104

-Dspark.deploy.zookeeper.dir=/spark"

 

#添加如下代碼

#Zookeeper3.5的AdminServer默認端口是8080,和Spark的WebUI沖突

export SPARK_MASTER_WEBUI_PORT=8989

Zookeeper節點中自動創建/spark目錄,用於管理:

同步配置文件

xsync spark-env.sh

hadoop102上啟動spark的全部節點

sbin/start-all.sh

hadoop103上單獨啟動master節點

sbin/start-master.sh

再啟動一個hadoop102窗口,將/opt/module/spark-local/input中的測試數據上傳到hadoop集群的/input目錄

hadoop fs -put /opt/module/spark-local/input/ /input

Spark HA集群訪問

bin/spark-shell \

--master spark://hadoop102:7077,hadoop103:7077 \

--executor-memory 2g \

--total-executor-cores 2

參數:--master spark://hadoop102:7077指定要連接的集群的master

執行WordCount程序

scala>sc.textFile("hdfs://hadoop102:8020/input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

res0: Array[(String, Int)] = Array((hadoop,6), (oozie,3), (spark,3), (hive,3), (atguigu,3), (hbase,6))

使用jps命令查看hadoop102master進程

5506 Worker

5394 Master

5731 SparkSubmit

4869 QuorumPeerMain

5991 Jps

5831 CoarseGrainedExecutorBackend

Killhadoop102master進程,頁面中觀察http://hadoop103:8080/的狀態是否切換為active

kill -9 5394

再啟動hadoop102master進程

sbin/start-master.sh

運行模式

Spark有standalone-client(客戶端模式)和standalone-cluster(集群模式)兩種模式,主要區別在於:Driver程序的運行節點。

bin/spark-submit \

--class org.apache.spark.examples.SparkPi \

--master spark://hadoop102:7077 \

--executor-memory 2G \

--total-executor-cores 1 \

--deploy-mode client \

./examples/jars/spark-examples_2.12-3.0.0.jar \

10

--deploy-mode client,表示Driver程序運行在本地客戶端

bin/spark-submit \

--class org.apache.spark.examples.SparkPi \

--master spark://hadoop102:7077 \

--executor-memory 2G \

--total-executor-cores 1 \

--deploy-mode cluster \

./examples/jars/spark-examples_2.12-3.0.0.jar \

10

--deploy-mode cluster,表示Driver程序運行在集群

client用於測試,因為該模式的Driver運行在本地客戶端,會與yarn集群產生較大的網絡通信,從而導致網卡流量激增;它的好處在於直接執行時,在本地可以查看到所有的log,方便調試;

cluster用於生產環境,因為Driver運行在NodeManager,相當於一個ApplicationMaster,沒有網卡流量激增的問題;缺點在於調試不方便,本地用spark-submit提交后,看不到log,只能通過yarn application_id這種命令來查看,由於應用的運行結果不能在客戶端顯示,所以最好將那些將結果保存在外部存儲介質(如HDFSRedisMysql)而非stdout輸出的應用程序,客戶端的終端顯示的僅是job的簡單運行狀況。

由於cluster模式,客戶端的終端顯示的僅是簡單運行狀況,無法像client模式將所有的日志信息都顯示到客戶端的終端上,若要查看cluster模式下的運行日志信息,只能夠通過如下方式進行查看

http://192.168.194.102:8080/頁面點擊Completed Drivers里面的Worker

跳轉到Spark Worker頁面,點擊Finished DriversLogs下面的stdout

最終日志的打印結果如下

注意:在測試Standalone模式,cluster運行流程的時候,阿里雲用戶訪問不到Worker,因為Worker是從Master內部跳轉的,這是正常的,實際工作中我們不可能通過客戶端訪問的,這些端口對外都會禁用,需要的時候會通過授權到Master訪問Worker

Spark ON Yarn模式(重點)

Spark客戶端直接連接Yarn,不需要額外構建Spark集群。

安裝

[hadoop@hadoop102 software]$ tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module/

[hadoop@hadoop102 software]$ cd /opt/module/

[hadoop@hadoop102 module]$ mv spark-3.0.0-bin-hadoop3.2/ spark-yarn

如果使用的環境是虛擬機且內存較少,為防止執行過程進行被意外殺死,做如下配置

若是在生產環境或內存充足的情況下,則可以不添加該配置

vi 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/yarn-site.xml

[hadoop@hadoop102 conf]$ mv spark-env.sh.template spark-env.sh

[hadoop@hadoop102 conf]$ vi spark-env.sh

在文件末尾添加YARN_CONF_DIR配置,保證后續運行任務的路徑都變成集群路徑

YARN_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop

[hadoop@hadoop102 spark-yarn]$ bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn ./examples/jars/spark-examples_2.12-3.0.0.jar 10

參數:--master yarn,表示Yarn方式運行;--deploy-mod表示客戶端方式運行程序

如果運行的時候,拋出如下異常ClassNotFoundException:com.sun.jersey.api.client.config.ClientConfig

-原因分析:Spark2中jersey版本是2.22,但是yarn中還需要依賴1.9,版本不兼容

-解決方式:在yarn-site.xml中,添加

<property>

    <name>yarn.timeline-service.enabled</name>

    <value>false</value>

</property>

9)查看http://192.168.194.102:8088/頁面,點擊History,查看歷史頁面

spark-shell --master yarn --deploy-mode client

配置歷史服務

為了查看spark程序的歷史運行情況,需要配置一下歷史服務器。

[hadoop@hadoop102 conf]$ mv spark-defaults.conf.template spark-defaults.conf

[hadoop@hadoop102 conf]$ vi spark-defaults.conf

在文件末尾添加如下內容

spark.eventLog.enabled true

spark.eventLog.dir hdfs://hadoop102:9820/directory

[hadoop@hadoop102 conf]$ vi spark-env.sh

在文件末尾添加如下內容

export SPARK_HISTORY_OPTS="

-Dspark.history.ui.port=18080

-Dspark.history.fs.logDirectory=hdfs://hadoop102:9820/directory

-Dspark.history.retainedApplications=30"

# 參數1含義:WEBUI訪問的端口號為18080

# 參數2含義:指定歷史服務器日志存儲路徑

# 參數3含義:指定保存Application歷史記錄的個數,如果超過這個值,舊的應用程序信息將被刪除,這個是內存中的應用數,而不是頁面上顯示的應用數。

hadoop@hadoop102 conf]$ vi spark-defaults.conf

在文件末尾添加如下內容

spark.yarn.historyServer.address=hadoop102:18080

spark.history.ui.port=18080

[hadoop@hadoop102 conf]$ hadoop fs -mkdir /directory

啟動Spark歷史服務

[hadoop@hadoop102 spark-yarn]$ sbin/start-history-server.sh

停止命令:sbin/stop-history-server.sh

提交任務到Yarn執行

bin/spark-submit \

--class org.apache.spark.examples.SparkPi \

--master yarn \

./examples/jars/spark-examples_2.12-3.0.0.jar \

10

Web頁面查看日志:http://hadoop102:8088/cluster

spark任務執行成功后點擊"history"跳轉到http://hadoop102:18080/

 

Spark ON Yarn運行模式

Sparkyarn-client(客戶端模式)和yarn-cluster(集群模式)兩種模式,主要區別在於:Driver程序的運行節點。

yarn-clientDriver程序運行在客戶端,適用於交互、調試,希望立即看到spark程序的輸出結果。

yarn-clusterDriver程序運行在由ResourceManager啟動的APPMaster適用於生產環境。

集群模式下查看Spark任務輸出日志的方式

查看http://hadoop103:8088/cluster頁面,點擊History按鈕,跳轉到歷史詳情頁面

http://hadoop102:18080點擊Executors->點擊driver中的stdout

注意:如果在yarn日志端無法查看到具體的日志,則需要配置並啟動Yarn歷史服務器,具體配置流程請參考文章Hadoop詳解(02)Hadoop集群運行環境搭建》--配置歷史服務器(可選)章節

Windows模式(開發環境)

在自己學習時,每次都需要啟動虛擬機,啟動集群,這是一個比較繁瑣的過程,並且會占大量的電腦系統資源,導致系統執行變慢,不僅僅影響學習效果,也影響學習進度,Spark地提供了可以在windows系統下啟動本地集群的方式,這樣,在不使用虛擬機的情況下,也能使用Spark的基本功能。

將文件spark-3.0.0-bin-hadoop3.2.tgz解壓縮到無中文無空格的任意路徑下

雙擊執行解壓縮文件路徑下bin目錄中的spark-shell.cmd文件,啟動Spark本地環境

創建D:/input/word.txt文件並在文件中添加內容, 在命令行中輸入腳本代碼

scala> sc.textFile("D:/input/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

res0: Array[(String, Int)] = Array((hello,2), (spark,1), (hadoop,1))

如果出現如下錯誤

Exception in thread "Thread-16" java.io.FileNotFoundException: C:\Users\Administrator\.scala_history (拒絕訪問。)

則需要在啟動spark-shell.cmd腳本的時候使用以管理員身份運行

在spark安裝目錄的bin目錄下,按Shift右鍵空白處,選擇 在此處打開Powershell窗口

在DOS命令行窗口中執行提交指令

在打開的DOS命令行窗口中執行提交命令

PS D:\ruanjian\spark-3.0.0-bin-hadoop3.2\bin> ./spark-submit --class org.apache.spark.examples.SparkPi --master local[2] ../examples/jars/spark-examples_2.12-3.0.0.jar 10

Mesos & K8S模式(了解)

MesosApache下的開源分布式資源管理框架,它被稱為是分布式系統的內核,Twitter得到廣泛使用,管理着Twitter超過30,0000台服務器上的應用部署,但是在國內使用Mesos框架的並不多,原理其實都差不多,使用Spark客戶端直接連接Mesos,不需要額外構建Spark集群。

容器化部署是目前業界很流行的一項技術,基於Docker鏡像運行能夠讓用戶更加方便地對應用進行管理和運維。容器管理工具中最為流行的就是Kubernetesk8s),而Spark也在最近的版本中支持了k8s部署模式。官方使用文檔地址:https://spark.apache.org/docs/latest/running-on-kubernetes.html

幾種部署模式對比

模式

Spark安裝機器數

需啟動的進程

所屬者

Local

1

Spark

Standalone

3

MasterWorker

Spark

Yarn

1

YarnHDFS

Hadoop

端口號總結

1Spark查看當前Spark-shell運行任務情況端口號:4040

2Spark Master內部通信服務端口號:7077    (類比於Hadoop9820端口)

3Spark Standalone模式Master Web端口號:8080(類比於Hadoop YARN任務運行情況查看端口號:8088

4Spark歷史服務器端口號:18080(類比於Hadoop歷史服務器端口號:19888

其他常用端口匯總

50070:HDFSwebUI的端口號

8485:journalnode默認的端口號

9000:非高可用訪問數rpc端口

8020:高可用訪問數據rpc

8088:yarn的webUI的端口號

8080:master的webUI,Tomcat的端口號

7077:spark基於standalone的提交任務的端口號

8081:worker的webUI的端口號

18080:historyServer的webUI的端口號

4040:application的webUI的端口號

2181:zookeeper的rpc端口號

9083:hive的metastore的端口號

60010:Hbase的webUI的端口號

6379:Redis的端口號

8080:sparkwebUI的端口號

9092:kafka broker的端口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM