Hadoop中的压缩与解压缩案例详解

目录
  • 一:压缩的作用
    • 1.1:压缩的原则:
    • 1.2:MR支持的压缩编码
    • 1.3:压缩性能的比较
    • 1.4:压缩方式的选择
    • 压缩可以在MapReduce作用的任意阶段启用。
  •  二:MapReduce数据压缩
  • 三:压缩的参数配置
    • 3.1:设置reduce输出端的压缩格式
    • 3.2:设置map输入的压缩方式
  • 四:文件的压缩与解压缩案例

压缩主要关注点:压缩率,压缩速度,解压速度,是否可切片

一:压缩的作用

压缩技术能够减少底层HDFS读写字节数,减少磁盘IO,提升网络传输效率,因为磁盘IO和网络带宽是Hadoop的宝贵资源;特别是在运行MR程序时,I/O,网络数据传输,shuffle及Merge都要花大量的时间,因此压缩非常重要; 压缩是提升Hadoop运行效率的一种优化策略,使用得当可以提升效率,但是使用不当也可能降低效率

1.1:压缩的原则:

1、计算(运算)密集型任务:大量使用CPU去做数学运算,此时少用压缩
2、IO密集型任务:此时多用压缩         压缩需要消耗CPU资源

1.2:MR支持的压缩编码

DEFLATE                                                不支持切分

Gzip                                                         不支持切分

bzip2                                                         支持切分

LZO                非hadoop自带 安装           支持切分

Snappy                                                    不支持切分

为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器

  • org.apache.hadoop.io.compress.DefaultCodec
  • org.apache.hadoop.io.compress.GzipCodec
  • org.apache.hadoop.io.compress.BZip2Codec
  • com.hadoop.compression.lzo.LzopCodec
  • org.apache.hadoop.io.compress.SnappyCodec

1.3:压缩性能的比较

1.4:压缩方式的选择

1.4.1Gzip压缩

优点:压缩/解压缩比较快,处理Gzip格式文件和直接处理文本一样

缺点:不支持split

应用场景:

        当每个文件压缩之后在130M以内(1个块大小内),考虑。

1.4.2:Bzip2压缩

优点:比Gzip压缩率高,支持split

缺点:压缩/解压速度慢

应用场景:适合对速度要求不高,但需要较高的压缩率  

                   或者输出数据比较大,处理之后的数据需要压缩存档,同时对单个很大的文本文件像压缩减少存储空间,同时需支持split;

1.4.3LZO压缩

优点:压缩/解压缩比较快,合理的压缩率,支持split,是Hadoop最流行的压缩格式,在Linux系统下需要安装

缺点:压缩率比Gzip低一些,Hadoop本身不支持,为了支持split需要建立索引,还需要指定InputFormat为Lzo格式

应用场景:一个很大的文本文件,压缩之后还大于200M以上可以考虑,而且单个文件越大,LZO优点越明显;

1.4.4Snappy压缩

优点: 压缩速度和合理的压缩率

缺点:不支持split,压缩率比gzip低,Hadoop本身不支持需要安装

应用场景:当MapReduce作业的Map输出的数据比较大的时候,作为Map到Reduce的 中间数据的压缩格式,或者作为一个MapReduce作业的输出和另外一个MapReduce作业的输入。

压缩可以在MapReduce作用的任意阶段启用。

 二:MapReduce数据压缩

Map之前的输入端压缩 :(Hadoop自动检查文件扩展名如果扩展名能够匹配就会使用恰当的编解码方式对文件进行压缩和解压)

Mapper输出采用压缩:(可有效改善shuffle过程,此过程是资源消耗最多的环节)

注:(LZO是Hadoop通用的编解码器,其设计目标是达到与硬盘读取速度相当的压缩速度,因此速度是优先考虑的因素,其次是压缩率,LZO的压缩速度是Gzip的5倍,解压速度是Gzip的2倍)

Reducer输出压缩:压缩技术能够减少要存储的数据量,将i磁盘空间。

三:压缩的参数配置

io.compression.codecs   (在core-site.xml中配置)  (map输入前)

mapreduce.map.output.compress(在mapred-site.xml中配置)  (map到reduce)

mapreduce.map.output.compress.codec(在mapred-site.xml中配置)

mapreduce.output.fileoutputformat.compress(在mapred-site.xml中配置)(reduce输出)

mapreduce.output.fileoutputformat.compress.codec(在mapred-site.xml中配置)

mapreduce.output.fileoutputformat.compress.type(在mapred-site.xml中配置)

如果压缩写到了配置文件中则,所有都会进行压缩,如果只是写到了当前程序中,只对当前程序起作用。

3.1:设置reduce输出端的压缩格式

//设置Reduced端输出压缩
FileOutputFormat.setCompressOutput(job,true);
//压缩的结果是BZip2Codec
FileOutputFormat.setOutputCompressorClass(job,BZip2Codec.class);
FileOutputFormat.setOutputCompressorClass(job, SnappyCodec.class);

3.2:设置map输入的压缩方式

//开启map输出压缩
conf.setBoolean("mapreduce.map.output.compress",true);
conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class, CompressionCodec.class);

四:文件的压缩与解压缩案例

public class FileCompress {
    public static void main(String[] args) throws IOException {
        //压缩传入两个参数 path  以及压缩格式
//        compress("E:\\a.txt","org.apache.hadoop.io.compress.BZip2Codec");

        decompress("E:\\a.txt.bz2");

    }

    private static void decompress(String path) throws IOException {
        //1:校验是否能解压    CompressionCodecFactory     A factory that will find the correct codec for a given filename.
        CompressionCodecFactory factory = new CompressionCodecFactory(new Configuration());
        //This class encapsulates a streaming compression/decompression pair.
        CompressionCodec codec = factory.getCodec(new Path(path));
        if (codec == null){
            System.out.println("cannot find codec for file " + path);
            return;
        }
        //2 获取普通输入流,再获取解压输入流
        FileInputStream fis = new FileInputStream(new File(path));
        //允许客户端 重新定义输入流
        CompressionInputStream cis = codec.createInputStream(fis);
        //3:获取输出流
        FileOutputStream fos = new FileOutputStream(new File(path + ".decodec"));

        //4 将压缩输入流写入输出流
        IOUtils.copyBytes(cis , fos, new Configuration());
        //5:关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(cis);
        IOUtils.closeStream(fis);

    }

    private static void compress(String path, String method) throws IOException {
        //1:获取输入流
        FileInputStream fis = new FileInputStream(path);
        //2:获取压缩编码器   编解码器就是算吗
        CompressionCodecFactory factory = new CompressionCodecFactory(new Configuration());
        CompressionCodec codec = factory.getCodecByName(method);
        //3:获取普通输出流,获取压缩输出流     获取编码器的扩展名
        FileOutputStream fos = new FileOutputStream(new File(path + codec.getDefaultExtension()));
        CompressionOutputStream cos = codec.createOutputStream(fos);
        //4:赋值输入流到流输出流
        IOUtils.copyBytes(fis,cos,new Configuration());
        //5 关闭资源
        IOUtils.closeStream(cos);
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);

    }
}

到此这篇关于Hadoop中的压缩的文章就介绍到这了,更多相关Hadoop压缩内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅析Hadoop完全分布式集群搭建问题

    目录 一.Hadoop是什么 二.Hadoop组成 1.Hadoop1.x 2.Hadoop2.x 三.Hadoop集群搭建所需工具(链接如下,自行下载) 四.Hadoop集群配置前期准备 五.Hadoop运行环境搭建 六.Hadoop完全分布式集群环境正式搭建 1.编写集群分发脚本xsync 2.集群配置 3.SSH无密登录配置 4.群起集群 5.集群启动/停止方式总结 6.集群时间同步(必须root用户) 一.Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架

  • Hadoop源码分析四远程debug调试

    1. hadoop远程debug 从文档(3)中可以知道hadoop启动服务的时候最终都是通过java命令来启动的,其本质是一个java程序.在研究源码的时候debug是一种很重要的工具,但是hadoop是编译好了的代码,直接在liunx中运行的,无法象普通的程序一样可以直接在eclipse之类的工具中直接debug运行. 对于上述情况java提供了一种远程debug的方式. 这种方式需要在java程序启动的时候添加以下参数: -agentlib:jdwp=transport=dt_socket

  • Hadoop中的压缩与解压缩案例详解

    目录 一:压缩的作用 1.1:压缩的原则: 1.2:MR支持的压缩编码 1.3:压缩性能的比较 1.4:压缩方式的选择 压缩可以在MapReduce作用的任意阶段启用.  二:MapReduce数据压缩 三:压缩的参数配置 3.1:设置reduce输出端的压缩格式 3.2:设置map输入的压缩方式 四:文件的压缩与解压缩案例 压缩主要关注点:压缩率,压缩速度,解压速度,是否可切片 一:压缩的作用 压缩技术能够减少底层HDFS读写字节数,减少磁盘IO,提升网络传输效率,因为磁盘IO和网络带宽是Ha

  • Python 中闭包与装饰器案例详解

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 1.Python中一切皆对象 这恐怕是学习Python最有用的一句话.想必你已经知道Python中的list, tuple, dict等内置数据结构,当你执行: alist = [1, 2, 3] 时,你就创建了一个列表对象,并且用alist这个变量引用它: 当然你也可以自己定义一个类: class House(object): def __init__(self, are

  • JVM中四种GC算法案例详解

    目录 介绍 引用计数算法(Reference counting) 算法思想: 核心思想: 优点: 缺点: 例子如图: 标记–清除算法(Mark-Sweep) 算法思想: 优点 缺点 例子如图 标记–整理算法 算法思想 优点 缺点 例子 复制算法 算法思想 优点 缺点 总结 介绍 程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行

  • C++中std::allocator的使用案例详解

    标准库中包含一个名为allocator的类,允许我们将分配和初始化分离.使用allocator通常会提供更好的性能和更灵活的内存管理能力.         new有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起.类似的,delete将对象析构和内存释放组合在了一起.我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起.因为在这种情况下,我们几乎肯定知道对象应有什么值.当分配一大块内存时,我们通常计划在这块内存上按需构造对象.在此情况下,我们希望将内存分配和对象构造

  • Vue在echarts tooltip中添加点击事件案例详解

    目录 需求 解决方法 1.设置tooltip 2.定义hookToolTip变量 3.在methods中添加方法 4.完整代码 需求 需要在echarts tooltip点击学校的名称,跳转到详情页面:项目是从上海市---> 某个区----> 具体的学校(在最后一级的tooltip中绑定一个点击事件)  项目是用vue和echarts实现的,echarts是新版本(^5.0.2),并不能把点击事件绑定在window上 解决方法 1.设置tooltip enterable: true, //允许

  • Python中的tkinter库简单案例详解

    目录 案例一 Label & Button 标签和按钮 案例二 Entry & Text 输入和文本框 案例三 Listbox 部件 案例四 Radiobutton 选择按钮 案例五 Scale 尺度 案例六 Checkbutton 勾选项 案例七 Canvas 画布 案例八 Menubar 菜单 案例九 Frame 框架 案例十 messagebox 弹窗 案例十一 pack grid place 放置 登录窗口 TKinterPython 的 GUI 库非常多,之所以选择 Tkinte

  • Android中TelephonyManager类的用法案例详解

    本文以案例形式分析了Android中TelephonyManager类的用法.分享给大家供大家参考.具体如下: 目录结构: main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="ve

  • Java中定时器Timer致命缺点案例详解

    目录 简介 案例1:定时器打印Hello World! 线程不死问题? 案例2:单线程问题 定时器实际应用场景 学习方法心得 总结 简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人没有问题,特别是正在看我博文的小伙伴那更不用说了!!给你们点个狂力赞.接下来就是学习方法了,我发现近期来咨询我问题的小伙伴学习姿势不对,所以我用Java中定时器Time

  • Python中使用Frozenset对象的案例详解

    目录 关于Frozensets 创建一个新的Frozenset对象 一旦创建了Frozenset,你就不能修改它了 与 Frozensets 一起使用的方法 Frozenset可以被转换为其他可迭代类型 Frozenset使用案例 总结 这篇文章将介绍在Python中使用 "frozenset "函数的指南,该函数返回一个新的frozenset类型的Python对象.这些对象类似于Python中的set对象,但有一些关键的区别.本文的所有代码样本都是在Ubuntu 21.04上用Pyt

  • Linux中的bz2压缩格式的实例详解

    Linux中的bz2压缩格式的实例详解 一 语法 bzip2 源文件 压缩为bz2格式,不保存源文件 bzip2 -k 源文件 压缩之后保留原文件 注意:bzip2命令不能压缩目录 bzip2 -d 压缩文件 解压缩,-k保留压缩文件 bunzip2 压缩文件 解压缩,-k保留压缩文件  二 实战 [root@localhost test]# ls abc cdf dirtst [root@localhost test]# bzip2 abc [root@localhost test]# ls

随机推荐