一、压缩案例(DEFLATE)
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.io.compress.DeflateCodec;import org.apache.hadoop.util.ReflectionUtils;
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;
/** * MApRedce代码在执行时候会涉及节点和节点之间的数据传输 * 1.在数据传输过程中,文件的大小是比较大好,还是比较小好?为什么?如何做 * 小好,网络开销小,压缩(解压缩) * Hadoop压缩格式有6种:使用Java实现(Deflate、gzip、bzip2)、其它工具实现(LZO、LZ4、Snappy) * 2.数据在内存中是什么形式,在网络传输中是什么形式 * Java对象;二进制 * 3.在网络传输时是什么类型,即采用了什么数据结构 * SequenceFile、MapFile */public class demo1_压缩_deflate { /** * Compression所有的压缩解压缩类(可以理解为compress是各个压缩解压缩类的父类) */ public static void main(String[] args) throws ClassNotFoundException, IOException {
//创建连接 Configuration conf = new Configuration(); //指定压缩方式DeflateCodec,即使用什么压缩类 String codecClassName = "org.apache.hadoop.io.compress.DeflateCodec"; //通过Class.forName将上一步的字符串加载为类 Class<?> codecClass = Class.forName(codecClassName);
//创建Compression/DeflateCodec这样的压缩工具 //CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass,conf); DeflateCodec codec = (DeflateCodec)ReflectionUtils.newInstance(codecClass,conf);
//输入数据流 FileInputStream fin = new FileInputStream("./BigData培训教材.pdf"); //输出数据流 FileOutputStream fout = new FileOutputStream("./demo1.deflate"); //压缩输出流 CompressionOutputStream comOut = codec.createOutputStream(fout);
//开始压缩 //fin表示输入流,comOut表示压缩输出流,1024表示大小,true表示压缩完成后自动关闭所有流 IOUtils.copyBytes(fin,comOut,1024,true); }}
二、解压案例(DEFLATE)
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.CompressionInputStream;import org.apache.hadoop.io.compress.DeflateCodec;import org.apache.hadoop.util.ReflectionUtils;
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;
public class demo2_解压_deflate { public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建连接 Configuration conf = new Configuration(); //创建解压类,方法一 DeflateCodec codec = new DeflateCodec(); ReflectionUtils.setConf(codec,conf);
/*方法二 //创建解压类,方法二 String codecClassName = "org.apache.hadoop.io.compress.DeflateCodec"; Class<?> codecClass = Class.forName(codecClassName); DeflateCodec codec = (DeflateCodec)ReflectionUtils.newInstance(codecClass,conf); */ /*方法三 //创建解压类,方法三 String codecClassName = "org.apache.hadoop.io.compress.DeflateCodec"; Class<?> codecClass = Class.forName(codecClassName); CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass,conf); */
//输入流 FileInputStream fin = new FileInputStream("./demo1.deflate"); //输出流 FileOutputStream fout = new FileOutputStream("./demo2.pdf");
//解压流 CompressionInputStream comIn = codec.createInputStream(fin); //开始解压 IOUtils.copyBytes(comIn,fout,1024,true); }}
三、使用工厂类解压案例
(CompressionCodecFactory)
import org.apache.hadoop.conf.Configuration;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 java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;
public class demo3_工厂类_解压_CompressionCodecFactory {
public static void main(String[] args) throws IOException { //创建连接 Configuration conf = new Configuration(); //实例化工厂类 CompressionCodecFactory factory = new CompressionCodecFactory(conf); //方法一:通过文件后缀决定使用哪一个编解码器Codec CompressionCodec codec = factory.getCodec(new Path("./demo1.deflate")); //方法二:通过编解码器类名决定使用哪一个编解码器Codec //CompressionCodec codec = factory.getCodecByName("DeflateCodec"); //方法三:通过编解码器类名决定使用哪一个编解码器Codec //CompressionCodec codec = factory.getCodecByClassName("org.apache.hadoop.io.compress.DeflateCodec");
//判断是否有编解码器 if (codec==null){ //打印提示 System.out.println("no codec"); //结束程序,退出代码(exit code)为1 System.exit(1); } //打印提示,使用的是哪一个编解码器 System.out.println("codec ==> "+codec.toString()); //打印提示,打印文件后缀 System.out.println(codec.getDefaultExtension());
//输入流 FileInputStream fin = new FileInputStream("./demo1.deflate"); //输出流 FileOutputStream fout = new FileOutputStream("./demo3_3.pdf");
//解压流 CompressionInputStream comIn = codec.createInputStream(fin); //开始解压 IOUtils.copyBytes(comIn,fout,1024,true); }}
四、使用压缩池进行压缩
import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.io.IOUtils;import org.apache.hadoop.io.compress.*;
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;
/** * 什么是压缩池? * CodecPool、Compressor,重用压缩程序和解压缩程序 * 压缩池的作用是什么? * 重用压缩程序和解压缩程序,尽量缩减系统创建编解码对象的开销 */
public class demo4_压缩池 { public static void main(String[] args) throws IOException { //创建连接 Configuration conf = new Configuration();
//实例化工厂类 CompressionCodecFactory factory = new CompressionCodecFactory(conf); //指定编解码器 CompressionCodec codec = factory.getCodecByName("DeflateCodec");
//创建一个空的压缩池对象实例compressor Compressor compressor = null; try { //给压缩池对象compressor赋值,即赋编解码器codec compressor = CodecPool.getCompressor(codec); //输入路径 FileInputStream fin = new FileInputStream("BigData培训教材.pdf"); //输出路径 FileOutputStream fout = new FileOutputStream("./demo4.deflate"); //压缩流 CompressionOutputStream comOut = codec.createOutputStream(fout); //开始压缩 IOUtils.copyBytes(fin,comOut,1024,false); }finally { //取消压缩池对象的赋值 CodecPool.returnCompressor(compressor); } }}