泰涨知识 | 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);        }    }}
相关推荐
策知道1 小时前
依托政府工作报告准备省考【经验贴】
大数据·数据库·人工智能·搜索引擎·政务
Henry-SAP1 小时前
SAP(ERP) 组织结构业务视角解析
大数据·人工智能·sap·erp·sap pp
冷崖2 小时前
消息队列-kafka(一)
分布式·kafka
TracyCoder1233 小时前
ElasticSearch内存管理与操作系统(一):内存分配底层原理
大数据·elasticsearch·搜索引擎
cd_949217214 小时前
九昆仑低碳科技:所罗门群岛全国森林碳汇项目开发合作白皮书
大数据·人工智能·科技
Acrelhuang4 小时前
工商业用电成本高?安科瑞液冷储能一体机一站式解供能难题-安科瑞黄安南
大数据·开发语言·人工智能·物联网·安全
小王毕业啦4 小时前
2010-2024年 非常规高技能劳动力(+文献)
大数据·人工智能·数据挖掘·数据分析·数据统计·社科数据·经管数据
言無咎4 小时前
从规则引擎到任务规划:AI Agent 重构跨境财税复杂账务处理体系
大数据·人工智能·python·重构
私域合规研究5 小时前
【AI应用】AI与大数据融合:中国品牌出海获客的下一代核心引擎
大数据·海外获客
大鳥5 小时前
数据仓库知识体系
hive·hadoop