snappycat: A command line tool to decompress snappy files produced by Hadoop

By Shaform, Fri 06 November 2015, in category Projects

Hadoop, snappy, snappycat, Spark

最近在學習 Spark 的時候常會接觸到 Snappy 壓縮而成的檔案。雖然在 Spark 裡只要用 sc.textFile 就可以直接讀取。可是有時也想把檔案下載到 local 端處理。

然而因為 Hadoop 的檔案格式不是單純的 Snappy,所以要讀取就會有些麻煩。

稍微找一下現存的解法似乎都是直接用 Java 去連結 Hadoop 的程式庫,感覺在設置上有些複雜。而且發現目前使用的某個工具似乎在遇到空的 Snappy flie 時會有錯誤產生。 所以利用空閒的時間稍微研究了一下檔案格式。

簡單來說,Hadoop 會把每個檔案分成許多個 blocks,而每個 block 各自獨立使用 Snappy 壓縮。在壓縮後的 block 前面,會附上兩個 32-bit 的數字,其中第一個是解壓縮後 block 的大小。第二個則是壓縮後的大小,也就是接在這數字後面的那串資料的大小。

由於 Spark 存檔案時會把檔案分成許多 partitions,如果資料量太小的話,有的 partition 可能是空的。此時這個空檔案裡只會含兩個 32-bit 的 0。

處理了這些問題後就寫成了一個很短的 C++ 程式: snappycat

用法也很簡單,可以把所有檔案當成參數輸入:

./snappycat DIRECTORY/*.snappy

也可以用 standard input 輸入:

cat DIRECTARY/*.snappy | snappycat

程式會把解壓縮的結果直接輸出到 standard output,所以如果想把檔案存下來則需如下所示:

./snappycat DIRECTORY/*.snappy > output.txt