大數據-Hadoop小文件問題解決方案
HDFS中小文件是指文件size小於HDFS上block大小的文件。大量的小文件會給Hadoop的擴展性和性能帶來嚴重的影響。
大數據學習群:716581014
小文件是如何產生的?
動態分區插入數據,產生大量的小文件,從而導致map數量劇增
reduce數量越多,小文件也越多,reduce的個數和輸出文件個數一致
數據源本身就是大量的小文件
小文件問題的影響
從Mapreduce的角度看,一個文件會啟動一個map,所以小文件越多,map也越多,一個map啟動一個jvm去執行,所以這些任務的初始化,啟動,執行會浪費大量的資源,嚴重的影響性能。
從HDFS角度看,HDFS中文件元信息(位置,大小,分塊等)保存在NameNode的內存中,每個對象大約占用150字節,如果小文件過多,會占用大量內存,直接影響NameNode的性能;HDFS讀寫小文件也會更加耗時,因為每次都需要從NameNode獲取元信息,並與對應的DataNode建立連接。
如何解決小文件問題
輸入合並,在Map前合並小文件
輸出合並,在輸出結果的時候合並小文件
控制reduce個數來實現減少小文件個數
配置Map輸入合並
可以通過在輸入mapper的之前將是輸入合並,以減少map的個數。
配置Hive輸出結果合並
Hadoop Archive(HAR)
Hadoop Archive是一種特殊的歸檔格式,Hadoop Archive映射到文件系統目錄,一個HAR是以擴展名.har結尾 ,一個HAR目錄包含元數據(以_index和_masterindex的形式)和data(part-*)文件。_index文件包含文件名稱,這些文件是歸檔的一部分,並且包含這些文件在歸檔中的位置。
Hadoop Archive是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能將多個小文件打包成一個HAR文件,這樣在減少NameNode內存使用的同時,仍然允許對文件進行透明的訪問。
? 使用hadoop命令進行文件歸檔
可以通過設置參數來指定HAR的大小。
? 在Hive中進行歸檔處理
Hive支持將已存的分區轉換為HAR,從而使得分區下的文件數目大大減少。但是從HAR讀數據需要額外的開銷,因此查詢歸檔下數據可能會變慢。
如果不是分區表,可以創建成外部表,使用har://協議來指定路徑。
SequenceFile
控制reducer個數
為了提升MR的運算速度,可以通過增加reducer的個數,Hive也會做類似的優化,Reducer數量等於源數據量除以所配置的量(默認是1G)。Reducer的數量決定了結果文件的數量。所以在合適的情況下控制reducer的數量,可以實現減少小文件數量。
? reducer決定因素:
大數據學習群:716581014 共同學習
大數據-Hadoop小文件問題解決方案