Snappy是可分割的还是不可分割的?

19
根据此 Cloudera 帖子,Snappy 是可分割的。
对于 MapReduce,如果您需要压缩的数据可以被分割,则 BZip2、LZO 和 Snappy 格式是可以分割的,但 GZip 不行。可分割性与 HBase 数据无关。
但从 hadoop definitive guide 中可以看到,Snappy 不能被分割。 enter image description here 网上也有一些相互矛盾的信息。有些人说它是可分割的,有些人说不是。

注意到了同样的事情,有趣的是似乎Cloudera是错误的。 - koders
1
他们更改了文档http://www.cloudera.com/documentation/enterprise/latest/topics/admin_data_compression_performance.html,以使其可分割,但仅适用于容器格式。 - mishkin
4个回答

33

两种说法都是正确的,但属于不同的级别。

根据Cloudera博客http://blog.cloudera.com/blog/2011/09/snappy-and-hadoop/

需要注意的一点是,Snappy旨在与容器格式(如序列文件或Avro数据文件)一起使用,而不是直接用于纯文本,因为后者不可分割且无法使用MapReduce并行处理。这与LZO不同,LZO可以索引压缩文件以确定拆分点,从而可以在后续处理中高效地处理LZO文件。

这意味着如果整个文本文件使用Snappy进行压缩,则该文件无法被拆分。但是,如果文件中的每个记录都使用Snappy进行压缩,则文件可能是可拆分的,例如在使用块压缩的序列文件中。

更明确地说,以下内容并不相同:

<START-FILE>
  <START-SNAPPY-BLOCK>
     FULL CONTENT
  <END-SNAPPY-BLOCK>
<END-FILE>
<START-FILE>
  <START-SNAPPY-BLOCK1>
     RECORD1
  <END-SNAPPY-BLOCK1>
  <START-SNAPPY-BLOCK2>
     RECORD2
  <END-SNAPPY-BLOCK2>
  <START-SNAPPY-BLOCK3>
     RECORD3
  <END-SNAPPY-BLOCK3>
<END-FILE>

Snappy块是不可分割的,但是带有Snappy块的文件是可分裂的


4

在Hadoop中,所有可分割的编解码器都必须实现org.apache.hadoop.io.compress.SplittableCompressionCodec接口。根据Hadoop 2.7版本的源代码,我们可以看到org.apache.hadoop.io.compress.SnappyCodec没有实现这个接口,因此我们知道它不支持分割。


4
我刚刚在HDFS上使用Spark 1.6.2进行了测试,对于相同数量的工作进程/处理器,在简单的JSON文件和由snappy压缩的文件之间进行了比较:
- JSON: 4个12GB的文件,Spark创建了388个任务(1个任务由HDFS块生成)(4*12GB / 128MB => 384) - Snappy: 4个3GB的文件,Spark创建了4个任务
Snappy文件是这样创建的:.saveAsTextFile(“/user/qwant/benchmark_file_format/json_snappy”,classOf [org.apache.hadoop.io.compress.SnappyCodec]) 因此,对于JSON,Spark不能使用Snappy进行分割。
但是,如果您使用parquet(或ORC)文件格式而不是JSON,则可以进行拆分(即使使用gzip)。

2
Snappy实际上不能像bzip一样分割,但是当与parquet或Avro等文件格式一起使用时,不会压缩整个文件,而是使用snappy压缩文件格式内部的块。
要了解使用snappy压缩parquet文件时发生的情况,请查看parquet文件的结构(来源link)。

enter image description here

在Parquet文件中,记录被分成行组(基本上是原始文件的子集),每个行组由数据页组成(图像中的列块),每个列块由许多页面组成,在这些页面中,实际记录以编码格式(列式)和元数据存储。当您启用snappy压缩时,它会压缩整个页面!而不是整个文件。基本上,您将获得一个可分割的带有snappy压缩的Parquet。
snappy的优点是它是非常轻量级的压缩编解码器。
注意:行组和列块都有默认大小限制,分别为128MB和1MB(您可以更改这些默认设置),您可以使用不同的压缩编解码器与Parquet,例如gzip。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接