Hadoop框架中的数据压缩

时间:2020-01-09 10:34:35  来源:igfitidea点击:

在存储和处理大数据集的Hadoop框架中,我们将需要存储大文件。这些文件分为多个块,这些块存储在集群中的不同节点中,因此也涉及大量I / O和网络数据传输。为了减少存储需求并减少花费在网络传输上的时间,我们可以看看Hadoop框架中的数据压缩。

可以压缩什么

在Hadoop中使用数据压缩,我们可以在各个步骤中压缩文件,在所有这些步骤中,这将有助于减少存储和传输的数据量。

压缩输入文件

我们可以压缩输入文件本身。这将减少HDFS中的存储空间。这里要考虑的一件事是所使用的压缩格式是否可拆分(有关更多详细信息,请参见"压缩和拆分"部分)。
如果压缩输入文件,则在由MapReduce作业处理时,文件将自动解压缩。根据文件的扩展名,将使用适当的编解码器。

压缩中间图输出

我们可以压缩中间映射输出,因为映射输出已写入磁盘,因此可以保存存储,而且许多映射器的映射输出也都发送到reducer节点,因此跨节点的数据传输也得以减少。

压缩输出文件

我们还可以配置在Hadoop中压缩MapReduce作业的输出。如果要归档输出或者将其发送到其他应用程序以进行进一步处理,这将有助于减少存储空间。

压缩和分裂

当我们在Hadoop中压缩必须由MapReduce作业处理的输入文件时,我们还必须考虑MapReduce作业是否能够将这些压缩块作为单独的拆分读取的可能性。

通常,将文件存储在HDFS中时,它将分为128 MB的块并进行存储。使用该文件作为输入的MapReduce作业将创建与块一样多的输入分割。然后,这些输入拆分将由单独的地图任务并行处理。
例如,如果我们有一个1 GB的文件,它将作为8个数据块存储在HDFS中。使用该文件的MapReduce作业还将创建8个输入分割,然后这些输入分割将由单独的地图任务并行处理。

如果我们有一个压缩的1 GB文件,其中使用的压缩格式无法像gzip一样拆分,则HDFS仍将文件存储为8个单独的块。但是MapReduce作业在处理这些压缩块时将无法为每个块创建输入分割,因为无法在压缩文件中的任意位置读取。

由于在这种情况下无法创建输入分割,因此单个映射任务将处理所有HDFS块。最终结果是我们失去了并行处理的优势,因为只有一个映射任务正在处理所有数据,并且由于所有块都将被传输到运行映射任务的节点,因此也存在数据传输开销。

因此,在压缩输入文件时,必须考虑使用的压缩格式是否可拆分,这一点很重要。

Hadoop中的压缩格式

Hadoop框架中可以使用几种压缩格式。其中一些压缩效果更好(节省更多空间,数据压缩率更高),而另一些压缩和解压缩效果更快(尽管压缩率更低)。
我们还需要考虑压缩格式是否可拆分的事实。

Deflate –这是zlib以及gzip压缩工具使用的压缩算法。文件扩展名是.deflate。

gzip – Gzip提供高压缩率,但不如Lzo或者Snappy快。它是不可拆分的。文件扩展名为.gz。更适合与不经常访问的数据一起使用。

bzip2 – Bzip2提供的压缩率比gzip高,但压缩和解压缩速度却较慢。 Bzip2是Hadoop中唯一具有可拆分支持的压缩格式。在Hadoop框架中,存在一个接口SplittableCompressionCodec,该接口应由能够压缩/解压缩从任意位置开始的流的那些压缩编解码器实现。 BZip2Codec是此接口的唯一实现类。文件扩展名为.bz2.

LZO –针对速度进行了优化,因此压缩率较小。虽然默认情况下不可拆分,但是我们可以索引lzo文件以使其在Hadoop中可拆分。文件扩展名为.lzo。

LZ4 –针对速度进行了优化,因此压缩率较小。它是不可拆分的。虽然有一个库(4MC)可以使lz4文件可拆分。请参阅https://github.com/carlomedas/4mc。文件扩展名为.lz4.

Snappy –更加注重压缩和解压缩的速度,因此压缩率较小。它是不可拆分的。文件扩展名为.snappy。

Zstandard – Zstandard是一种实时压缩算法,可提供高压缩比和高速度。它是不可拆分的。虽然有一个库(4MC)可以使lz4文件可拆分。请参阅https://github.com/carlomedas/4mc。文件扩展名为.zstd。

Hadoop中的压缩编解码器

Hadoop框架提供了压缩-解压缩算法的实现,针对不同的压缩格式有不同的编解码器(压缩器/解压缩器)类。在Hadoop中进行数据压缩时,将使用这些编解码器之一。

Deflate – org.apache.hadoop.io.compress.DefaultCodec或者org.apache.hadoop.io.compress.DeflateCodec(DefaultCodec的别名)。如果看到DefaultCodec的代码,则使用zlib压缩。

Gzip – org.apache.hadoop.io.compress.GzipCodec

Bzip2 – org.apache.hadoop.io.compress.Bzip2Codec

LZ4 – org.apache.hadoop.io.compress.Lz4Codec

Snappy – org.apache.hadoop.io.compress.SnappyCodec

Zstandard – org.apache.hadoop.io.compress.ZstandardCodec

LZO – com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec(对于lzop工具,这是我们应该使用的工具)。

请注意,LZO库的许可方式不同,因此不是Hadoop版本的一部分。我们将必须单独下载LZO的Hadoop编解码器。

压缩带来的性能开销

Hadoop中的数据压缩确实以减少存储和减少数据传输的形式提供了好处,并且在大多数情况下,它超过了开销,但请尝试对数据进行测试以找出最适合数据。

Hadoop中数据压缩的开销在于,添加了一些处理,包括压缩数据,然后在必须处理数据时将其解压缩。以压缩地图输出为例,这样可以节省空间,并且由于将地图任务的输出发送到reducer节点,因此数据传输较少。同时,在压缩地图输出并随后对其进行解压缩时,由于存在额外的处理,因此处理周期也会增加,因此reduce任务可以对其进行处理。