泰涨知识 | 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);        }    }}
相关推荐
大模型码小白6 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
延凡科技9 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
wWYy.9 小时前
分布式:数据复制
分布式
ifenxi爱分析10 小时前
爱分析最新报告解读:AI数据基础设施与数据中台的区别
大数据·人工智能
品牌全球行11 小时前
共商共建共享 链接数字未来——“一带一路数字新城(深圳)会客厅筹备办”揭牌仪式在深圳隆重举行
大数据·人工智能
数智化管理手记12 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
ApacheSeaTunnel13 小时前
Apache SeaTunnel AI CLI Benchmark:7 款大模型、100 个 ETL 任务实测,谁真正能跑起来?
大数据·ai·开源·大模型·数据集成·cli·seatunnel·技术分享·数据同步
电商API_1800790524714 小时前
企业ERP进销存场景|京东商品详情接口自动同步方案|凭证鉴权批量调用技术实操
大数据·运维·人工智能·爬虫·数据挖掘·网络爬虫
小稻穗14 小时前
市场调研样本选型坐标系:2026六家国内样本平台能力横向校验
大数据·运维·数据分析
极光代码工作室14 小时前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化