@
Spark 官網 https://spark.apache.org/
Spark 官網最新檔案檔案 https://spark.apache.org/docs/latest/
Spark GitHub原始碼地址 https://github.com/search?q=spark
Apache Spark™是一個開源的、分散式、多語言引擎,用於在單節點機器或叢集上執行資料工程、資料科學和機器學習,用於大規模資料分析的統一引擎。目前最新版本為3.3.0
spark是借鑑了Mapreduce,並在其基礎上發展起來的,繼承了其分散式計算的優點並進行了改進,spark生態更為豐富,功能更為強大,效能更加適用範圍廣,mapreduce更簡單,穩定性好。主要區別:
Spark官網對其特點高度概括的四個單詞分為為:Simple-簡單、Fast-快、Scalable-可延伸、Unified-統一。
Spark關鍵特性包括:
Spark應用程式在叢集中作為獨立的程序集執行,由主程式(稱為驅動程式)中的SparkContext物件協調。
Application | 基於Spark構建的使用者程式。由叢集上的驅動程式和執行程式組成。 |
---|---|
Application jar | 使用者的Spark應用程式Jar,包含他們的應用程式及其依賴項。使用者的jar包不應該包含Hadoop或Spark庫(這些庫會在執行時新增)。 |
Driver program | 執行應用程式main()函數並建立SparkContext的程序 |
Cluster manager | 獲取叢集資源的外部服務(例如standalone manager, Mesos, YARN, Kubernetes) |
Deploy mode | 區分驅動程序執行的位置。在「叢集」模式下,框架在叢集內部啟動驅動程式。在「使用者端」模式下,提交者在叢集外啟動驅動程式。 |
Worker node | 可以在叢集中執行應用程式程式碼的任何節點 |
Executor | 在工作節點上為應用程式啟動的程序,它執行任務並跨任務將資料儲存在記憶體或磁碟儲存中。每個應用程式都有自己的執行器。 |
Task | 將被傳送到一個執行程式的工作單元 |
Job | 由多個任務組成的平行計算,這些任務響應Spark操作(例如 save , collect ) |
Stage | 每個任務被分成更小的任務集,稱為相互依賴的階段(類似於MapReduce中的map和reduce階段); |
Spark作為一個資料處理框架和計算引擎,被設計在所有常見的叢集環境中執行, 在國內工作中主流的環境為Yarn,不過逐漸容器式環境也慢慢流行起來。
容器式環境:發現叢集規模不足夠,會自動化生成所需要的環境,不需要多餘叢集機器時,也會自動刪除。
Spark執行環境 = Java環境(JVM) + 叢集環境(Yarn) + Spark環境(lib)
[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-WJRyiUk1-1662907653703)(http://www.itxiaoshen.com:3001/assets/1662907244159WcYf6J10.png)]
Spark既可以單獨執行,也可以通過多個現有的叢集管理器執行。目前它提供了幾種部署選項
由於前面的文章已經搭建過Hadoop,環境預準備條件是類似,比如至少3臺機器的互通互聯、免密登入、時間同步、JDK如1.8版本安裝,這裡就不再說明了。
所謂的Local模式,就是不需要其他任何節點資源就可以在本地執行Spark程式碼的環境
# 下載最新版本3.3.0
wget --no-check-certificate https://dlcdn.apache.org/spark/spark-3.3.0/spark-3.3.0-bin-hadoop3.tgz
# 解壓
tar -xvf spark-3.3.0-bin-hadoop3.tgz
# 拷貝一個部署spark-local目錄
spark-3.3.0-bin-hadoop3 spark-local
spark檔案目錄說明
# 提交應用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
./examples/jars/spark-examples_2.12-3.3.0.jar \
10
引數說明:
Spark自身節點執行的叢集模式,也就是我們所謂的獨立部署(Standalone)模式,Spark的Standalone模式體現了經典的master-slave模式。
# 拷貝一個部署spark-standalone目錄
cp -r spark-3.3.0-bin-hadoop3 spark-standalone
# 進入目錄
cd spark-standalone/
cd conf
# 準備workers組態檔
mv workers.template workers
# 修改workers內容為
vi workers
hadoop1
hadoop2
hadoop3
# 準備spark-env.sh組態檔
mv spark-env.sh.template spark-env.sh
# spark-env.sh新增如下內容
vi spark-env.s
export JAVA_HOME=/home/commons/jdk8
SPARK_MASTER_HOST=hadoop1
SPARK_MASTER_PORT=7077
# 分發到其他兩臺上
scp -r /home/commons/spark-standalone hadoop2:/home/commons/
scp -r /home/commons/spark-standalone hadoop3:/home/commons/
# 進入根目錄下sbin執行目錄和啟動
cd sbin/
./start-all.sh
當前機器有Master和Worker程序,而另外其他兩臺上有worker程序
存取WebUi頁面:http://hadoop1:8080/ ,如果8080埠有其他服務使用,可以存取8081埠也能正常存取到當前這個Master的頁面(預設8081是Worker的)
由於spark-shell 停止掉後,叢集監控頁面就看不到歷史任務的執行情況,所以開發時都設定歷史伺服器記錄任務執行情況。
# 先停止前面啟動的叢集
./stop-all.sh
# 準備spark-defaults.conf
cd ../conf
mv spark-defaults.conf.template spark-defaults.conf
# 修改spark-defaults.conf
vim spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://myns:8020/sparkhis
# 需要啟動Hadoop叢集,HDFS上的目錄需要提前存在
hadoop fs -mkdir /sparkhis
# 修改spark-env.sh檔案,新增如下設定:
vi spark-env.sh
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://myns:8020/sparkhis
-Dspark.history.retainedApplications=30"
# 引數1含義:WEBUI存取的埠號為18080
# 引數2含義:指定歷史伺服器紀錄檔儲存路徑(讀)
# 引數3含義:指定儲存Application歷史記錄的個數,如果超過這個值,舊的應用程式資訊將被刪除,這個是記憶體中的應用數,而不是頁面上顯示的應用數。
由於hadoop是HA模式因此設定為hdfs-site.xml下的dfs.nameservices的value值
<property>
<name>dfs.nameservices</name>
<value>myns</value> <!--core-site.xml的fs.defaultFS使用該屬性值-->
</property>
# 分發設定到另外兩臺上
scp spark-defaults.conf spark-env.sh hadoop2:/home/commons/spark-standalone/conf/
scp spark-defaults.conf spark-env.sh hadoop3:/home/commons/spark-standalone/conf/
# 啟動叢集
./start-all.sh
# 啟動歷史服務
./start-history-server.sh
存取歷史服務的WebUI地址,http://hadoop1:18080/
所謂的高可用是因為當前叢集中的 Master 節點只有一個,所以會存在單點故障問題。所以為了解決單點故障問題,需要在叢集中設定多個 Master 節點,一旦處於活動狀態的 Master發生故障時,由備用 Master 提供服務,保證作業可以繼續執行。這裡的高可用一般採用Zookeeper 設定。這裡使用前面搭建Zookeeper 。
# 停止叢集
./stop-all.sh
# 停止歷史服務
./stop-history-server.sh
# 修改Spark中的 spark-env.sh 檔案,修改如下設定
# 註釋如下內容
#SPARK_MASTER_HOST=hadoop1
#SPARK_MASTER_PORT=7077
# 新增如下內容
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=zk1,zk2,zk3
-Dspark.deploy.zookeeper.dir=/spark"
# 分發設定到另外兩臺上
scp spark-env.sh hadoop2:/home/commons/spark-standalone/conf/
scp spark-env.sh hadoop3:/home/commons/spark-standalone/conf/
# 啟動叢集
./start-all.sh
# 在另外伺服器如hadoop2上啟動master
./start-master.sh
hadoop1的master為ALIVE狀態
hadoop2的master為STANDBY狀態
[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-NVmFWDEw-1662907653726)(http://www.itxiaoshen.com:3001/assets/1662907298952BdHwc0Bh.png)]
提交應用到高可用叢集,注意提交master要填寫多個master地址
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop1:7077,hadoop2:7077 \
./examples/jars/spark-examples_2.12-3.3.0.jar \
10
# 停止mALIVE狀態hadoop1的master
./stop-master.sh
hadoop2的master由原來的STANDBY狀態轉變為ALIVE狀態,實現高可用的切換
[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-GqM7w3Qz-1662907653730)(http://www.itxiaoshen.com:3001/assets/1662907304666dPiztcT6.png)]
# --deploy-mode client 可以省略,預設為client
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop1:7077,hadoop2:7077 \
--deploy-mode client \
./examples/jars/spark-examples_2.12-3.3.0.jar \
10
# 其他引數提交應用
bin/spark-submit \
--master spark://hadoop1:7077 \
--class org.apache.spark.examples.SparkPi \
--driver-memory 500m \
--driver-cores 1 \
--executor-memory 800m \
--executor-cores 1 \
./examples/jars/spark-examples_2.12-3.3.0.jar \
10
引數說明:
檢視WebUI後可以看到剛剛提交的任務app-20220911213322-0000資訊
執行任務時,會產生多個Java程序(用於計算)執行完成就會釋放掉。其中Master和Worker是資源,預設採用伺服器叢集節點的總核數,每個節點記憶體1024M。
當在使用者端提交多個Spark application時,每個application都會啟動一個Driver。lient 模式適用於測試偵錯程式。Driver 程序是在使用者端啟動的,這裡的客 戶端就是指提交應用程式的當前節點。在 Driver 端可以看到 task 執行的情 況。生產環境下不能使用 client 模式,是因為:假設要提交 100 個,application 到叢集執行,Driver 每次都會在 client 端啟動,那麼就會導致 使用者端 100 次網路卡流量暴增的問題。client 模式適用於程式測試,不適用 於生產環境,在使用者端可以看到 task 的執行和結果
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop1:7077,hadoop2:7077 \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.3.0.jar \
10
Driver 程序是在叢集某一臺 Worker 上啟動的,在使用者端是無法檢視 task 的執行情況的。假設要提交 100 個 application 到叢集執行,每次 Driver 會 隨機在叢集中某一臺 Worker 上啟動,那麼這 100 次網路卡流量暴增的問題 就散佈在叢集上。
獨立部署(Standalone)模式由Spark自身提供計算資源,無需其他框架提供資源。這種方式降低了和其他第三方資源框架的耦合性,獨立性非常強。但是也要記住,Spark主要是計算框架,而不是資源排程框架,所以本身提供的資源排程並不是它的強項,所以還是和其他專業的資源排程框架整合會更靠譜一些。所以接下來需要學習在強大的Yarn環境下Spark是如何工作的(其實是因為在國內工作中,Yarn使用的非常多)。
# 重新拷貝一個目錄
cp -r spark-3.3.0-bin-hadoop3 spark-yarn
# 修改hadoop組態檔/home/commons/hadoop/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>
# yarn-site.xml並分發到其他兩臺機器
scp /home/commons/hadoop/etc/hadoop/yarn-site.xml hadoop2:/home/commons/hadoop/etc/hadoop/
scp /home/commons/hadoop/etc/hadoop/yarn-site.xml hadoop3:/home/commons/hadoop/etc/hadoop/
# 重啟Hadoop
cd /home/commons/hadoop/sbin
./stop-all.sh
./start-all.sh
# 修改conf目錄三個組態檔,跟前面的類似稍微修改
mv workers.template workers
# 修改workers內容為
vi workers
hadoop1
hadoop2
hadoop3
# 準備spark-env.sh組態檔
mv spark-env.sh.template spark-env.sh
# 增加下面設定
vi spark-env.sh
export JAVA_HOME=/home/commons/jdk8
HADOOP_CONF_DIR=/home/commons/hadoop/etc/hadoop
YARN_CONF_DIR=/home/commons/hadoop/etc/hadoop
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://myns:8020/sparkhis
-Dspark.history.retainedApplications=30"
# 修改spark-defaults.conf.template檔名為spark-defaults.conf
mv spark-defaults.conf.template spark-defaults.conf
# 修改spark-default.conf檔案,設定紀錄檔儲存路徑
spark.eventLog.enabled true
spark.eventLog.dir hdfs://myns:8020/sparkhis
spark.yarn.historyServer.address=hadoop1:18080
spark.history.ui.port=18080
# 啟動歷史服務
sbin/start-history-server.sh
提交yarn client任務
bin/spark-submit \
--master yarn \
--deploy-mode client \
--class org.apache.spark.examples.SparkPi \
--driver-memory 600m \
--driver-cores 1 \
--executor-memory 800m \
--executor-cores 2 \
./examples/jars/spark-examples_2.12-3.3.0.jar \
100
檢視yarn的頁面:http://hadoop1:8088/cluster 有剛才提交的應用application_1662905714420_0001為狀態成功且已完成
bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--class org.apache.spark.examples.SparkPi \
--driver-memory 600m \
--driver-cores 1 \
--executor-memory 800m \
--executor-cores 2 \
./examples/jars/spark-examples_2.12-3.3.0.jar \
100
檢視yarn的頁面:http://hadoop1:8088/cluster 有剛才提交的應用application_1662905714420_0002為狀態成功且已完成
在Spark Shell中,已經在名為sc的變數中為您建立了一個特殊的SparkContext,如果您自己建立SparkContext會不生效。您可以使用--master
引數設定SparkContext連線到哪個主節點,並且可以通過--jars
引數來設定新增到CLASSPATH的JAR包,多個JAR包時使用逗號(,)分隔。更多引數資訊,您可以通過命令./bin/spark-shell --help
獲取。
bin/spark-shell
# 啟動成功後,可以輸入網址進行Web UI監控頁面存取
# http://虛擬機器器地址:4040
# 在解壓縮資料夾下的data目錄中,新增word.txt檔案。在命令列工具中執行如下程式碼指令(和IDEA中程式碼簡化版一致)
sc.textFile("data/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
# 退出本地模式,儘量用命令退出
:quit
bin/spark-shell \
--master spark://hadoop1:7077
bin/spark-shell \
--master yarn
**本人部落格網站 **IT小神 www.itxiaoshen.com