Hadoop压缩机制及实操

简介: Hadoop压缩机制及实操

0x00 文章内容


  1. Hadoop压缩机制
  2. 代码实操

压缩是一种通过特定的算法来减小计算机文件大小的机制。这种机制是一种很方便的发明,尤其是对网络用户,因为它可以减小文件的字节总数,使文件能够通过较慢的互联网连接实现更快传输,此外还可以减少文件的磁盘占用空间。

——摘自百度百科


简而言之,通过一定的算法对数据进行特殊编码,使得数据存储的空间更小,此过程称为压缩,反之为解压缩,与Windows和Mac或者手机的压缩类似。


0x01 Hadoop压缩机制


1. 压缩的关键

a. 无论使用哪种压缩工具,都需要权衡时间和空间,要么时间长空间少,要么时间短空间大

b. 在大数据领域,特别需要考虑压缩文件的可分割性,它会影响到在执行作业时Map启动的个数,从而会影响到作业的执行效率!

c. Hadoop会自动识别压缩格式。如果压缩的文件有相应压缩格式的扩展名(比如lzo,gz,bzip2 等)。Hadoop会自动选择相对应的解码器来解压数据,我们只需要确保输入的压缩文件有扩展名即可。


2. Hadoop支持的压缩工具

a. Hadoop支持的编码/解码器如下表


image.png


b. 常见的有:DEFLATE(默认)、gzip、bzip以及Snappy

c. 性能比较(摘自ABM):


image.png


因此我们可以得出:


Bzip2压缩效果明显是最好的,但是bzip2压缩速度慢,可分割。

Gzip压缩效果不如Bzip2,但是压缩解压速度快,不支持分割。

LZO压缩效果不如Bzip2和Gzip,但是压缩解压速度最快!并且支持分割!

所有的压缩算法都显示出一种时间空间的权衡,更快的压缩和解压速度通常会耗费更多的空间。在选择使用哪种压缩格式时,我们应该根据自身的业务需求来选择。


下图是在本地压缩与通过流将压缩结果上传到BI的时间对比:


image.png


0x02 代码实操


1. 原理

a. 通过反射的方式,对应的类如下

   gzip => org.apache.hadoop.io.compress.GzipCodec
   bzip => org.apache.hadoop.io.compress.BZipCodec
   snappy => org.apache.hadoop.io.compress.SnappyCodec
   DEFLATE => org.apache.hadoop.io.compress.DefaultCodec


b. 在选择压缩方式时,替换掉相应的类即可。

2. 代码及校验

a. 完整代码

package com.shaonaiyi.hadoop.filetype.compress;
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.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils;
import java.io.*;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/17 10:28
 * @Description Hadoop压缩机制
 */
public class CompressTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //压缩
        compress("blockByte.txt", "org.apache.hadoop.io.compress.GzipCodec");
        //解压
//        decompress(new File("blockByte.txt.gz"));
    }
    private static File compress(String fileName, String compressClassName) throws ClassNotFoundException, IOException {
        Class<?> codecClass = Class.forName(compressClassName);
        Configuration configuration = new Configuration();
        CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, configuration);
        File fileOut = new File(fileName + codec.getDefaultExtension());
        fileOut.delete();
        OutputStream out = new FileOutputStream(fileOut);
        CompressionOutputStream cout = codec.createOutputStream(out);
        File fileIn = new File(fileName);
        InputStream in = new FileInputStream(fileIn);
        IOUtils.copyBytes(in, cout, 4096, false);
        in.close();
        cout.close();
        return fileOut;
    }
    private static void decompress(File file) throws IOException {
        Configuration configuration = new Configuration();
        CompressionCodecFactory factory = new CompressionCodecFactory(configuration);
        CompressionCodec codec = factory.getCodec(new Path(file.getName()));
        if (codec == null) {
            System.out.println("找不到文件->" + file);
            return;
        }
        File fileOut = new File(file.getName() + "-dec.txt");
        InputStream in = codec.createInputStream(new FileInputStream(file));
        OutputStream outputStream = new FileOutputStream(fileOut);
        IOUtils.copyBytes(in, outputStream, 4096, false);
        in.close();
        outputStream.close();
    }
}


b. 压缩后,发现项目路径下多了一个blockByte.txt.gz文件

image.png


c. 解压后,发现项目路径下多了一个blockByte.txt.gz-dec.txt文件

image.png


0xFF 总结


  1. 压缩机制是非常有必要的,必须要懂。
  2. 在MapReduce代码里怎么使用呢?设置上即可,如GzipCodec


  FileOutputFormat.setCompressOutput(job, true);
  FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);


image.png


3. 参考文章:Hadoop 压缩实现分析

相关文章
|
存储 分布式计算 资源调度
41 Hadoop的HA机制
41 Hadoop的HA机制
61 0
41 Hadoop的HA机制
|
5月前
|
分布式计算 算法 Hadoop
Hadoop支持的压缩编码
【6月更文挑战第9天】
52 8
|
5月前
|
存储 分布式计算 算法
Hadoop性能优化数据压缩和编码
【6月更文挑战第8天】
68 6
|
1月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
42 1
|
1月前
|
分布式计算 Hadoop Unix
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
42 1
|
1月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
37 1
|
5月前
|
存储 分布式计算 算法
|
6月前
|
存储 分布式计算 Hadoop
hadoop中压缩及存储常见格式图解
hadoop中压缩及存储常见格式图解
75 0
|
6月前
|
存储 分布式计算 大数据
【大数据技术Hadoop+Spark】Spark RDD设计、运行原理、运行流程、容错机制讲解(图文解释)
【大数据技术Hadoop+Spark】Spark RDD设计、运行原理、运行流程、容错机制讲解(图文解释)
405 0
|
分布式计算 资源调度 Hadoop
Hadoop基础学习---5、MapReduce概述和WordCount实操(本地运行和集群运行)、Hadoop序列化
Hadoop基础学习---5、MapReduce概述和WordCount实操(本地运行和集群运行)、Hadoop序列化

相关实验场景

更多
下一篇
无影云桌面