泰涨知识 | 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);        }    }}
相关推荐
大厂技术总监下海12 分钟前
用户行为分析怎么做?ClickHouse + 嵌套数据结构,轻松处理复杂事件
大数据·数据结构·数据库
大厂技术总监下海17 分钟前
大数据生态的“主动脉”:RocketMQ 如何无缝桥接 Flink、Spark 与业务系统?
大数据·开源·rocketmq
2501_9336707925 分钟前
2026年中专大数据专业可考取的证书
大数据
oMcLin38 分钟前
如何在Ubuntu 22.04 LTS上优化PostgreSQL 14集群,提升大数据查询的响应速度与稳定性?
大数据·ubuntu·postgresql
信创天地1 小时前
核心系统去 “O” 攻坚:信创数据库迁移的双轨运行与数据一致性保障方案
java·大数据·数据库·金融·架构·政务
rchmin1 小时前
Distro与Raft协议对比分析
分布式·cap
德彪稳坐倒骑驴1 小时前
Sqoop入门常用命令
数据库·hadoop·sqoop
小辉笔记1 小时前
kafka原理总结
分布式·kafka
zhyf1191 小时前
Max395(ubuntu24.04)AMD显卡GLM-4.7-UD-IQ1-M量化模型部署手册
大数据·elasticsearch·搜索引擎
实战项目1 小时前
分布式协作入侵检测系统的报警信息管理
分布式