1. 程式人生 > >HDFS中檔案的壓縮與解壓

HDFS中檔案的壓縮與解壓

檔案的壓縮有兩大好處:1、可以減少儲存檔案所需要的磁碟空間;2、可以加速資料在網路和磁碟上的傳輸。尤其是在處理大資料時,這兩大好處是相當重要的。

  下面是一個使用gzip工具壓縮檔案的例子。將檔案/user/hadoop/aa.txt進行壓縮,壓縮後為/user/hadoop/text.gz

package com.hdfs;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionCodecFactory;
import org.apache.hadoop.io.compress.CompressionInputStream;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils;

public class CodecTest {
    //壓縮檔案
    public static void compress(String codecClassName) throws Exception{
        Class<?> codecClass = Class.forName(codecClassName);
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
        //指定壓縮檔案路徑
        FSDataOutputStream outputStream = fs.create(new Path("/user/hadoop/text.gz"));
        //指定要被壓縮的檔案路徑
        FSDataInputStream in = fs.open(new Path("/user/hadoop/aa.txt"));
        //建立壓縮輸出流
        CompressionOutputStream out = codec.createOutputStream(outputStream);  
        IOUtils.copyBytes(in, out, conf); 
        IOUtils.closeStream(in);
        IOUtils.closeStream(out);
    }
    
    //解壓縮
    public static void uncompress(String fileName) throws Exception{
        Class<?> codecClass = Class.forName("org.apache.hadoop.io.compress.GzipCodec");
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
        FSDataInputStream inputStream = fs.open(new Path("/user/hadoop/text.gz"));
         //把text檔案裡到資料解壓,然後輸出到控制檯  
        InputStream in = codec.createInputStream(inputStream);  
        IOUtils.copyBytes(in, System.out, conf);
        IOUtils.closeStream(in);
    }
    
    //使用副檔名來推斷二來的codec來對檔案進行解壓縮
    public static void uncompress1(String uri) throws IOException{
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
        
        Path inputPath = new Path(uri);
        CompressionCodecFactory factory = new CompressionCodecFactory(conf);
        CompressionCodec codec = factory.getCodec(inputPath);
        if(codec == null){
            System.out.println("no codec found for " + uri);
            System.exit(1);
        }
        String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension());
        InputStream in = null;
        OutputStream out = null;
        try {
            in = codec.createInputStream(fs.open(inputPath));
            out = fs.create(new Path(outputUri));
            IOUtils.copyBytes(in, out, conf);
        } finally{
            IOUtils.closeStream(out);
            IOUtils.closeStream(in);
        }
    }
    
    public static void main(String[] args) throws Exception {
        //compress("org.apache.hadoop.io.compress.GzipCodec");
        //uncompress("text");
        uncompress1("hdfs://master:9000/user/hadoop/text.gz");
    }

}


首先執行77行進行壓縮,壓縮後執行第78行進行解壓縮,這裡解壓到標準輸出,所以執行78行會再控制檯看到檔案/user/hadoop/aa.txt的內容。如果執行79行的話會將檔案解壓到/user/hadoop/text,他是根據/user/hadoop/text.gz的副檔名判斷使用哪個解壓工具進行解壓的。解壓後的路徑就是去掉副檔名。

  進行檔案壓縮後,在執行命令./hadoop fs -ls /user/hadoop/檢視檔案資訊,如下:

1 [[email protected] bin]$ ./hadoop fs -ls /user/hadoop/
2 Found 7 items
3 -rw-r--r--   3 hadoop supergroup   76805248 2013-06-17 23:55 /user/hadoop/aa.mp4
4 -rw-r--r-- 3 hadoop supergroup 520 2013-06-17 22:29 /user/hadoop/aa.txt 5 drwxr-xr-x - hadoop supergroup 0 2013-06-16 17:19 /user/hadoop/input 6 drwxr-xr-x - hadoop supergroup 0 2013-06-16 19:32 /user/hadoop/output 7 drwxr-xr-x - hadoop supergroup 0 2013-06-18 17:08 /user/hadoop/test
8 drwxr-xr-x - hadoop supergroup 0 2013-06-18 19:45 /user/hadoop/test1 9 -rw-r--r-- 3 hadoop supergroup 46 2013-06-19 20:09 /user/hadoop/text.gz

第4行為壓縮之前的檔案,大小為520個位元組。第9行為壓縮後的檔案,大小為46個位元組。由此可以看出上面講的壓縮的兩大好處了。

我喜歡,駕馭著程式碼在風馳電掣中創造完美!我喜歡,操縱著程式碼在隨必所欲中體驗生活!我喜歡,書寫著程式碼在時代浪潮中完成經典!每一段新的程式碼在我手中誕生對我來說就象觀看剎那花開的感動! 歡迎分享與轉載 0

相關推薦

liunx系統檔案壓縮

zip格式 壓縮: zip -r [目標檔名].zip [原檔案/目錄名] 解壓: unzip [原檔名].zip 注:-r引數代表遞迴 tar格式(該格式僅僅打包,不壓縮) 打包:tar -cvf [目標檔名].tar [原檔名/目錄名] 解包:tar -xvf [原檔名]

C++的位移操作以實現檔案壓縮(實現哈夫曼對檔案壓縮時做的一個小測試)

因為以前基本上沒用過位移操作,所以這裡做了一個小測試,加深了一下對位移的理解 相關概念:        因為C++中對檔案的操作常用的就是按位元組來進行讀取。下面對檔案的讀寫進行舉例(這是我常用的方式,大家也可以用其它方法讀取):   首先包含相關標頭檔案:     

用Huffman樹實現檔案壓縮

用Huffman樹實現檔案的壓縮與解壓 我們先來了解一下什麼是Huffman樹? 我們平常所使用的Zip等壓縮工具都是藉助Huffman樹實現的,Huffman是一種特殊的二叉樹,它是一種加權路徑最短的二叉樹, 因此也稱為最優二叉樹。 (下面用一

HDFS壓縮壓縮機制

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; imp

Java實現檔案壓縮

Java實現ZIP的解壓與壓縮功能基本都是使用了Java的多肽和遞迴技術,可以對單個檔案和任意級聯資料夾進行壓縮和解壓,對於一些初學者來說是個很不錯的例項。 zip扮演著歸檔和壓縮兩個角色;gzip並不將檔案歸檔,僅只是對單個檔案進行壓縮,所以,在UNIX平

shell命令之檔案壓縮(常用)

.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是壓縮!) .gz 解壓1:gunzip FileName.gz 解壓2:gzip -d Fil

linux 檔案壓縮

檔案壓縮與解壓檔案的壓縮與解壓,也是我們日常中經常用到的操作,如,我們會經常從網上下載各種檔案進行進行安裝,而大部分檔案都是經過壓縮的。下面來學習四個常用的壓縮命令。gzip特點:1.只能壓縮檔案,不能壓縮目錄2.不保留原始檔[[email protected] t

Linux檔案壓縮命令

 對許多使用者來說,在DOS和Windows環境下利用工具軟體ARJ、Winzip等,壓縮或解壓檔案是比較容易的事。但是,在Linux中如何對檔案進行壓縮與解壓呢?本文基於Red Hat 6.0,介紹了

Linux檔案壓縮

壓縮解壓檔案很常用,經常會忘記。最好的方法是每次用的時候都去查一下,用多了相信就會熟悉了。列舉下面常用的壓縮和解壓命令,以備查詢: 1.幾種壓縮檔案格式 *.z:compress 程式壓縮的檔案。 *.bz2:bzip2程式壓縮的檔案。 *.gz:gzip程式壓縮的檔案。

HDFS檔案壓縮

檔案的壓縮有兩大好處:1、可以減少儲存檔案所需要的磁碟空間;2、可以加速資料在網路和磁碟上的傳輸。尤其是在處理大資料時,這兩大好處是相當重要的。   下面是一個使用gzip工具壓縮檔案的例子。將檔案/user/hadoop/aa.txt進行壓縮,壓縮後為/user/hado

大資料Linux命令之檔案檢視大小、系統情況命令、壓縮

一、實時檢視檔案內容 Linux 中有一個tail命令,常用來顯示一個檔案的最後n行文件內容 但更多情況下,我們要在伺服器端執行程式,並且需要實時監控執行日誌,這時候有什麼辦法實時滾動顯示log檔案內容? 這裡可以利用tail命令加引數f實現:tail用於顯示指

ubuntu之壓縮檔案

ubuntu之壓縮與解壓檔案 安裝壓縮工具 sudo apt-get install rar 安裝解壓工具 sudo apt-get install unrar .tar 解包: tar xvf xxx.tar 打包: tar cvf xxx.tar dirname

Linux:03---Terminal高階命令(檔案壓縮):gzip、bzip2、tar

提示: gzip、bzip2:只能用於單個檔案的壓縮與解壓,不能壓縮或者解壓目錄 tar可用於多個檔案的壓縮與解壓 一般情況下:小檔案的壓縮用gzip,大檔案的壓縮用bzip2 一、gzip 1.概念:對字尾為.gz的檔案進行壓縮或者解壓  

Linux下使用gzip壓縮檔案

Linux下gzip命令是用來壓縮檔案的。gzip不僅可以用來壓縮大的、較少使用的檔案以節省磁碟空間,還可以和tar命令一起構成Linux作業系統中比較流行的壓縮檔案格式。據統計,gzip命令對文字檔案有60%~70%的壓縮率。 gzip命令的格式是: gzip [option] [file] gz

檔案操作工具類: 檔案/目錄的建立、刪除、移動、複製、zip壓縮.

FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import jav

檔案操作工具類: 檔案/目錄的建立、刪除、移動、複製、zip壓縮

FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File;

huffman演算法實現檔案壓縮

本文采用哈夫曼編碼的方式進行檔案的壓縮和解壓縮,主要原理是通過huffman編碼來表示字元,出現次數多的編碼短,出現次數少的編碼長,這樣整體而言,所需的總的bit位是減少的。但是當大部分字元出現的

Linux作業系統,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的壓縮

zip格式 壓縮: zip -r [目標檔名].zip [原檔案/目錄名] 解壓: unzip [原檔名].zip 注:-r引數代表遞迴 tar格式(該格式僅僅打包,不壓縮) 打包:tar -cvf [目標檔名].tar [原檔名/目錄名] 解包:tar -xvf [原檔名].tar

ZLIB.DLLBLOB變數壓縮函式的使用方法

最近碰上不少朋友問變數壓縮的問題,這裡整理一下。 函式申明: Function Long compress (Ref blob Destination, Ref ulong DestLen, Ref blob Source, ulong SourceLen ) Library

java tar.gz 格式多檔案打包壓縮

問題背景:開發中,我們時常會遇到對檔案進行儲存或傳輸的問題,但如果傳輸儲存的檔案較大,浪費磁碟空間不說,還會大大影響程式執行效率。於是便引出了這篇文章的主題,關於檔案打包與壓縮的問題。這裡“打包”是指,將多個檔案合成一個檔案;“壓縮”是指,把檔案的二進位制程式碼