spark必知必會的基本概念
首先我們從巨集觀的視角來窺視下大資料技術框架:
圖1 大資料技術框架
從圖1可以看出,資料來源-資料收集-資料儲存-資源管理,這是我們進行資料分析和處理的基本;圖中的計算框架包括批處理、互動式分析和流處理:
批處理計算:對時間沒有嚴格要求,吞吐率要高
互動式計算:支援類SQL語言,快速進行資料分析
流式計算:資料像流水一樣進入系統,需實時對其處理和分析
不同的計算框架的實時性要求是逐漸增強的,spark在整個大資料技術框架中屬於第4層計算框架,spark能很好地滿足這三種計算要求,這也是spark這麼火的原因之一;對資料進行計算後,我們便可以對資料進行分析,訓練機器學習模型等;將資料分析或訓練得到的結果視覺化並展示給使用者或者提供一些智慧服務,從而獲取商業價值。
spark 生態系統
圖2 spark 生態系統
spark資料一般放在分散式儲存系統裡,比如HDFS、Hbase
HDFS的基本原理是將檔案切分成等大的資料塊(block,預設128MB),儲存到多臺機器上,這是一個容量巨大、具有高容錯性的磁碟。通常的架構是一個NameNode(存放元資料)多個DataNode,為了防止namenode宕機,有一個備用的NameNode:Standby NameNode。
圖3 HDFS架構
spark的資管管理與排程使用YARN,spark可以執行在YARN之上,YARN可以對多種型別的應用程式進行統一管理和排程,spark四個主要模組:spark SQL,Spark Streaming,Graphx Graph-parallel,MLlib。
spark的出現時為了解決MapReduce框架的侷限性,但並不是在任何情況下,spark都比MapReduce高效。
MapReduce框架侷限性
僅支援Map和Reduce兩種操作,而spark支援豐富的Transformation和Action的api
處理效率低效
當一個計算邏輯很複雜的時候,會轉換成多個MapReduce作業,而每個MapReduce作業都反覆對磁碟進行讀寫,磁碟IO是個非常耗時的操作:Map的中間結果寫入磁碟,Reduce寫HDFS,多個MR之間通過讀取HDFS來交換資料(**為什麼要用磁碟呢?**MapReduce提出來大約是04年的時候,那個時候記憶體還很貴,所以需要大量儲存空間的一個較好的解放方案就是使用磁碟,但現在記憶體的價格和當年磁碟的價格差不多,而磁碟的價格已經和磁帶的價格差不多了)
任務排程和啟動開銷大
無法充分利用記憶體
Map端和Reduce端均需要排序
不適合迭代計算(如機器學習、圖計算等),互動式處理(資料探勘) 和流式處理(點選日誌分析)
MapReduce程式設計不夠靈活,是時候嘗試scala函數語言程式設計語言
而且大資料計算框架多樣,各自為戰:
批處理:MapReduce、Hive、Pig
流式計算:Storm
互動式計算:Impala
而spark可同時進行批處理、流 式計算、互動式計算,減少了使用者的學習成本。
spark特點
高效(比MapReduce快10~100倍)
記憶體計算引擎,提供Cache機制來支援需要反覆迭代計算或者多次資料共享,減少資料讀取的IO開銷,值得注意的是,spark並不是將所有的資料都寫入記憶體,相反spark預設是將資料寫入磁碟,但spark支援將資料寫入記憶體並計算。
使用DAG(有向無環圖)引擎,可以減少多次計算之間中間結果寫到HDFS的開銷
使用多執行緒池模型來減少task啟動開稍,shuffle過程中避免 不必要的sort操作以及減少磁碟IO操作
易用
提供了豐富的API,支援Java,Scala,Python和R四種語言
程式碼量比MapReduce少2~5倍
與Hadoop完美整合
可讀寫HDFS/Hbase
可與YARN整合
Spark核心概念
RDD:Resilient Distributed Datasets,彈性分散式資料集,與Java裡的集合類似,但它多了兩個字首修飾詞:分散式、彈性
分散式:使用者看到的是一個RDD集合,但是後臺是分佈在叢集中不同的只讀物件集合(由多個Partition構成)
彈性:資料可以儲存在磁碟或記憶體中(多種儲存級別)
圖4 RDD
RDD的兩類基本操作:Transformation和Action
Transformation:通過Scala集合或者Hadoop資料集構造一個新的RDD,通過已有的RDD產生新的RDD,比如:map, filter,groupBy,reduceBy。Transformation是惰性執行的,即只會記錄RDD轉化關係,並不會觸發實際計算,知道遇到一個action才會觸發。
Action:通過RDD計算得到一個或者一組值,比如:count,reduce,saveAsTextFile。Action會觸發程式分散式執行
圖5 RDD 惰性執⾏行
Spark RDD Cache
通過上面我們可以知道,spark的主要特點:高效是由於使用了Cache機制來進行迭代計算,同時RDD的彈性也是因為資料可選擇是存放在記憶體還是磁碟中,spark RDD cache允許將RDD快取到記憶體中或磁碟上,以便於重用:
val data = sc.textFile(“hdfs://nn:8020/input”)
data.cache() //實際上是data.persist(StorageLevel.MEMORY_ONLY)
//data.persist(StorageLevel.DISK_ONLY_2)
spark 程式架構
我們來分析下一個spark程式的架構,每一個程式的main函式執行起來都由兩類元件構成:Driver和Executor,main函式執行在Driver中,一個Driver可以轉化為多個Task,每個Task都可被排程執行在指定的Executor中。
圖6 spark 程式架構
spark的執行模式
spark的執行模式有三種,可以在$SPARK_HOME/conf/spark-defaults.conf中使用spark.master來指定:
local(本地模式):將Spark應用以多執行緒方式,直接執行在本地,便於除錯
local:只啟動一個executor
local[K]:啟動K個executor
local[*]:啟動跟cpu數目相同的executor
standalone(獨立模式):獨立執行在一個叢集中,Master-Slave
YARN/mesos:執行在資源管理系統上
yarn-client:Driver執行在本地,而Executor執行在YARN,Driver一旦宕機,需要自己重啟,容錯差
yarn-cluster:Driver執行在叢集中(NodeManager),Driver一旦宕機,會自動再找一個NodeManager來啟動,容錯好
yarn-client內部處理邏輯
yarn-client模式下,Driver是執行在Client上的,spark程式是在哪臺機器上提交的,這個Driver就執行在哪臺機器上,也就是main函式執行在哪臺機器上,當提交你的程式到yarn上時,背後發生了什麼?
假設現在有四個伺服器組成的yarn叢集,一個為Resource Manager,其餘三個為Node Manager,當Node Manager啟動的時候會將Node Manager上的資訊註冊到Resource Manager中,在本地部署好hadoop環境之後即可提交spark程式(1),Resource Manager會啟動一個Node Manager(2);再由Node Manager來啟動你的Application Master(3);Application Master需要的資源是由你執行的程式所指定的,Application Master啟動後會與Resource Manager通訊,為executor申請資源(4),如果一個executor掛了,Application Master會重新向Resource Manager申請一個executor並啟動在某個Node Manager上,那麼如果是Node Manager掛了,Application Master會向Resource Manager申請相同數量的executor並啟動;executor擁有資源後,Application Master會與Node Manager通訊來啟動executor(5、6),每個executor與在客戶端Client上的Driver通訊領取task(虛線部分)
圖6 程式執行模式:YARN分散式模式(yarn-client)
Resource Manager:一箇中心的管理服務,決定了哪些應用可以啟動executor程序,以及何時何地啟動
Node Manager:一個在每個節點執行的從服務,真正執行啟動executor程序,同時監控程序是否存活以及資源消耗情況
Application Master:在 YARN 中,每個應用都有一個 Application master 程序,這是啟動應用的第一個容器。這個程序負責向 ResourceManager 請求資源,當資源分配完成之後,向 NodeManager 傳送啟動容器的指令。