Hadoop 小文件處理理論在Hive數據處理上的落地-Hadoop商業環境實戰

版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何技術交流,可隨時聯繫。html

1 問題陳述

  • 小文件是指文件size小於HDFS上block大小的文件。這樣的文件會給hadoop的擴展性和性能帶來嚴重問題。首先,在HDFS中,任何block,文件或者目錄在內存中均以對象的形式存儲,每一個對象約佔150byte,若是有10000000個小文件,每一個文件佔用一個block,則namenode大約須要2G空間。若是存儲1億個文件,則namenode須要20G空間。namenode內存容量嚴重製約了集羣的擴展。
  • 訪問大量小文件速度遠遠小於訪問幾個大文件。HDFS最初是爲流式訪問大文件開發的,若是訪問大量小文件,須要不斷的從一個datanode跳到另外一個datanode,嚴重影響性能。最後,處理大量小文件速度遠遠小於處理同等大小的大文件的速度。每個小文件要佔用一個slot,而task啓動將耗費大量時間甚至大部分時間都耗費在啓動task和釋放task上。

2 解決方案

Hadoop自己也提供了幾個解決方案,分別爲:Hadoop Archive,Sequence file和CombineFileInputFormat。node

2.1 Hadoop Archive

  • Hadoop Archive或者HAR,是一個高效地將小文件放入HDFS塊中的文件存檔工具,它可以將多個小文件打包成一個HAR文件,這樣在減小namenode內存使用的同時,仍然容許對文件進行透明的訪問。算法

    (1) 對某個目錄/foo/bar下的全部小文件存檔成/outputdir/ zoo.har:
      
          hadoop archive -archiveName zoo.har -p /foo/bar /outputdir
          固然,也能夠指定HAR的大小(使用-Dhar.block.size)。
          
       (2) HAR的訪問路徑能夠是如下兩種格式:
          har://scheme-hostname:port/archivepath/fileinarchive
          har:///archivepath/fileinarchive(本節點)
          
          能夠這樣查看HAR文件存檔中的文件:
          hadoop dfs -ls har:///user/zoo/foo.har
          輸出:
          har:///user/zoo/foo.har/hadoop/dir1
          har:///user/zoo/foo.har/hadoop/dir2
    複製代碼
  • 使用HAR時須要兩點,第一,對小文件進行存檔後,原文件並不會自動被刪除,須要用戶本身刪除;第二,建立HAR文件的過程其實是在運行一個mapreduce做業,於是須要有一個hadoop集羣運行此命令。數組

  • 此外,HAR還有一些缺陷:第一,一旦建立,Archives便不可改變。要增長或移除裏面的文件,必須從新建立歸檔文件。第二,要歸檔的文件名中不能有空格,不然會拋出異常,能夠將空格用其餘符號替換(使用-Dhar.space.replacement.enable=true 和-Dhar.space.replacement參數)。app

2.2 SequenceFile

  • sequenceFile文件是Hadoop用來存儲二進制形式的[Key,Value]對而設計的一種平面文件(Flat File)。能夠把SequenceFile當作是一個容器,把全部的文件打包到SequenceFile類中能夠高效的對小文件進行存儲和處理。工具

  • SequenceFile文件並不按照其存儲的Key進行排序存儲,SequenceFile的內部類Writer提供了append功能。SequenceFile中的Key和Value能夠是任意類型Writable或者是自定義Writable。oop

  • 在存儲結構上,SequenceFile主要由一個Header後跟多條Record組成,Header主要包含了Key classname,value classname,存儲壓縮算法,用戶自定義元數據等信息,此外,還包含了一些同步標識,用於快速定位到記錄的邊界。每條Record以鍵值對的方式進行存儲,用來表示它的字符數組能夠一次解析成:記錄的長度、Key的長度、Key值和value值,而且Value值的結構取決於該記錄是否被壓縮。性能

    https://blog.csdn.net/bitcarmanlee/article/details/78111289
    複製代碼

2.3 CombineFileInputFormat

咱們基於Hadoop內置的CombineFileInputFormat來實現處理海量小文件,須要作的工做就很顯然了,以下所示:spa

  • 實現一個RecordReader來讀取CombineFileSplit包裝的文件Block.net

  • 繼承自CombineFileInputFormat實現一個使用咱們自定義的RecordReader的輸入規格說明類

  • 處理數據的Mapper實現類

  • 配置用來處理海量小文件的MapReduce Job

    https://blog.csdn.net/flyfish778/article/details/47722551
    複製代碼

3 Hive的小文件處理

  • 配置Map輸入合併

  • 配置Hive輸出結果合併

  • 在Hive中進行歸檔處理 Hive支持將已存的分區轉換爲HAR,從而使得分區下的文件數目大大減小。可是從HAR讀數據須要額外的開銷,所以查詢歸檔下數據可能會變慢。

若是不是分區表,能夠建立成外部表,使用har://協議來指定路徑。

  • SequenceFile

  • 控制reducer個數 Reducer的數量決定告終果文件的數量。因此在合適的狀況下控制reducer的數量,能夠實現減小小文件數量。

引用: http://www.raincent.com/content-85-11297-1.html
複製代碼

4 總結

由於工做中用到這個,總結成文,參考多維博客,均代表引用鏈接,內容粗鄙,勿怪!

秦凱新 於深圳

相關文章
相關標籤/搜索