泰涨知识 | 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);        }    }}
相关推荐
专注API从业者3 分钟前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫
V搜xhliang02464 分钟前
AI大模型在临床决策与手术机器人领域的应用
大数据·人工智能·机器人
A__tao8 分钟前
Elasticsearch Mapping 一键生成 Proto 文件(支持嵌套 + 注释过滤)
大数据·elasticsearch·jenkins
Gofarlic_OMS1 小时前
装备制造企业Fluent许可证成本分点典型案例
java·大数据·开发语言·人工智能·自动化·制造
程序员雷欧1 小时前
大模型应用开发学习第八天
大数据·人工智能·学习
liukuang1101 小时前
伊利、蒙牛、飞鹤与光明乳业:存量时代的攻守之道与价值分化
大数据·人工智能·物联网
supericeice2 小时前
创邻科技 AI智算一体机:支持 DeepSeek 671B 与 Qwen3 单机部署,覆盖纯CPU到多GPU多机扩展
大数据·人工智能·科技
智慧景区与市集主理人2 小时前
巨有科技云票务,破解景区五一运营的入园难“效率瓶颈”
大数据·人工智能·科技
媒介发稿小能手3 小时前
技术视角下的品牌传播范式迁移:当“搜索引擎优化”让位于“媒体收录逻辑”
大数据·搜索引擎·ai·产品运营·媒体