淺析 MapReduce/ Spark/ Spark Steaming/ Storm 與 HBase/HDFS
MapReduce 是大的批量操作,不要求時限。基於檔案系統,hdfs。
Spark 是快速的批量操作,基於記憶體,所以速度快。其主要亮點在於把過程給資料。
Storm是流式處理,快速實時。
Spark Streaming 跟Storm類似,只不過Spark Streaming是小時間視窗的處理,Storm是實時的來一條處理一條。
1. storm技術架構:
Flume + kafka + Storm / Spark + Hbase / Redis的技術架構。
storm:流程: 把topology有向無環圖分發到各個節點,資料到來時直接送到節點實時處理,處理期間以spout進入,經過多個bolt的處理過程,這個過程是以bult形式。最終寫入HBase。
2. spark 技術架構:
spark邏輯:
把spark任務根據依賴度分成RDD,然後分成stage,再分成task,通過master把task分給worker,worker啟動程序executor,executor啟動多個執行緒去執行task。
建立RDD,建立執行計劃,排程任務。
建立RDD就是把存在於檔案的資料調入記憶體然後組織成RDD形式。
然後根據提交的任務(程式)把整個任務拆分成幾個階段(stage例如,先做RDD;然後做map操作也就是找出 一樣的;最後對鍵相同的的做統計,這就是三個階段),
最後就可以把這些任務分成task分配到不同的節點去執行了。
Spark Streaming技術架構:
和storm相似但有一個時間滑動視窗,即先彙集資料,到達一定量後按照資料塊進行分發。
Spark Streaming流程:
總結:
spark與storm的業務目標有相似都有追求高效,但技術的架構spark與hadoop相似;都是準備好資料後把任務分配到資料上。
storm是現分佈化任務然後等資料,spark是現分佈化資料然後等任務。
spark和storm都支援DAG,所以應對複雜性運算還好。但MapReduce在應對複雜性上只能多次MapReduce,效率就不行了。
3.hadoop技術架構:
hadoop是以MapReduce計算模型為核心,包括HDFS檔案儲存系統和HBase資料庫的一個架構。
MapReduce技術架構:
map作業 + map對映函式 和 reduce作業 + reduce合併函式
MapReduce處理流程:
外界傳來一個數據檔案,比如是txt格式,這個txt檔案首先被MapReduce庫切分成M個小檔案(粒度大約16M-64M),切分後會把這些檔案分佈化到HDFS中;然後用fork把使用者程序拷貝到叢集內其他機器上。
(使用者程序user program的副本中會有一個master,其它都是workermaster負責排程併為空閒worker分配作業也就是map作業和reduce作業,worker的數量可以由使用者指定)
被分配了map作業的worker,開始讀取對應分片的輸入資料,map作業數量由M決定,和split一一對應,map作業從輸入資料中抽取出鍵值對,每一個鍵值對都作為引數傳遞給 map函式,map函式產生的中間鍵值對被快取在記憶體中。
快取的中間鍵值對會被定期寫入本地磁碟,而且被分為R個分割槽,R的大小由使用者定義,將來每個分割槽會對應一個Reduce作業;這些中間鍵值對的位置會通報給master,master負責將資訊轉發給reduce worker。
master通知分配了reduce作業的worker它負責的分割槽在什麼位置,不止一個地方,因為每個map作業產生的中間鍵值對都可能對映到所有R個不同分割槽,當reduce worker把所有它負責的中間鍵值對都讀過來後,先對他們進行排序,使得相同鍵的鍵值對聚集在一起,因為不同的鍵可能會對映到同一個分割槽也就是同一個reduce作業,所以排序是必須的。
reduce worker遍歷排序後的中間鍵值對,對於每個唯一的鍵,都將鍵與關聯的值傳遞給reduce函式,reduce函式產生的輸入會新增到這個分割槽的輸出檔案中。
當所有的map和reduce作業都完成了,master喚醒正版的user program ,MapReduce函式呼叫返回user program的程式碼。
所有執行完畢後,MapReduce輸出放在了R個分割槽的輸出檔案中(每一個對應一個reduce作業),使用者通常並不需要合併這R個檔案,而是將其作為輸入交給另一個MapReduce程式處理。
整個過程的輸入來子HDFS,中間資料放在本地檔案系統,最終輸出寫入底層HDFS。
參考:
疑問:
開始的txt檔案是先切分然後送到各個機器還是在切分後仍然在原地機器上,等待排程???
總結:
對於複雜性運算,MapReduce在應對複雜性上只能多次MapReduce,就不適用了。因為要多次的IO。
4. HBase技術架構:
一個適合於非結構化資料儲存的簡單結構化分散式儲存系統。面向列。
用MapReduce來處理資料,用HDFS來儲存資料。
HBase處理流程:
寫流程
來自MapReduce或者client的資料,在zookeeper的協調下在master上通過演算法找到應該儲存的HRegionServer,在HRegionServer上通過演算法找到應該寫入的HRegion,然後找到HStore,在寫入HStore的MemStore之前會先寫入HLog(恢復使用),HLog會不斷刪除舊資料也就是已經存到HStore的資料,然後往HStore的MemStore裡寫入,滿了就flush到FileStore,FileStore到了閾值就跟其他FileStore合併,合併後的FileStore太大了就split出一個新的HRegion,也就是從下面的資料開始就被標記成新的另一個HRegion的name了。
如何尋找HRegionServer:
讀流程
來自MapReduce或者client的操作,
疑問:
MapReduce輸出的鍵值對是怎麼變成column family形式的,因為HBase是以列的形式儲存。???
下圖中,HMaster還會直接管理DFS ???
HLog也會寫入DFS ???
總結:
參考:
5 HDFS技術架構:
Name Node ( FsImage儲存檔案塊的對映表和檔案系統配置資訊 + EditLog事物日誌 )+ Data Node
HDFS處理流程:
HBase的meta表存的可以是name node的資訊,資料存入的時候也就是從HBase的HFile過來的時候一個Region可以對應這裡Name Node的一個block。或者可以將Region再分成小檔案塊,這些塊被存在Data Node中,不經過Name Node,Data Node中寫入的資訊多了後會生成一個新的塊,並在心跳資訊中報告給Name Node。Name Node用來操作檔案名稱空間的檔案或者目錄操作;資料塊與資料節點的關係也是在Name Node中確定的。資料節點負責檔案系統的讀寫,也就是塊的讀,寫,建立,刪除,和來自Name Node的複製命令。
在寫入的時候,其實是先寫入的客戶端的本地檔案中,當檔案到達一個塊大小時,客戶端通知Name Node,Name Node把檔名插入命名系統中,併為之分配一個塊包括塊所在Data Node的ID和標識目標資料塊的報文。這些資訊就作為客戶端請求的回覆。客戶斷收到後把資料重新整理到指定的Data Node中。檔案關閉時,本地殘留的未上傳資料會轉送到Data Node;然後Name Node就可以關閉了。
Name Node啟動時會從磁碟中讀取FsImage和EditLog,將EditLog中所有的事物應用到FsImage的仿記憶體中,然後將新的FsImage重新整理到本地磁碟中,這時因為事物已經持久化到FsImage中,所以就可以刪掉EditLog中的舊資訊。這個過程也單獨叫做檢查點。
資料的安全性,資料之間的複製,資料的正確性,系統的可靠性,災難恢復機能的實現。
疑問:HDFS與HBase接入的地方,資料是怎麼流動的???
總結: