您好,登錄后才能下訂單哦!
小編給大家分享一下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); } }
使用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è)資訊頻道!
免責(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)容。