技術分享:大數據知識體系

image.png

j整個大數據處理的體系,按我的理解可以分爲兩個部分,一個是分佈式存儲系統、另一個是分佈式計算框架。分佈式存儲系統主流是HadoopDFS,其他還有Ceph和Swift。分佈式計算框架主流是MapReduce,Storm和Spark。

首先說分佈式存儲系統HadoopDFS。它是一種本地文件系統之上的更高的抽象,把跨節點的組成的文件系統看成一個邏輯上的整體。它存儲的思路是,把文件分成一個個block,每個block都有一定量的副本存儲在不同的節點上,默認數量是3個,這保證了分佈式存儲的數據的穩定性。


在這裏相信有許多想要學習大數據的同學,大家可以+下大數據學習裙:716加上【五8一】最後014,即可免費領取套系統的大數據學習教程

HDFS的架構有NameNode、SecondaryNameNode、DataNode。NameNode節點主要負責客戶端傳來的讀寫請求,保存文件的metadata。SecondaryNameNode負責幫助NameNode合併editlog。DataNode負責儲存Block,向NameNode彙報block信息、發送heartbeat。

HDFS寫入文件的時候:客戶端通過RPC向NN調用create()方法,NN檢查文件是否存在,不存在並且有權限的話就會創建一個新文件,向客戶端返回一個FSDataOutputStream,用於寫數據。

HDFS讀文件的時候,客戶端通過RPC向NN調用open()方法,NN獲得每個數據塊的位置信息,返回客戶端FSDataInputstream,客戶端調用其read()方法讀取數據塊。

分佈式計算框架中最流行的是MapReduce。它把並行計算、容錯等細節問題封裝到庫裏,程序員只需要編寫map和reduce函數就可以了。這種模型的靈感來自函數式編程中的map和reduce原語。Map函數接受KV值,輸出KV值,reduce函數接收KEY和相同key構成的value的集合的迭代器,再輸出KV值。

整個執行過程是:用戶提交job給調度系統,每個job包含一系列task,調度系統將這些任務調度到集羣中多臺可用的機器上。

開始執行後,數據被分割成M個數據片段集合,再調用map函數,之後被分區函數將結果分成R個不同分區,之後執行Reduce函數。具體就是:

1、輸入文件分成M個數據片段,每個片段大小是HDFS的block size,程序副本也被創建到集羣中。

2、這些程序的副本有一個master,master負責分配任務給其他空閒的worker。

3、分配了map任務的worker程序讀取數據片段,解析成KV對,然後傳遞給自定義的map函數,再解析出中間KV對,緩存在內存中。

4、分區函數把內存中的KV對分成R個區域,週期性寫入文件系統,緩存的KV對在本地磁盤位置傳給master,master再把位置傳給reduce worker。

5、reduceworker收到位置信息,通過RPC從map worker所在主機磁盤讀取緩存數據。讀取後,通過對key排序使得具有相同key的數據聚合在一起,

6、排序過後,每個key對應的value集合傳給自定義reduce函數,處理之後,結果追加到所屬分區的輸出文件中。

7、map和reduce任務都完成後,master喚醒用戶程序,返回結果。

Spark這個計算框架的兩個優勢是內存計算和DAG。它的五大特性:

1、 RDD都是由partition組成的

2、 每個split都會有相同的計算函數

3、 有一系列的依賴關係

4、 對鍵值對類型的RDD可以爲他分區,但我暫時沒用過

5、 移動計算,而不移動數據。他會把計算髮到相應數據集所在節點。

整個spark的核心就是RDD,一個RDD中的數據可以做partition分區,對於RDD的操作也只有transformation和action兩種。

一個Spark作業就是對RDD的一系列操作(transformation和一個action)。作業又可以分爲多個stage,stage的劃分有出現了寬依賴和窄依賴的概念。窄依賴就是父RDD的每個分區最多被一個子RDD的分區所用,寬依賴就是子RDD的每個分區依賴於父RDD的多個分區或所有分區。當一個作業的lineage過長,可以用到緩存管理,persis或者cache一下,加快整個處理速度。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章