HDFS 小文件治理

概述

hdfs中文件以block存儲在DataNode中,而所有文件的元數據全部存儲在NameNode的內存中。無論文件大小,都會佔用NameNode元數據的內存存儲空間,大約佔用150K左右。所以,系統中如果有大量小文件的話,會出現DataNode的磁盤容量沒有充分利用,而NameNode的內存卻被大量消耗,然而NameNode的內存是有容量限制的。所以,需要對小文件治理。

HAR方案

本質啟動MapReduce,因此需要首先啟動Yarn。

  • 創建歸檔文件
<code># -archiveName 檔案名稱
# -p 父目錄
# * 相對於父目錄的相對路徑
# <dest> 存儲檔案名稱的路徑
hadoop archive -archiveName data.har -p /main data data1 data2 /main

# 源文件不會刪除/<dest>
/<code>
  • 查看歸檔文件
  • <code># 顯示歸檔包含文件
    # 歸檔文件的類型是d,即目錄
    # -R 遞歸列出目錄內容
    hdfs dfs -ls -R /main/data.har

    # 顯示歸檔包含實際內容
    hdfs dfs -ls -R har:///main/data.har/<code>
  • 解壓歸檔文件
  • <code># -p  如果目錄已經存在,不會失敗
    hdfs dfs -mkdir -p /main/out
    hdfs dfs -cp har:///main/data.har/* /main/out/<code>

    SequenceFile方案

    • SequenceFile是由record構成,每個record是由鍵值對構成,其中文件名作為record的key,而文件內容作為record的value。Record間隨機插入Sync,方便定位到Record的邊界。
    • SequenceFile是可以分割的,所以可以利用MapReduce切分,獨立運算。
    • HAR不支持壓縮,而SequenceFile支持壓縮。支持兩類壓縮:Record壓縮Block壓縮,一次性壓縮多條Record作為一個Block;每個Block開始處都需要插入Sync當不指定壓縮算法時,默認使用zlib壓縮無論是否壓縮,採用何種算法,均可使用 hdfs dfs -text 命令查看文件內容一般情況下,以Block壓縮為最好選擇。因為一個Block包含多條Record,利用Record間的相似性進行壓縮,壓縮效率更高。


    HDFS 小文件治理


    • 把已有小文件轉存為SequenceFile較慢,相比先寫小文件,再寫SequenceFile而言,直接將數據寫入SequenceFile是更好的選擇,省去小文件作為中間媒介。


    分享到:


    相關文章: