[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


原文地址:https://www.cnblogs.com/share23/p/9890506.html