2016-07-22 79 views
3

一般來說,像Gzip這樣的壓縮格式,如果使用像avro和sequence(文件格式)這樣的容器文件格式,將會使壓縮格式分裂。文件壓縮格式和容器文件格式

這是否意味着容器格式中的塊將根據首選壓縮(如gzip)或其他方式進行壓縮。有人可以解釋這個嗎?謝謝!

嗯,我認爲這個問題需要更新。

更新:

我們有一個簡單的方法來一個大文件轉換成非裂開的文件壓縮格式(如Gzip已)轉換成表示分割文件(使用一個容器文件格式,如Avro中,序列或實木複合地板)由MapReduce處理?

注:我不是故意要求解壓縮文件等解決方法,並再次使用可拆分壓縮格式壓縮數據。

回答

1

對於序列文件,如果指定了BLOCK壓縮,每個塊將使用指定的壓縮編解碼器進行壓縮。塊允許Hadoop在塊級別拆分數據,同時使用壓縮(其中壓縮本身不可拆分)並跳過整個塊而不需要解壓縮它們。

多數此上Hadoop的維基描述:https://wiki.apache.org/hadoop/SequenceFile

塊壓縮鍵/值的記錄 - 鍵和值被收集在 「塊」分別和壓縮。 「塊」的大小是可配置的。

對於阿夫羅這是所有非常相似,以及:https://avro.apache.org/docs/1.7.7/spec.html#Object+Container+Files

對象被存儲在可以被壓縮塊。在塊之間使用同步 標記以允許爲MapReduce處理有效地分割文件 。

因此,每個塊的二進制數據可以被有效地提取或跳過 而不反序列化內容。

將數據從一種格式轉換爲另一種格式最簡單(也是最快)的方式是讓MapReduce爲您完成工作。在本例中:

GZip Text -> SequenceFile

你將有一個地圖只是使用TextInputFormat輸入和輸出SequenceFileFormat工作。通過這種方式,您可以對文件數進行1對1轉換(如果需要更改,請添加減少步驟),並且如果要轉換大量文件,則並行轉換。

+0

容器格式是否可以應用在使用非可分割壓縮格式壓縮的文件之上? – Marco99

+0

術語'容器'有點混亂,它們是'文件格式',所以如果你想把現有的文件轉換成另一種格式,就必須有某種形式的轉換。你不能只是用某種東西來包裝文件。 –

+0

對不起,我感到困惑。通過提及「容器文件格式」,我的意思是隻有像Avro這樣的hadoop文件格式。 – Marco99

0

不知道你在說什麼......但任何文件都可以在任何時候被分割。

爲什麼我這麼說...希望你使用類似Linux或類似的東西。

在Linux上,創建真正存儲在某些文件串聯中的塊設備很容易(不會太多)。

我的意思是:

  • ,只要你想,每一個不同的尺寸的,沒必要OOD,甚至大小爲512個字節倍數等,不論大小,你一分爲許多塊文件你想要的,數學表達splitted_file_size =(desired_size mod 1)。
  • 您定義串接以正確的順序
  • 您定義的符號鏈接,這樣的設備

這樣,你可以有一個大文件中的所有文件塊設備(超過16GiB,比4GiB更多)存儲在一個FAT32分區上(每個文件的4GiB-1字節數限制)......並且可以實時和透明地訪問它......只考慮讀取。

的讀/寫......還有一招(即複雜的一部分),它的工作原理:

  • 分割文件(此時的N * 512個字節的塊)
  • 定義設備驅動程序的參數化(所以它知道如何通過創建多個文件分配更多的塊)

在Linux上我已經上做所有的工作在過去的一些工具(命令行)使用,他們讓你創建一個虛擬容器可以隨時調整大小,這將使用確切大小的文件(包括最後一個)並將其公開爲常規塊設備(您可以在其中執行dd if ... = of ...來填充它)以及與其關聯的虛擬文件。

這樣,你有:

  • 相同大小
  • 的一些不那麼大的文件,他們將舉行
  • 他們在創建/刪除,因爲需要流的真實數據裏(放大/縮小或截斷)
  • 他們面臨的一些問題
  • Accesing文件等常規文件將被所看到的串聯

也許,讓您在其他的形式給出了主意,你所遇到的問題:

  • 而是調整壓縮系統,只是把一個層(多一點點複雜,一個簡單的循環裝置)的那些在飛行和透明的分裂/加入

這樣的工具存在,我不記得名字,對不起!但我記得只有一個(dvd_double_layer。*是在FAT32上):

# cd /mnt/FAT32 
# ls -lh dvd_double_layer.* 
total # 
-r--r--r-- 1 root root 3.5G 2017-04-20 13:10 dvd_double_layer.000 
-r--r--r-- 1 root root 3.5G 2017-04-20 13:11 dvd_double_layer.001 
-r--r--r-- 1 root root 0.2G 2017-04-20 13:12 dvd_double_layer.002 
# affuse dvd_double_layer.000 /mnt/transparent_concatenated_on_the_fly 
# cd /mnt/transparent_concatenated_on_the_fly 
# ln -s dvd_double_layer.000.raw dvd_double_layer.iso 
# ls -lh dvd_double_layer.* 
total # 
-r--r--r-- 1 root root 7.2G 2017-04-20 13:13 dvd_double_layer.000.raw 
-r--r--r-- 1 root root 7.2G 2017-04-20 13:14 dvd_double_layer.iso 

希望這個想法可以幫助你。