技術分享:大資料知識體系
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一下,加快整個處理速度。