zoukankan      html  css  js  c++  java
  • [Compression] Hadoop 压缩


    0. 说明

      Hadoop 压缩介绍 && 压缩格式总结 && 压缩编解码器测试


     1. 介绍

      【文件压缩的好处】

      文件压缩的好处如下:

    1. 减少存储文件所需要的磁盘空间
    2. 加速数据在网络和磁盘上的传输

    2. 压缩编解码器

      【2.1 压缩格式总结】

    压缩比高 压缩速度快
    DEFLATE LZ4
    gzip LZO
    bzip2 Snappy

    3. 测试压缩编解码器 

      【3.1 使用 LZO 编解码器】

      使用 LZO 编解码器需要在 pom.xml 中添加依赖

            <!-- LZO 依赖 -->
            <dependency>
                <groupId>org.anarres.lzo</groupId>
                <artifactId>lzo-hadoop</artifactId>
                <version>1.0.0</version>
            </dependency>

      【3.2 编写测试代码】

    package hadoop.compression;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.io.IOUtils;
    import org.apache.hadoop.io.compress.*;
    import org.apache.hadoop.util.ReflectionUtils;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    /**
     * 测试压缩 && 解压缩
     */
    public class TestCodec {
    
        public static void main(String[] args) {
            // SnappyCodec.class 需要配置 Hadoop,然后进行相关操作
            Class[] clazzes = {
                    DeflateCodec.class,
                    GzipCodec.class,
                    BZip2Codec.class,
                    Lz4Codec.class,
                    LzopCodec.class,
                    SnappyCodec.class
            };
    
            for (Class clazz : clazzes) {
                // 调用压缩方法
                testCompress(clazz);
                // 调用解压缩方法
                testDecompress(clazz);
            }
        }
    
        /**
         * 测试压缩
         */
        public static void testCompress(Class clazz) {
    
            try {
                // 获得当前时间
                long start = System.currentTimeMillis();
    
                Configuration conf = new Configuration();
    
                // 通过反射获取 CompressionCodec 对象
                CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(clazz, conf);
    
                // 获得文件扩展名
                String ext = codec.getDefaultExtension();
    
                // 通过 codec 获取输出流,将文件进行压缩
                CompressionOutputStream cos = codec.createOutputStream(new FileOutputStream("E:/test/codec/sdata.txt" + ext));
    
                // 获取输入流
                FileInputStream fis = new FileInputStream("E:/test/codec/sdata.txt");
    
                IOUtils.copyBytes(fis, cos, 1024);
    
                fis.close();
                cos.close();
    
                // 计算总时长
                System.out.print("压缩编解码器: " + ext + "压缩时间" + (System.currentTimeMillis() - start));
    
                File f = new File("E:/test/codec/sdata.txt" + ext);
                System.out.println("       文件大小: " + f.length());
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
        }
    
        /**
         * 测试解压缩
         *
         * @param clazz
         */
        public static void testDecompress(Class clazz) {
            try {
                // 获得当前时间
                long start = System.currentTimeMillis();
    
                Configuration conf = new Configuration();
    
                // 通过反射获取 CompressionCodec 对象
                CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(clazz, conf);
    
                // 获得文件扩展名
                String ext = codec.getDefaultExtension();
    
                // 通过 codec 获取输入流,将文件进行解压缩
                CompressionInputStream cis = codec.createInputStream(new FileInputStream("E:/test/codec/sdata.txt" + ext));
    
                // 获取输出流
                FileOutputStream fos = new FileOutputStream("E:/test/codec/sdata2.txt");
    
                IOUtils.copyBytes(cis, fos, 1024);
    
                IOUtils.closeStream(fos);
    
                cis.close();
    
                // 计算总时长
                System.out.print("解压缩时间" + (System.currentTimeMillis() - start));
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

      【3.3 测试结果】

      压缩编解码器    压缩时间    文件大小    解压缩时间
      .deflate      1592       1454907     433
      .gz           1218       1454919     438
      .bz2          8603       1391326     57118
      .lz4          79         2700204     95
      .lzo          136        2445355     110
    
      压缩时长    lz4 < lzo < gz < deflate < bz2
      压缩比      lz4 < lzo < gz < deflate < bz2
      解压时长   lz4 < lzo < deflate < gz < bz2

      【3.4 解决 LZO 和 Snappy 的压缩编解码器】 

      1. LZO: 通过添加 Maven 依赖导入相关 Jar 包

      2. Snappy:替换 Hadoop 安装包(在 CentOS 中)

      3. 将 lzo-hadoop.jar 和 lzo-core.jar 放在 /soft/hadoop/share/hadoop/common/lib 目录中

      4. 运行打包好的 Jar 包
      hadoop jar myhadoop-1.0-SNAPSHOT.jar com.hadoop.Compression.TestCodec

      并未进行 Snappy 操作,所以测试结果不包含 Snappy


  • 相关阅读:
    物联网相关开源项目整理
    使用Blynk打造一款物联网产品
    物联网、开源硬件与开源社区
    Spring boot+CXF开发WebService Demo
    vsftp 常见配置测试与故障排除
    Linux vsftpd 配置文件详解
    免费在线文档翻译器
    C#将Word转换成PDF方法总结(基于Office和WPS两种方案)
    微软office web apps 服务器搭建之在线文档预览
    C#把datetime类型的日期转化成年月日或其他格式方法总结
  • 原文地址:https://www.cnblogs.com/share23/p/9890506.html
Copyright © 2011-2022 走看看