從零開始認識 Spark

前言

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 。有興趣的朋友可持續關注哦

發佈了12 篇原創文章 · 獲贊 26 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章