從零開始認識 Spark

說出你的願望吧發表於2020-02-08

前言

Spark的知識點很多,決定分多P來慢慢講?,比較關鍵的RDD運算元其實已經寫了大半,奈何內容還是太多了就不和這篇扯皮的放一起了。

老套路,我們點開官網來see see先吧

把這句話翻譯一下

spark是在Hadoop基礎上的改進,是 UC Berkeley AMP lab 所開源的類 Hadoop MapReduce 的通用的平行計算框架,Spark 基於 mapReduce 演算法實現的分散式計算,它擁有 Hadoop MapReduce 所具有的優點。

但不同於MapReduce的是Job中間輸出和結果可以儲存在記憶體中,從而不再需要讀寫 HDFS,因此Spark能更好地適用於資料探勘與機器學習等需要迭代的mapReduce的演算法。但是它僅僅只是涉及到計算,並沒有涉及到資料的儲存,後期需要使用spark對接外部的資料來源,比如 Hadoop 中的 HDFS。

一、Spark 基礎

1.1 Spark 的四大特性

其實就是官網主頁以下的內容

1.1.1 速度快

把內容丟到百度翻譯中去

先不管什麼DAG排程,查詢優化···等等諸如此類的專業術語,就看那張柱形圖那個百來倍速度我們就知道它很快就是了,MapReduce 需要 110s 的事情它 0.9s 就完成了

1.1.2 Spark 為啥比 MapReduce 快這麼多

大概可以分為兩個方面

1.基於記憶體:mapreduce任務在計算的時候,每一個job的輸出結果會落地到磁碟,後續有其他的job需要依賴於前面job的輸出結果,這個時候就需要進行大量的磁碟io操作,效能就比較低。而spark任務在計算的時候,job的輸出結果可以儲存在記憶體中,後續有其他的job需要依賴於前面job的輸出結果,這個時候就直接從記憶體中獲取,避免了磁碟io操作,所以效能就得以提升。

2.程式與執行緒方面:mapreduce任務以程式的方式執行在yarn叢集中,比如程式中有100個MapTask,一個task就需要一個程式,這些task要執行就需要開啟100個程式。

spark任務以執行緒的方式執行在程式中,比如程式中有100個MapTask,後期一個task就對應一個執行緒,這裡就不在是程式,這些task需要執行,這裡如果極端一點:只需要開啟1個程式,在這個程式中啟動100個執行緒就可以了。程式中可以啟動很多個執行緒,而開啟一個程式與開啟一個執行緒需要的時間和排程代價是不一樣。開啟一個程式需要的時間遠遠大於開啟一個執行緒。

1.1.3 易用性


這個就沒有啥好展開的了,就是可以通過 java/scala/python/R/SQL 等不同語言快速去編寫 spark 程式

1.1.4 通用性


其實可以理解為 Spark 已經形成了自己的一個生態,其內部包含了許多模組

SparkSQL:通過sql去做離線分析
SparkStreaming:解決實時計算用的
Mlib:機器學習的演算法庫
Graphx:圖計算方面的
複製程式碼

1.1.5 相容性


spark程式就是一個計算邏輯程式,這個任務要執行就需要計算資源(記憶體、cpu、磁碟),哪裡可以給當前這個任務提供計算資源,就可以把spark程式提交到哪裡去執行

1.2 Spark 的架構

1.2.1 Driver

它會執行客戶端寫好的main方法,它會構建一個名叫 SparkContext 物件。該物件 是所有spark程式的執行入口

1.2.2 Cluster Manager

給 Spark 程式提供外部計算資源的服務,一般來說有以下3種

  1. standAlone:Spark 自帶的叢集模式,整個任務的資源分配由 Spark 叢集的老大 master 負責
  2. Yarn:可以把 Spark 提交到 Yarn 中執行,此時資源分配由 Yarn 中的老大 ResourceManager 負責
  3. mesos:Apache開源的一個類似於 Yarn 的資源排程平臺

正常來說我們都會使用 Yarn 去進行管理

1.2.3 Worker Node

Master是整個spark叢集的老大,負責任務資源的分配。也就是 Spark 叢集中負責幹活的小弟,是負責任務計算的節點

1.2.4 Executor

Executor 是一個程式,它會在worker節點啟動該程式(計算資源)

1.2.5 Task

spark任務是以task執行緒的方式執行在worker節點對應的executor程式中

1.3 Spark 的安裝部署

一筆帶過。簡單點來說就是下好安裝包丟到伺服器,解壓下來去到conf資料夾 vim spark-env.sh,配一下 Java 的環境變數和 zookeeper,然後 vim slaves 去配置 worker 節點。然後修改 Spark 的環境變數並且分發到 worker 中,然後 source /etc/profile 即可。

需要注意的是我們一般為了 Spark 叢集的高可用會有多個master(Hadoop HA的套路),一般來說會這樣配置

#配置zk相關資訊
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER  
-Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181  
-Dspark.deploy.zookeeper.dir=/spark"

複製程式碼

上面其實就是 -D 然後帶上3個引數,引數和引數之間用空格隔開即可

spark.deploy.recoveryMode 是高可用方案依賴於zookeeper進行恢復,第二個 spark.deploy.zookeeper.url 指定了zookeeper的地址,第三個 spark.deploy.zookeeper.dir 是指這個zookeeper節點負責接收 Spark 產生的後設資料(目錄就是一個字串)

1.4 spark叢集的啟動和停止

先啟動zk再啟動spark叢集

可以在任意一臺伺服器來執行(條件:需要任意2臺機器之間實現ssh免密登入)
$SPARK_HOME/sbin/start-all.sh
在哪裡啟動這個指令碼,就在當前該機器啟動一個Master程式

整個叢集的worker程式的啟動由slaves檔案控制

後期可以在其他機器單獨再啟動master
$SPARK_HOME/sbin/start-master.sh
複製程式碼

如果部署成功,是可以通過

http://master主機名:8080 
複製程式碼

來訪問一個web介面的,各種各樣的叢集資訊都能看得到,大致包括

 整個spark叢集的詳細資訊
 整個spark叢集總的資源資訊
 整個spark叢集已經使用的資源資訊
 整個spark叢集還剩的資源資訊
 整個spark叢集正在執行的任務資訊
 整個spark叢集已經完成的任務資訊
複製程式碼

補充一句,備用的master節點的話,status 的值就會是 standby

上面的資訊英文都不難理解,這裡就不一一說明了。

1.5 如何恢復到上一次活著master掛掉之前的狀態?

在高可用模式下,整個spark叢集就有很多個master,其中只有一個master被zk選舉成活著的master,其他的多個master都處於standby,同時把整個spark叢集的後設資料資訊通過zk中節點進行儲存。

後期如果活著的master掛掉。首先zk會感知到alive的master掛掉,下面開始在多個處於standby中的master進行選舉,再次產生一個alive的master,這個alive的master會 讀取儲存在zk節點中的spark叢集後設資料資訊 ,恢復到上一次master的狀態。整個過程在恢復的時候經歷過了很多個不同的階段,每個階段都需要一定時間,最終恢復到上個alive的master的轉態,整個恢復過程一般需要1-2分鐘。

1.6 在master的恢復階段對任務的影響?

  1. 對已經執行的任務是沒有任何影響。由於該任務正在執行,說明它 已經拿到了計算資源,這個時候就不需要master
  2. 對即將要提交的任務是有影響。由於該任務需要有計算資源,這個時候會找活著的master去申請計算資源,由於沒有一個活著的master,該任務是 獲取不到計算資源,也就是任務無法執行

1.7 Spark程式的提交

1.7.1 普通模式下

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node1:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.3.3.jar \
10
複製程式碼

引數說明:

--class:指定包含main方法的主類

--master:指定spark叢集master地址

--executor-memory:指定任務在執行的時候需要的每一個executor記憶體大小

--total-executor-cores: 指定任務在執行的時候需要總的cpu核數

1.7.2 高可用模式提交 (叢集有多個master)

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node1:7077,node2:7077,node3:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.3.3.jar \
10
複製程式碼

其實沒有太多的變化。spark叢集中有很多個master,並不知道哪一個master是活著的master,即使你知道哪一個master是活著的master,它也有可能下一秒就掛掉,這裡就可以把所有master都羅列出來

--master spark://node1:7077,node2:7077,node3:7077
複製程式碼

後期程式會輪詢整個master列表,最終找到活著的master,然後向它申請計算資源,最後執行程式。

1.8 Spark-shell

···

finally

本來也是打算寫一個scala的,但是想到這東西也不算難,而且大家也可以通過各類的搜尋引擎去學習,所以就丟到草稿裡面了(其實就是懶了沒寫完?)

這篇其實只是一個概念入門,下一篇我們開始扯 RDD 。有興趣的朋友可持續關注哦!公眾號:說出你的願望吧

相關文章