小文件對HDFS的危害
- 2019 年 10 月 6 日
- 筆記
在大數據環境,很多組件都是基於HDFS,例如HDFS直接放文件環境、以及HBase、Hive等上層資料庫環境。如果對HDFS環境未進行優化,小文件可能會造成HDFS系統的崩潰。今天我們來看一下。
一、究竟會出什麼問題
因為HDFS為了加速數據的存儲速度,將文件的存放位置數據(元數據)存在了NameNode的記憶體,而NameNode又是單機部署,如果小文件過多,將直接導致NameNode的記憶體溢出,而文件無法寫入。
為此在HDFS中放小文件必須進行優化,不能將小文件(類似1MB的若干小文件)直接放到HDFS中。

二、數據在DataNode中如何存儲?
HDFS默認的數據存儲塊是64MB,現在新版本的hadoop環境(2.7.3版本後),默認的數據存儲塊是128MB。
一個文件如果小於128MB,則按照真實的文件大小獨佔一個數據存儲塊,存放到DataNode節點中。同時 DataNode一般默認存三份副本,以保障數據安全。同時該文件所存放的位置也寫入到NameNode的記憶體中,如果有Secondary NameNode高可用節點,也可同時複製一份過去。NameNode的記憶體數據將會存放到硬碟中,如果HDFS發生重啟,將產生較長時間的元數據從硬碟讀到記憶體的過程。
如果一個文件大於128MB,則HDFS自動將其拆分為128MB大小,存放到HDFS中,並在NameNode記憶體中留下其數據存放的路徑。不同的數據塊將存放到可能不同的DataNode中。
三、如何解決小文件需要存放到HDFS的需求?
1.合併小文件,數據未落地到HDFS之前合併或者數據已經落到HDFS,用spark service服務或其它程式每天調度去合併。Apache官方也提供了官方工具。Hadoop Archive或者HAR,是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠將多個小文件打包成一個HAR文件,這樣在減少namenode記憶體使用的同時,仍然允許對文件進行透明的訪問。
2、多Master設計,讓元數據分散存放到不同的NameNode中。
也許還有同學會提到增大NameNode的記憶體、甚至將元數據直接從硬碟中讀取,但這些方法都是治標不治本,不適用。
四、小文件的其它危害
小文件除了可能會撐爆NameNode。另一個是hive或者spark計算的時候會影響它的速度,因為spark計算時會將數據從硬碟讀到記憶體,零碎的文件將產生較多的尋道過程。
五、題外話:HDFS為什麼將Block塊設置為128M
1、如果低於128M,甚至過小。一方面會造成NameNode記憶體佔用率高的問題,另一方面會造成數據的定址時間較多。
2、如果於高於128M,甚至更大。會造成無法利用多DataNode的優勢,數據只能從從一個DN中讀取,無法實現多DN同時讀取的速率優勢。
