HDFS 優化與容錯機制

2021-10-09 16:23:45 字數 3626 閱讀 6091

本篇面試內容劃重點:failover、機架感知、短路讀、小檔案問題

hdfs 就像是一台精良的機器,為了保證使用者體驗,它不允許在使用者操作的過程**現任何的差錯,所以,它在設計實現的時候就對各種異常場景做了周全的考慮,如何發現問題,如何滿足使用者需求的同時保證系統一致性,如何解決問題等等,下面我們來細看。

寫失敗場景的處理流程?

首先 pipeline 被關閉,在確認佇列中的剩下的 package 會被新增進資料佇列的起始位置上不再傳送,以防止在失敗的節點下游的節點再丟失資料

然後,儲存在正常的 datanode 上的 block 會被指定乙個新的標識,並將該標識傳遞給 namenode,以便故障 datanode 在恢復後可以刪除自己儲存的那部分已經失效的資料塊。

失敗節點會從 pipeline 中移除,然後剩下兩個好的 datanode 會組成乙個的新的 pipeline,剩下的這些 block 的包會繼續寫進 pipeline 中正常的 datanode 中。

最後,即在寫流程的步驟 7 中,namenode 會發現節點宕機導致部分 block 的塊備份數小於規定的備份數,此時namenode 會安排使節點的備份數滿足 dfs.replication 配置要求

讀失敗場景的處理流程?

讀失敗的場景比較簡單,再看上圖右半部分,即步驟 4異常的情況。

dfsinputstream 會去嘗試連線列表裡的下乙個 datanode,同時記錄下這個異常節點。

同時 dfsinputstream 也會對獲取到的資料核查 checknums。如果損壞的 block 被發現了,dfsinputstream 就試圖從另乙個擁有備份的 datanode 中去讀取備份塊中的資料。

最後異常資料的同步工作也是由 namenode 來安排完成。

客戶端寫 datanode 的過程中 datanode 宕機是否對寫有影響?單台宕機對寫沒有影響,客戶端會找到新的健康的節點繼續完成寫入操作,具體見上述步驟。

是否要完成所有目標 datanode 節點的寫入,才算一次寫成功操作?寫成功數量達到最小備份數的閾值即算寫入成功。

讀的過程如何保證資料沒有被損壞,如果損壞如何處理?dfsinputstream 會在 datanode 上傳輸的資料上檢查 checknums 。如果有損壞,dfsinputstream 會從另乙個擁有備份的 datanode 中讀取備份資料。

互動過程資料校驗的基本單位chunk 是最小的單位,也是資料校驗的基本單位,預設 512byte,每個 chunk 帶有 4 byte 的校驗位。

網際網路公司的 hadoop 集群一般都會比較大,幾百台伺服器會分布在不同的機架上,甚至在不同的機房。出於保證資料安全性和資料傳輸的高效性的平衡考慮,hdfs希望不同節點之間的通訊能夠盡量發生在同乙個機架之內,而不是跨機架和跨機房。同時,namenode 在分配 block 的儲存位置的時候,會盡可能把資料塊的副本放到多個機架甚至機房中,防止機架出現事故或者機房出現事故時候的資料丟失問題發生。

這就是 hdfs 的機架感知,首先機房和機架的資訊是需要使用者自己配置的,hdfs 沒法做到自動感知,然後根據配置的資訊,namenode 會有如下的副本放置策略。

與 client 在同一伺服器

在同一機架

在同乙個機房

跨機房「隨機放置」的規則?上面提到了對於同機架的不同節點執行「隨機放置」,然而「隨機放置」也不是完全的隨機,也是有規則的,具體需要做如下的判斷。

短路讀機制使 client 端和目標 datanode 在同一臺伺服器時,可以直接從本地磁碟讀取資料,不需要通過 datanode 中轉資料。為了解決許可權的問題,hdfs 採用了 unix 的一種機制:檔案描述符傳遞。如圖,dfsclient 發起讀請求後,datanode 不是將資料目錄傳遞給 dfsclient,而是開啟塊檔案和元資料檔案,並將它們的檔案描述符傳遞給 dfsclient,dfsclient 再根據檔案描述符直接從磁碟讀取資料。

檔案描述符實際上是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。當程式開啟乙個現有檔案或者建立乙個新檔案時,核心向程序返回乙個檔案描述符。unix 和 windows 系統都允許在程序間傳遞檔案描述符。

短路讀機制是如何保證檔案的安全性的?

hdfs 在設計上是如何避免 namenode 成為資料讀寫瓶頸的?在設計上比較重要的點是客戶端直接從 datanode 上檢索資料, namenode 只負責告知需要檢索的 datanode,不負責實際資料的中轉。這種設計成功避免了 namenode 成為讀寫的瓶頸,能承受高併發請求,因為讀資料是客戶端與集群各個 datanode 之間的操作,這期間,namenode 僅僅只需返回在記憶體中的塊位置資訊。這道題考察的是對 namenode 作用的理解,它僅僅只作為乙個儲存元資料的中轉站,不負責資料的實際讀寫。

資料寫入時各個 datanode 時如何保證資料一致的?pipeline 寫入,寫入完成返回 ack 資訊,datanode 完成資料量達到配置的閾值則視為成功,若返回成功後某資料副本存在異常則 namenode 會做 datanode 間資料同步的收尾工作。這道題考察的是 datanode 之間的資料同步機制,寫入成功數閾值可配置,關鍵在於 namenode 的收尾工作。

hdfs 特性考察的是對 hdfs 場景的理解,比較基礎。

hadoop 的壓縮格式?和各自的優缺點

壓縮格式

可分割性

native

壓縮率(相對而言)

速度(相對而言)

linux 命令

其他gzip否是

高中有只用於冷資料

bzip2支援否

高慢有hbase 不支援

lzo支援是中

快有可用於熱資料,hadoop 最常用的壓縮格式否是

中快無可用於熱資料

hdfs 為何不適合小檔案儲存?如何解決?小檔案過多,就意味著 block 會很多,對於元資料來說,不管儲存的實際檔案有多大,乙個 block 元資料的大小都是在 150byte 左右。同時,元資料資訊都是儲存在 namenode 的,活躍的 namenode 是單節點的,這樣會導致 namenode 記憶體消耗過大,成為集群瓶頸。另外檔案過小,尋道時間大於資料讀寫時間,這是非常低效的表現。**

Spark Spark容錯機制

一般來說,分布式資料集的容錯性有兩種方式 資料檢查點和記錄資料的更新。面向大規模資料分析,資料檢查點操作成本很高,需要通過資料中心的網路連線在機器之間複製龐大的資料集,而網路頻寬往往比記憶體頻寬低得多,同時還需要消耗更多的儲存資源。因此,spark選擇記錄更新的方式。但是,如果更新粒度太細太多,那麼...

Spark容錯機制

一般來說,分布式資料集的容錯性有兩種方式 資料檢查點和記錄資料的更新。面向大規模資料分析,資料檢查點操作成本很高,需要通過資料中心的網路連線在機器之間複製龐大的資料集,而網路頻寬往往比記憶體頻寬低得多,同時還需要消耗更多的儲存資源。因此,spark選擇記錄更新的方式。但是,如果更新粒度太細太多,那麼...

Spark容錯機制

一般來說,分布式資料集的容錯性有兩種方式 資料檢查點和記錄資料的更新。面向大規模資料分析,資料檢查點操作成本很高,需要通過資料中心的網路連線在機器之間複製龐大的資料集,而網路頻寬往往比記憶體頻寬低得多,同時還需要消耗更多的儲存資源。因此,spark選擇記錄更新的方式。但是,如果更新粒度太細太多,那麼...