溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Hadoop中如何壓縮Codec

發(fā)布時間:2021-12-09 15:51:51 來源:億速云 閱讀:125 作者:小新 欄目:云計算

小編給大家分享一下Hadoop中如何壓縮Codec,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

作為輸入

            當(dāng)壓縮文件作為MapReduce的輸入時,MapReduce將自動通過擴展名找到相應(yīng)的Codec對其解壓。

作為輸出

            當(dāng)MapReduce的輸出文件需要壓縮時,可以更改mapred.output.compress為true,mapred.output.compression.codec為想要使用的codec的類名稱,當(dāng)然你可以可以在代碼中指定,通過調(diào)用FileOutputFormt的靜態(tài)方法去設(shè)置這兩個屬性:

package com.hadoop.codecs;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;

public class CodecDemo {
    public static void main(String[] args) throws Exception {
        if (args.length!=2){
            System.exit(-1);
        }
        Job job=new Job();
        job.setJarByClass(CodecDemo.class);
        job.setJobName("CodecDemo");

        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        job.setMapperClass(MyMapper.class);
        job.setCombinerClass(MyReducer.class);
        job.setReducerClass(MyReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

	//設(shè)置輸出壓縮開啟
        FileOutputFormat.setCompressOutput(job, true);
	//設(shè)置壓縮類:GzipCodec
        FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);

        System.exit(job.waitForCompletion(true)?0:1);

    }
}

Hadoop中如何壓縮Codec

Hadoop中如何壓縮Codec

使用CompressionCodes解壓縮

/*
使用CompressionCodes解壓縮CompressionCodec有兩個方法可以方便的壓縮和解壓。
壓縮:通過createOutputStream(OutputStream out)方法獲得CompressionOutputStream對象
解壓:通過createInputStream(InputStream in)方法獲得CompressionInputStream對象
從命令行接受一個CompressionCodec實現(xiàn)類的參數(shù),然后通過ReflectionUtils把實例化這個類,調(diào)用CompressionCodec的接口方法對標(biāo)準(zhǔn)輸出流進行封裝,封裝成一個壓縮流,通過IOUtils類的copyBytes方法把標(biāo)準(zhǔn)輸入流拷貝到壓縮流中,最后調(diào)用CompressionCodec的finish方法,完成壓縮。
*/
package com.hadoop.codecs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils;

public class Compressors {
    public static void main(String[] args) throws Exception {
        String codecClassName = args[0];
        Class<?> codecClass = Class.forName(codecClassName);
        Configuration conf = new Configuration();
        CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf);

        CompressionOutputStream out = codec.createOutputStream(System.out);
        IOUtils.copyBytes(System.in, out, 4096, false);
        out.finish();
    }
}

使用CompressionCodecFactory解壓縮

/*
    如果你想讀取一個被壓縮的文件的話,首先你得先通過擴展名判斷該用哪種codec,當(dāng)然有更簡便得辦法,CompressionCodecFactory已經(jīng)幫你把這件事做了,通過傳入一個Path調(diào)用它得getCodec方法,即可獲得相應(yīng)得codec。
    注意看下removeSuffix方法,這是一個靜態(tài)方法,它可以將文件的后綴去掉,然后我們將這個路徑做為解壓的輸出路徑。CompressionCodecFactory能找到的codec也是有限的,默認(rèn)只有三種org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DefaultCodec,如果想添加其他的codec你需要更改io.compression.codecs屬性,并注冊codec。


*/
package com.hadoop.codecs;  

import org.apache.hadoop.conf.Configuration;  
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 java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.net.URI;  
  
public class FileDecompressor {  
	public static void main(String[] args) throws Exception {  
		String uri = args[0];  
		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:" + 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(in);  
			IOUtils.closeStream(out);  
		}  
	}  
}

以上是“Hadoop中如何壓縮Codec”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI