Hadoop讀寫流程與2.X架構
安全模式
集群啟動時的一個狀態,處于安全模式的狀態下,只向客戶端提供檔案的只讀視圖
HDFS的權限
HDFS對權限的控制
- 只能防止好人做錯事
- 不能防止壞人做壞事
你告訴他你是誰,他就認為你是誰!
機架感知策略
我們需要將副本放在不同的DN節點上,節點也需要一定的考量
- 可靠性、可用性、帶寬消耗
第一個節點
- 集群內部(優先考慮和客戶端相同節點作為第一個節點)
- 集群外部(選擇資源豐富且不繁忙的節點為第一個節點)
第二個節點
- 選擇和第一個節點不同機架的其他節點
第三個節點
- 與第二個節點相同機架的其他節點
第N個節點
- 與前面節點不重復的其他節點
HDFS寫資料流程
宏觀流程
-
- 客戶端向HDFS發送寫資料請求
-
- filesystem通過rpc呼叫namenode的create方法
-
nn首先檢查是否有足夠的空間權限等條件創建這個檔案,或者這個路徑是否已經存在,權限
-
- 有:NN會針對這個檔案創建一個空的Entry物件,并回傳成功狀態給DFS
-
- 沒有:直接拋出對應的例外,給予客戶端錯誤提示資訊
-
-
3.DFS如果接收到成功狀態,會創建一個物件 FSDataOutputStream的物件給客戶端使用
-
4.客戶端需要向NN詢問第一個Block存放的位置
-
- NN通過機架感知策略 (node1 node 2 node8)
-
-
5.需要將客戶端和DN節點創建連接
-
pipeline(管道)
- 客戶端和node1創建連接 socket
- node1和node2創建連接 socket
- node2 和Node8創建連接 socket
-
-
- 客戶端將檔案按照塊block切分資料,但是按照packet發送資料
- 默認一個packet大小為64K,Block128M為2048個packet
-
- 客戶端通過pipeline管道開始使用FSDataOutputStream物件將資料輸出
-
- 客戶端首先將一個packet發送給node1,同時給予node1一個ack狀態
-
- node1接受資料后會將資料繼續傳遞給node2,同時給予node2一個ack狀態
-
- node2接受資料后會將資料繼續傳遞給node8,同時給予node8一個ack狀態
-
- node8將這個packet接受完成后,會回應這個ack給node2為true
-
- node2會回應給node1 ,同理node1回應給客戶端
-
- 客戶端接收到成功的狀態,就認為某個packet發送成功了,直到當前塊所有的packet都發送完成
-
- 如果客戶端接收到最后一個pakcet的成功狀態,說明當前block傳輸完成,管道就會被撤銷
-
- 客戶端會將這個訊息傳遞給NN,NN確認傳輸完成
-
- NN會將block的資訊記錄到Entry,客戶端會繼續向NN詢問第二個塊的存盤位置,依次類推
-
- block1 (node1 node2 node8)
-
- block2 (node1 node8 node9)
-
- …
-
- blockn(node1 node7 node9)
-
- 當所有的block傳輸完成后,NN在Entry中存盤所有的File與Block與DN的映射關系關閉FsDataOutPutStream
微觀流程
-
1.首先客戶端從自己的硬碟以流的方式讀取資料檔案到自己的快取中
-
2.然后將快取中的資料以chunk(512B)和checksum(4B)的方式放入到packet(64K)
-
- chunk:checksum=128:1
-
- checksum:在資料處理和資料通信領域中,用于校驗目的的一組資料項的和
-
- Packet中的資料分為兩類,一類是實際資料包,另一類是header包,
-
- 一個Packet資料包的組成結構
-
-
3.當packet滿的時候加入到 添加到 dataqueue
-
4.datastreamer開始從dataqueue佇列上取出一個packet,通過FSDataOPS發送到Pipleline
- 在取出的時候,也會將packet加入到ackQueue,典型的生產者消費者模式
-
5.客戶端發送一個Packet資料包以后開始接收ack,會有一個用來接收ack的ResponseProcessor行程,如果收到成功的ack
-
- 如果某一個packet的ack為true,那么就從ackqueue洗掉掉這個packet
-
- 如果某一個packet的ack為false,將ackqueue中所有的packet重新掛載到 發送佇列,重新發送
-
-
- 最終DFS保存的資料格式為
- blk_ 為trunk檔案
- blk_ .mate 為checksum檔案
HDFS讀資料流程
首先客戶端發送請求到DFS,申請讀取某一個檔案
DFS去NN查找這個檔案的資訊(權限,檔案是否存在)
- 如果檔案不存在,拋出指定的錯誤
- 如果檔案存在,回傳成功狀態
DFS創建FSDataInputStream物件,客戶端通過這個物件讀取資料
客戶端獲取檔案第一個Block資訊,回傳DN1 DN2 DN8
客戶端直接就近原則選擇DN1對應的資料即可
依次類推讀取其他塊的資訊,直到最后一個塊,將Block合并成一個檔案
關閉FSDataInputStream
Hadoop1的困境
單點故障
- 每個群集只有一個NameNode,NameNode存在單點故障(SPOF)
水平擴展
- 將來服務器啟動的時候,啟動速度慢
namenode隨著業務的增多,記憶體占用也會越來越多
- 如果namenode記憶體占滿,將無法繼續提供服務
業務隔離性差
丟失inprocess
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386519.html
標籤:其他
下一篇:淺談Hadoop的應用
