在Hive中进行数据压缩实现高效存储

在Hive中进行数据压缩实现高效存储,第1张

我们介绍了在Hive中组织数据的规则和方法。本节作为《Hadoop从入门到精通》专题的第四章第二节,将主要介绍如何在Hive中进行数据压缩,有哪些可选的数据压缩方法等内容。数据压缩是一种将数据简化为更紧凑形式的机制,以节省存储空间并提高数据传输效率。

 通过数据压缩实现高效存储

数据压缩是文件处理的重要方面,在处理Hadoop支持的数据大小时,这一点变得更加重要。大部分企业在使用Hadoop时,目标都是尽可能高效得进行数据处理,选择合适的压缩编解码器将使作业运行更快,并允许在集群中存储更多数据。

为数据选择正确的压缩编解码器

在HDFS上使用压缩并不像在ZFS等文件系统上那样透明,特别是在处理可拆分的压缩文件时(本章稍后将详细介绍)。使用Avro和SequenceFile等文件格式的优点是内置压缩支持,使压缩几乎对用户完全透明。但是在使用文本等格式时,就会失去这种支持。

问题

评估并确定用于数据压缩的最佳编解码器

解决方案

谷歌的压缩编解码器Snappy提供压缩大小和读/写执行时间的最佳组合。但是,当使用必须支持可拆分性的大型压缩文件时,LZOP是最好的编解码器。

讨论

首先,快速浏览可用于Hadoop的压缩编解码器,如表4.1所示。

在Hive中进行数据压缩实现高效存储,第2张

表4.1压缩编解码器

要正确评估编解码器,首先需要确定评估标准,该标准应基于功能和性能特征。对于压缩,你的标准可能包括以下内容:

空间/时间权衡——通常,计算成本越高的压缩编解码器可以产生更好的压缩比,从而产生更小的压缩输出。

本机压缩支持——是否存在执行压缩和解压缩的本地库?这通常胜过用Java编写的压缩编解码器,没有底层的本机库支持。

在Hive中进行数据压缩实现高效存储,第3张

表4.2 压缩编解码器比较

NaTIve vs Java bzip2

Hadoop添加了对bzip2的原生支持(从版本2.0和1.1.0开始)。本机bzip2支持是默认的,但不支持可拆分性。如果需要可拆分性,就需要启用Java bzip2,可以通过将io.compression .codec.bzip2.library设置为java-builTIn来指定。

接下来,我们来了解编解码器在空间和时间上是如何平衡的。此处使用100 MB(10 ^ 8)的XML文件(来自http://mattmahoney.net/dc/textdata.html的enwik8.zip)来比较编解码器运行时间及其压缩大小,具体测试结果见表4.3。

在Hive中进行数据压缩实现高效存储,第4张

表4.3 100 MB文本文件上压缩编解码器的性能比较

运行测试

当进行评估时,我建议使用自己的数据进行测试,最好是在类似于生产节点的主机上执行测试,这样就可以很好地理解编解码器的预期压缩和运行时间。

要确保集群已启用本机编解码器,你可以通过运行以下命令来检查:

$ hadoop checknaTIve -a

空间和时间的结果说明了什么?如果将尽可能多的数据压入集群是首要任务,并且允许较长的压缩时间,那么bzip2可能是适合的编解码器。如果要压缩数据但要求在读取和写入压缩文件时引入最少的CPU开销,则应该考虑LZ4。任何寻求压缩和执行时间之间平衡的企业都不会考虑bzip2的Java版本。

拆分压缩文件很重要,但必须在bzip2和LZOP之间进行选择。原生bzip2编解码器不支持拆分,Java bzip2 TIme可能会让大多数人放弃。bzip2优于LZOP的唯一优势是其Hadoop集成比LZOP更容易使用。

在Hive中进行数据压缩实现高效存储,第5张

图4.4 单个100 MB文本文件的压缩大小(较小的值更好)

在Hive中进行数据压缩实现高效存储,第6张

图4.5单个100 MB文本文件的压缩和解压缩时间(较小的值更好)

虽然LZOP似乎看起来是最优的选择,但还是需要做一些改进,正如下文所述。

总结

最适合的编解码器取决于你的需求和标准。如果不关心拆分文件,LZ4是最有前途的编解码器,如果想要拆分文件,LZOP就是最应该关注的。

此外,我们还需要考虑数据是否需要长期存储。如果长时间保存数据,你可能希望最大限度地压缩文件,我建议使用基于zlib的编解码器(例如gzip)。但是,由于gzip不可拆分,因此将它与基于块的文件格式(如Avro或Parquet)结合使用是明智的,这样数据仍然可以拆分,或者调整输出大小使其在HDFS中占用一个块,这样就不需要考虑是否可拆分。

请记住,压缩大小将根据文件是文本还是二进制而有所不同,具体取决于其内容。要获得准确的数字,需要针对自己的数据运行类似的测试。

对HDFS中的数据进行压缩有许多好处,包括减小文件大小和更快的MapReduce作业运行时。许多压缩编解码器可用于Hadoop,我根据功能和性能对它们进行了评估。接下来,让我们看看如何压缩文件并通过MapReduce,Pig和Hive等工具使用它们。

使用HDFS,MapReduce,Pig和Hive进行压缩

由于HDFS不提供内置的压缩支持,因此在Hadoop中使用压缩可能是一项挑战。此外,可拆分压缩不适合技术水平不高的初学者,因为它并不是Hadoop开箱即用的功能。如果正在处理压缩到接近HDFS块大小的中型文件,以下方法将是在Hadoop中压缩优势最明显和最简单的方法。

问题

希望在HDFS中读取和写入压缩文件,并将其与MapReduce,Pig和Hive一起使用。

解决方案

在MapReduce中使用压缩文件涉及更新MapReduce配置文件mapred-site.xml并注册正在使用的压缩编解码器。执行此 *** 作后,在MapReduce中使用压缩输入文件不需要额外的步骤,并且生成压缩的MapReduce输出是设置mapred.output.compress和mapred.output.compression.codec MapReduce属性的问题。

讨论

第一步是弄清楚如何使用本章前面评估的编解码器来读取和写入文件。本章详细介绍的所有编解码器都与Hadoop捆绑在一起,但LZO / LZOP和Snappy除外,如果想使用这三种编解码器,需要自己下载并构建。

要使用压缩编解码器,首先需要知道它们的类名,如表4.4所示。

在Hive中进行数据压缩实现高效存储,第7张

表4.4 编解码器类

在HDFS中使用压缩

如何使用上表中提到的任何一种编解码器压缩HDFS中的现有文件?以下代码支持这样做:

在Hive中进行数据压缩实现高效存储,第8张

编解码器缓存使用压缩编解码器的一个开销是创建成本很高。当使用Hadoop ReflectionUtils类时,与创建实例相关的一些开销将缓存在ReflectionUtils中,这将加速后续创建编解码器。更好的选择是使用CompressionCodecFactory,它本身提供编解码器缓存。

读取此压缩文件就像编写一样简单:

在Hive中进行数据压缩实现高效存储,第9张

超级简单。既然可以创建压缩文件,那么让我们看看如何在MapReduce中使用。

在MapReduce中使用压缩

要在MapReduce中使用压缩文件,需要为作业设置一些配置选项。为简洁起见,我们假设在此示例中使用了identity mapper和reducer:

在Hive中进行数据压缩实现高效存储,第10张

使用未压缩I/O与压缩I/O的MapReduce作业之间的唯一区别是前面示例中的三个带注释的行。

不仅可以压缩作业的输入和输出,而且中间map输出也可以压缩,因为它首先输出到磁盘,最终通过网络输出到reducer。map输出的压缩有效性最终取决于发出的数据类型,但一般情况下,我们可以通过进行此更改来加速某些作业进程。

为什么不必在前面的代码中为输入文件指定压缩编解码器?默认情况下,FileInputFormat类使用CompressionCodecFactory来确定输入文件扩展名是否与已注册的编解码器匹配。如果找到与该文件扩展名相关联的编解码器,会自动使用该编解码器解压缩输入文件。

MapReduce如何知道要使用哪些编解码器?需要在mapred-site.xml中指定编解码器。 以下代码显示了如何注册上述提到的所有编解码器。请记住,除了gzip,Deflate和bzip2之外,所有压缩编解码器都需要构建并在集群上可用,然后才能注册:

在Hive中进行数据压缩实现高效存储,第11张

现在,你已经使用MapReduce掌握了压缩,是时候了解Hadoop堆栈信息了。因为压缩也可以与Pig和Hive一起使用,让我们看看如何使用Pig和Hive镜像完成MapReduce压缩。

在Pig中使用压缩

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/dianzi/2560116.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-06
下一篇 2022-08-06

发表评论

登录后才能评论

评论列表(0条)

保存