2015-10-15 105 views
1

我有hdfs集羣,它以最終用戶選擇的壓縮/加密格式存儲大型csv文件。 對於壓縮,加密,我創建了一個包裝輸入流,以壓縮/加密的形式將數據提供給HDFS。壓縮格式使用GZ,加密格式爲AES256。 在HDFS上將4.4GB csv文件壓縮爲40MB。帶壓縮/加密文件的Hadoop Mapreduce(大尺寸文件)

現在我有一起處理多個壓縮文件的mapreduce作業(java)。 MR作業使用FileInputFormat。 當通過映射器計算分割時,4.4GB壓縮文件(40MB)僅被分配一個分割開始的映射器爲0,分割長度相當於40MB。

如何處理大尺寸的壓縮文件?我發現的一個選擇是實現自定義RecordReader並使用包裝器輸入流來讀取未壓縮的數據並對其進行處理。 由於我沒有文件的實際長度,所以我不知道要從輸入流中讀取多少數據。

如果我從InputStream中讀到最後,那麼當2個映射器被分配到相同的文件時如何處理,如下所述。 如果壓縮文件大小大於64MB,則將爲同一個文件分配2個映射器。 如何處理這種情況。

的Hadoop版本 - 2.7.1

回答

0

壓縮格式應決定牢記,如果該文件將被映射處理減少。因爲,壓縮格式是可拆分的,那麼地圖縮小工作正常。

但是,如果不是可拆分的(在你的情況下gzip不可拆分,並且map reduce會知道它),那麼整個文件將在一個映射器中被處理。這將達到目的,但會有數據局部性問題,因爲一個映射器只會執行該作業,並從其他塊中提取數據。

來自Hadoop權威指南: 「對於大文件,您不應該使用不支持在整個文件上分割的壓縮格式,因爲您丟失了本地化並使MapReduce應用程序非常低效」。

有關更多信息,請參閱Hadoop I/O章節中的部分壓縮。