基于Hadoop平台的数据压缩技术研究

2020-01-02 08:58:18 来源: 作者:xuekanba
摘要:随着电商企业、互联网+、智慧城市等新商业革命的发展和社会网络的广泛应用,带动相关信息的数据量极速增长,从大量的数据中搜索潜在的有效、全面的信息,预测未来的发展趋势显得十分必要。数据量越大挖掘到的价值就越多,进而有助于支持决策。为了提高数据库性能,改进数据库查询效率的同时采用数据压缩技术对数据进行压缩,减少文件所占存储空间并保证在压缩过程中不丢失信息。本文对Hadoop框架进行介绍,并对基于Hadoop的数据压缩技术进行分析和研究,对压缩算法进行比较及使用场景。
关键词:Hadoop;压缩;压缩算法
一、引言
近年来文本、声音、图像等各类信息数据量迅速增长,而人们对数据的研究往往关注于存储效率、存储量、安全性、完整性和带宽等方面,产生的数据会有一定的冗余,而冗余数据也占用了磁盘空间和网络带宽,随着数据量的增大,数据的存储效率和存储量受到限制,导致磁盘和带宽利用率降低。信息技术的普及使产生的数据量持续增长,数据存储的硬件管理愈加复杂,如果不对海量的数据进行处理就难以高效、全面的应用。对大数据的处理优化方式有很多种,本文主要介绍在使用Hadoop平台中对数据进行压缩处理来提高数据处理效率。
Hadoop作为比较通用的海量数据处理平台,提供了一些压缩方法的支持,如果期间的输出数据、中间数据能压缩存储,对系统的I/O性能有所提升。在使用压缩方面,主要考虑压缩速度和压缩文件的可分割性。Hadoop实现了HDFS分布式文件系统和MapReduce计算的核心框架,以一种可靠、高效、可伸缩的方式进行数据处理。构建在Hadoop系统之上的数据分析型应用也越来越多,在数据分析型应用中,数据压缩减少了数据存储量,进而减少了查询中的磁盘I/O量和网络数据传输量。
二、Hadoop框架
Hadoop是一个开源分布式计算平台,能够对大量数据进行分布式处理的软件框架。Hadoop是以一种可靠、高效、可伸缩的方式进行处理的,它维护多个工作数据副本确保能够针对失败的节点重新分布处理;由于其以并行方式工作,通过并行处理加快处理速度;而且能够处理PB级数据。此外,Hadoop依赖于社区服务器,因而成本较低。以Hadoop分布式文件系统HDFS和分布式计算框架MapReduce为核心。在分布式集群中,HDFS存取MapReduce需要的数据,MapReduce负责调度与计算为用户提供了底层细节透明的分布式基础设施。
2.1 HDFS概述及体系架构
HDFS是Hadoop分布式计算中数据存储和管理的基础,一个具有高度容错性的分布式文件系统,是基于流式数据访问和处理超大文件的需求而开发的,可以部署在廉价的硬件设备上。适合存储信息量非常大的文件,并且具备对数据读写的高吞吐量。但是由于Namenode内存大小限制,不适合存储大量小文件,而且HDFS不适于在数据需要经常修改的情况。
Block:将一个文件进行分块,通常是64M。
NameNode:管理数据块映射,处理客户端的读写请求,配置副本策略,保存整个文件系统的目录信息、文件信息及分块信息。
SecondaryNameNode:分担NameNode的工作量,保存对元数据信息的备份。
DataNode:分布在廉价的设备上,用于存储数据块,提供具体的数据存储服务,执行数据块的读写操作。
HDFS系统架构如图2-1所示,
2.2 MapReduce概述及处理框架
MapReduce是一个从海量源数据提取分析元素并返回结果集的编程模型,可以进行大量数据的计算任务可以被分解为多个子任务,这些子任务相对独立,相互之间不会有影响,可以并行处理,处理完这些子任务后,任务处理完成。可解决海量数据的处理问题:如:Top K、频率统计、倒排索引构建(用于关键词搜索)等问题。
MapReduce处理框架如图2-2所示:
三、压缩算法介绍
Hadoop可自动识别压缩格式,压缩文件有相应的压缩格式的扩展名(如gz、bz2、lzo等),Hadoop会根据压缩格式的扩展名自动选择相对应的解码器来解压数据,该过程由Hadoop自动处理。一般来说,根据应用的具体情况来决定所使用的压缩格式,如速度更快、空间最优、压缩比高等不同策略,通过具有代表性的数据集进行测试,找到最佳方案。
3.1 压缩算法
Gzip压缩(*.gz):Hadoop中内置支持的一种压缩方式,该压缩方式在Linux的开发人员和管理员中使用的比较广泛,压缩比较高,压缩/解压速度较快。大部分Linux系统都自带Gzip命令,使用方便,在应用中处理Gzip 格式的文件就和直接处理文本一样。Gzip压缩有一定的局限性,由于其算法本身的原因,无法对Gzip压缩文件进行分块。
Bzip2压缩(*.bz2):支持分块,具有很高的压缩率,Linux系统下自带Bzip2命令。对于相同文件,压缩后尺寸总小于Gzip的压缩结果,但压缩所用时间更长,也就是占用CUP使用率会更多,因此压缩/解压速度慢,不支持native,适合对速度要求不高但需要较高压缩率的时候,可作为MapReduce作业的输出格式,并对将来的使用频率不高的数据进行压缩存档。
LZO压缩(*.lzo):基于Block分块,一个大的文件(在Hadoop上可能会占用多个Block块),就可以由多个MapReduce并行来进行处理;压缩/解压速度快。LZO的压缩比没有Gzip高,不过由于其前2个特性,在Hadoop上使用LZO还是能整体提升集群的性能的,且能准确还原压缩后的数据。使用该压缩需要在Hadoop集群中安装LZO库。
Hadoop对每个压缩格式的支持,见表3-1:
表3-1 Hadoop的压缩格式
压缩格式 | 算法 | 扩展名 | 工具 | 多文件 | 支持分片 |
DEFLATE | DEFLATE | .deflate | N/A | 否 | 否 |
Gzip | DEFLATE | .gz | Gzip | 否 | 否 |
Bzip2 | Bzip2 | .bz2 | Bzip2 | 否 | 是 |
LZO | LZO | .lzo | Lzop | 否 | 是 |
Hadoop自带三种压缩格式:Default、Gzip和Bzip2。Gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,方便好用。Gzip不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式。Default和Gzip是对DEFLATE算法(LZ77和Huffman结合的算法)的实现,对要压缩的文件首先使用LZ77算法的一个变种进行压缩,对得到的结果在使用中Huffman编码的方法进行压缩。Bzip2能够高效的完成文件数据的压缩,传送文件前,可以先用Bzip2打包压缩文件,以减少传送时间,提高效率。虽然Bzip2不是最快的压缩工具,但是它已经足够的快且足够的好用。LZO是一种实时无损压缩算法,在保证实时压缩速率的同时提供适中的压缩率,Hadoop中的LZO不是自带的,如果要支持LZO,需要另外安装配置。
文件的可分割性在Hadoop中十分重要,影响到在执行作业时Map启动的个数,从而会影响到作业的执行效率。
CompressionCodec定义了压缩和解压接口,codec是实现了CompressionCodec接口的一些压缩格式的类。
表3-2 压缩格式的类
压缩格式 | Codec实现类 |
DEFLATE | org.apache.Hadoop.io.compress.Default Codec |
Gzip | org.apache.Hadoop.io.compress.Gzip Codec |
Bzip2 | org.apache.Hadoop.io.compress.Bzip2Codec |
LZO | com.Hadoop.compression.lzo.Lzop Codec |
CompressionCodec通过两个方法来压缩和解压:
通过createOutputStream(OutputStream out)方法获得CompressionOutputStream对象,对数据流进行压缩
通过createInputStream(InputStream in)方法获得CompressionInputStream对象,对数据流进行解压
3.2 使用方式
MapReduce可以在三个阶段中使用压缩。
1) 输入压缩文件。如果输入的文件是压缩过的,则被MapReduce读取时,会根据扩展名自动解压。
2) 对Map输出的中间结果集压缩。
- 在core-site.xml文件中配置
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
- 使用Java代码指定
conf.setCompressMapOut(true);
conf.setMapOutputCompressorClass(GzipCode.class);//指定Map输出结果的编码器
3) 对Reduce输出的最终结果集压缩
a.在core-site.xml文件中配置
<property>
<name>mapred.output.compress </name>
<value>true</value>
</property>
b.使用Java代码指定
conf.setBoolean(“mapred.output.compress”,true);
conf.setClass(“mapred.output.compression.codec”,GzipCode.class,CompressionCodec.class);//指定Reduce输出结果的编码器
四、算法分析
数据压缩的性能指标:压缩/解压速度、压缩率、压缩时间。衡量压缩空间上的变量主要指标是压缩率,而压缩时间是衡量数据压缩性能的一个重要指标。对前文介绍的三种算法进行测试分析,总结如表4-1
压缩率=压缩后数据大小/原始数据大小
压缩速度=原始数据大小/压缩时间
表4-1 压缩算法比较
压缩算法 | 原始文件 | 压缩文件 | 压缩速度MB/S | 压缩率 |
Gzip | 12G | 2.6G | 16.9 | 21.7% |
Bzip2 | 12G | 1.6G | 2.7 | 13.3% |
LZO | 12G | 4.2G | 48.7 | 34.9% |
由表可知,在文件量和设备同等的条件下,Bzip2实现空间最优压缩,适合分布式存储的应用;LZO是最快速度压缩,适合分布式计算的应用;Gzip居于二者之间,所以根据不同的需求选择不同的压缩方式。
在比较几种压缩算法之后,得出对各算法的是使用策略。对大文件应该对整个文件使用提供分片的压缩格式,保证本地优势,提高MapReduce的性能,如Bzip2和索引后可以支持分片的LZO。在Hadoop中使用LZO算法可以减小数据大小和数据的磁盘读写时间,在HDFS中存储压缩数据,可以使集群能够保存更多的数据,延长集群的使用寿命,并且由于MapReduce作业的瓶颈通常在I/O上,存储压缩数据意味着更少的I/O操作,job运行更加的高效,LZO算法既能够被分块,并行处理,速度快。
五、总结
本文简要介绍了当前大数据的增长趋势及优化数据存储方面的主要措施,在大数据环境中,数据压缩是改善处理性能的重要方式之一,压缩能够减少数据占用的存储空间,进而减少数据处理过程的I/O量。对Hadoop的核心模块HDFS和MapReduce及其各自的运行原理进行研究,并对Hadoop常用的三种压缩算法进行研究,并通过测试、比较、分析,得出一个压缩算法使用的通用策略。
参考文献
[1]朱珠.基于Hadoop的海量数据处理模型研究和应用[D].北京:北京邮电大学,2008.
[2]崔杰,李陶深,兰红星.基于Hadoop的海量数据存储平台设计与开发[J].计算机研究与发展,2012.2.
[3]古跟强.云存储中数据压缩技术的研究[D].云南:云南大学,2013.
[4]向丽辉,缪力,张大方.压缩对Hadoop性能影响研究[J].计算机工程与科学,2015.2.
[5]郝树魁.Hadoop HDFS和MapReduce架构浅析[J].邮电设计技术,2012.7.
[6]李明,杨雷,黎山峰.不同压缩算法性能的研究[J].通信技术,2009,42(4):175-177.
[7]王意洁,孙伟东,周松.云计算环境下的分布存储关键技术[J].软件学报,2012,23(4):962−986.
[8]翟岩龙,罗壮,杨凯.基于Hadoop 的高性能海量数据处理平台研究[J].计算机科学,2013,40(3)100-103.
[9]Amrita Upadhyay,Pratibha R. Balihalli.Deduplication and Compression
Techniques in Cloud Design.IEEE International Systems Conference,2011.
