泰涨知识 | Hadoop的IO操作——压缩/解压缩

一、压缩案例(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);        }    }}
相关推荐
covco4 小时前
矩阵管理系统指南:拆解星链引擎的架构设计与全链路落地实践
大数据·人工智能·矩阵
陕西字符4 小时前
2026 西安 豆包获客优化技术深度解析:企来客科技 AI 全域获客系统测评
大数据·人工智能
virtaitech5 小时前
算力浪费与算力饥渴并存,OrionX社区版免费开放能否破解这一困局?
大数据·人工智能·gpu算力
covco6 小时前
分布式架构实战:全平台矩阵管理系统的技术实现与性能优化
分布式·矩阵·架构
咖啡里的茶i6 小时前
在Docker环境中安装Hadoop cluster 实验报告一
hadoop·docker·容器
青春万岁!!6 小时前
hive模型数据异常-作业调度问题
大数据·数据仓库·hive
QYR-分析6 小时前
压力电气转换器行业市场现状与发展前景分析
大数据·人工智能
人机与认知实验室7 小时前
人机协同的命门:权限与信任
大数据·人工智能
QEasyCloud20229 小时前
领星、聚水潭与金蝶云星空三方系统对接技术方案
大数据
江瀚视野10 小时前
DeepWay深向盈利拐点趋近意味着什么?
大数据·人工智能