Snappy是可拆分还是不可拆分?

问题描述 投票:11回答:3

根据这个Cloudera post,Snappy IS可拆分。

对于MapReduce,如果您需要可拆分的压缩数据,BZip2,LZO和Snappy格式是可拆分的,但GZip不是。可拆分性与HBase数据无关。

但是从hadoop权威指南来看,Snappy是不可拆分的。 enter image description here

网上也有一些令人信服的信息。有人说这是可拆分的,有些人说不是。

hadoop snappy
3个回答
23
投票

两者都是正确的,但在不同的层次。

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

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

这意味着如果使用Snappy压缩整个文本文件,则该文件不可拆分。但是如果文件中的每个记录都是用Snappy压缩的,那么该文件可以是可拆分的,例如在带有块压缩的Sequence文件中。

更清楚的是,不一样:

<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块的文件是splittables。


3
投票

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


0
投票

我刚刚在HDFS上测试Spark 1.6.2,对于相同数量的工作者/处理器,在简单的JSON文件和由snappy压缩之间:

  • JSON:4个文件,每个12GB,Spark创建388个任务(HDFS块1个任务)(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])

所以Snappy与Spark for JSON无法分开。

但是,如果您使用镶木地板(或ORC)文件格式而不是JSON,这将是可拆分的(即使使用gzip)。

© www.soinside.com 2019 - 2024. All rights reserved.