1. 程式人生 > >大數據-Hadoop小文件問題解決方案

大數據-Hadoop小文件問題解決方案

擴展名 term efi 外部 情況 -o r文件 圖片 Oz

HDFS中小文件是指文件size小於HDFS上block(dfs block size)大小的文件。大量的小文件會給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小文件問題解決方案