中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hadoop - HDFS的數據流剖析

發布時間:2020-04-03 10:24:53 來源:網絡 閱讀:2511 作者:Professor哥 欄目:大數據

剖析文件的讀取

為了了解客戶端及與之交互的HDFS、namenode 和 datanode之間的數據流是什么樣的,我們可以參考下圖,該圖顯示了在讀取文件時事件的發生順序。

Hadoop - HDFS的數據流剖析

客戶端通過調用FileSystem對象的open()方法來打開希望讀取的文件,對于HDFS來說,這個對象是分布式文件系統(圖中步驟1)的一個實例。DistributedFileSystem 通過使用RPC來調用namenode,以確定文件起始塊的位置(步驟2)。對于每一個塊,namenode返回存有該塊副本的datanode地址。此外,這些datanode根據它們與客戶端的距離來排序。如果該客戶端本身就是一個datanode(比如,在一個MapReduce任務中),并保存有相應數據塊的一個副本時,該節點就會從本地datanode讀取數據。


DistributedFileSystem類返回一個FSDataInputStream對象(一個支持文件定位的數據流)給客戶端并讀取數據。FSDataInputStream類轉而封裝DFSInputStream對象,該對象管理著datanode和namenode的I/O。


接著,客戶端對這個輸入流調用 read()方法(步驟3)。存儲著文件起始幾個塊的datanode地址的DFSInputStream隨即連接距離最近的datanode。通過對數據反復調用read()方法,可以將數據從datanode傳輸到客戶端(步驟4)。到達塊的末端時,DFSInputStream關閉與該datanode的連接,然后尋找下一個塊的最佳datanode(步驟5)。客戶端只需要讀取連續的流,并且對客戶端都是透明的。


客戶端從流中讀取數據時,塊是按照打開DFSInputStream與datanode新建連接的順序讀取的。它也會根據需要詢問namenode來檢索下一批數據塊的datanode的位置。一旦客戶端完成讀取,就對FSDataInputStream調用close()方法(步驟6)。


在讀取數據的時候,如果DFSInputStream在與datanode通信時遇到錯誤,會嘗試從這個塊的另一個最鄰近datanode讀取數據。它也會記住那個故障datanode,以保證以后不會反復讀取該節點上后續的塊。DFSInputStream也會通過校驗和確認從datanode發來的數據是否完整。 如果發現有損壞的塊,就在DFSInputStream試圖從其他datanode讀取其副本之前通知namenode。


這個設計的一個重點是,namenode告知客戶端每個塊中最佳的datanode,并讓客戶端直接連接到該datanode檢索數據。由于數據流分散在急群眾的所有datanode,所以這種設計能使HDFS可擴展到大量的并發客戶端。同時,namenode只需要響應塊位置的請求(這些信息存儲在內存中,因而非常高效),無需響應數據請求,否則隨著客戶端數量的增長,namenode會很快成為瓶頸

網絡拓撲與Hadoop

在本地網絡里,兩個節點被稱為“彼此近鄰”是什么意思?在海量數據處理中,其主要限制因素是節點之間數據的傳輸速率——帶寬很稀缺。這里的想法是將兩個節點間的帶寬作為距離的衡量標準。


不用衡量節點之間的帶寬——實際上很難實現(它需要一個穩定的集群,并且在集群中兩兩節點對數量是節點數量的平方)——Hadoop為此采用一個簡單的方法:把網絡看做一棵樹,兩個節點間的距離是它們到最近共同祖先的距離總和。該樹中的層次是沒有預先設定的,但是相對于數據中心、幾家和正在運行的節點,通常可以設定等級。具體想法是針對以下每個場景,可用帶寬依次遞減:

  • 同一個節點上的進程

  • 同一機架上的不同節點

  • 同一數據中心中不同機架上的節點

  • 不同數據中心中的節點


例如,假設有數據中心 d1 機架 r1 中的節點 n1.該節點可以表示為/d1/r1/n1。利用這種標記,這里給出四種距離描述:

  • distance(/d1/r1/n1, /d1/r1/n1) = 0 (同一個節點上的進程)

  • distance(/d1/r1/n1, /d1/r1/n2) = 2 (同一機架上的不同節點)

  • distance(/d1/r1/n1, /d1/r2/n3) = 4 (同一數據中心中不同機架上的節點)

  • distance(/d1/r1/n1, /d2/r3/n4) = 6 (不同數據中心中的節點)

最后,我們必須意識到Hadoop無法自行定義網絡拓撲結構。它需要我們能夠理解并輔助定義。



剖析文件的寫入
接下來我們看看文件時如何寫入HDFS的,盡管比較詳細,但對于理解數據流還是很有用的,因為它清楚地說明了HDFS的一致模型。


我們要考慮的情況是如何新建一個文件,把數據寫入該文件,最后關閉該文件。見下圖。

Hadoop - HDFS的數據流剖析

客戶端通過對DistributedFileSystem對象調用create()函數來新建文件(步驟1)。DistributedFileSystem對namenode創建一個RPC調用,在文件系統的命名空間中新建一個文件,此時該文件中還沒有相應的數據塊(步驟2)。namenode執行各種不同的檢查以確保這個文件不存在以及客戶端有新建文件的權限。如果這些檢查均通過,namenode就會為創建新文件記錄一條記錄;否則,文件創建失敗并向客戶端拋出一個IOException異常。DistributedFileSystem向客戶端返回一個FSDataOutputStream對象,由此客戶端可以開始寫入數據。就像讀取事件一樣,FSDataOutputStream封裝一個DFSoutPutstream對象,該對象負責處理datanode和namenode之間的通信。


在客戶端寫入數據時(步驟3),DFSOutputStream將它分成一個個的數據包,并寫入內部隊列,稱為“數據隊列”(data queue)。DataStreamer處理數據隊列,它的責任是根據datanode列表來要求namenode分配適合的新塊來存儲數據復本。這一組datanode構成一個管線——我們假設復本數為3,所以管線中有3個節點。DataStreamer將數據包流式傳輸到管線中第一個datanode,該datanode存儲數據包并將它發送到管線中的第二個datanode。同樣,第二個datanode存儲該數據包并且發送給管線中的第三個(也是最后一個)datanote(步驟4)。


DFSOutputStream也維護著一個內部數據包隊列來等待datanode的收到確認回執,稱為“確認隊列”(ack queue)。收到管道中所有datanode確認信息后,該數據包才會從確認隊列刪除(步驟5)


如果數據在寫入期間datanode發生故障,則執行以下操作(對寫入數據的客戶端是透明的)。首先關閉管線,確認把隊列中的所有數據包都添加回數據隊列的最前端,以確保故障節點下游的datanode不會漏掉任何一個數據包。為存儲在另一正常datanode的當前數據結塊指定一個新的標識,并將該標識傳送給namenode,以便故障datanode在恢復后可以刪除存儲的部分數據塊。從管線中刪除故障數據節點并且把余下的數據塊寫入管線中另外兩個正常的datanode。namenode注意到塊復本量不足時,會在另一個節點上創建一個新的復本。后續的數據塊繼續正常接受處理。


在一個塊被寫入期間可能會有多個datanode同時發生故障,但非常少見。只要寫入了dfs.replication.min的復本數(默認為1),寫操作就會成功,并且這個塊可以在集群中異步復制,直到達到其目標復本數(dfs.replication的默認值為3)。


客戶端完成數據的寫入后,對數據流調用close()方法(步驟6)。該操作將剩余的所有數據包寫入datanode管線,并在聯系到namenode且發送文件寫入完成信號之前,等待確認(步驟7)。namenode已經知道文件由哪些塊組成(通過Datastreamer請求分配數據塊),所以它在返回成功之前只需要等待數據塊進行最小量的復制。


復本怎么放

namenode如何選擇在哪個datanode存儲復本(replica)?這里需要對可靠性、寫入帶寬和讀取帶寬進行權衡。例如,把所有復本都存儲在一個節點損失的寫入帶寬最小,因為復制管線都是在同一個節點上運行,但這并不提供真實的冗余(如果節點發生故障,那么該塊中的數據會丟失)。同時,同一機架上服務器間的讀取帶寬是很高的。另一個極端,把復本放在不同的數據中心可以最大限度地提高冗余,但帶寬的損耗非常大。即使在同一數據中心(到目前為止,所有Hadoop集群均運行在同一數據中心內),也有許多不同的數據布局策略。其實,在發布的Hadoop 0.17.0版中改變了數據布局策略來復制保持數據塊在集群內分布相對均勻。在1.x之后的發行版本,可即時選擇數據塊的布局策略。


Hadoop的默認布局策略是在運行客戶端的節點上放第一個復本(如果客戶端運行在集群之外,就隨機選擇一個節點,不過系統會避免挑選那些存儲太慢或太忙的節點)。第二個復本放在與第一個不同且隨機另外選擇的機架中節點上(離架)。第三個復本與第二個復本放在同一個機架上,且隨機選擇另一個節點。其他復本放在集群中隨機選擇的節點上,不過系統會盡量避免在同一個機架上放太多復本。


一旦選定復本的放置位置,就根據網絡拓撲創建一個管線(Pipeline)。如果復本數為3,則有下圖所示的管線。

Hadoop - HDFS的數據流剖析

總的來說,這一方法不僅提供很好的穩定性(數據塊存儲在兩個機架中)并實現很好的負載均衡,包括寫入帶寬(寫入操作只需要遍歷一個交換機)、讀取性能(可以從兩個機架中選擇讀取)和集群中塊的均勻分布(客戶端只在本地機架上寫入一個塊)。





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西乡县| 资兴市| 江安县| 绥棱县| 河南省| 津市市| 福州市| 三江| 剑河县| 阳西县| 平湖市| 石嘴山市| 神农架林区| 留坝县| 宁化县| 重庆市| 桐庐县| 云阳县| 中宁县| 滁州市| 丰顺县| 会同县| 双牌县| 怀集县| 大英县| 仁化县| 高州市| 上饶县| 开化县| 徐水县| 长阳| 蓝山县| 铅山县| 平利县| 巢湖市| 乌恰县| 淅川县| 黄大仙区| 巴南区| 延寿县| 昌吉市|