根据这个Cloudera post,Snappy IS可拆分。
对于MapReduce,如果您需要可拆分的压缩数据,BZip2,LZO和Snappy格式是可拆分的,但GZip不是。可拆分性与HBase数据无关。
网上也有一些令人信服的信息。有人说这是可拆分的,有些人说不是。
两者都是正确的,但在不同的层次。
根据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。
hadoop中的所有可拆分编解码器都必须实现org.apache.hadoop.io.compress.SplittableCompressionCodec
。看看2.7版本的hadoop源代码,我们看到org.apache.hadoop.io.compress.SnappyCodec
没有实现这个接口,所以我们知道它不可拆分。
我刚刚在HDFS上测试Spark 1.6.2,对于相同数量的工作者/处理器,在简单的JSON文件和由snappy压缩之间:
Snappy文件是这样创建的:.saveAsTextFile("/user/qwant/benchmark_file_format/json_snappy", classOf[org.apache.hadoop.io.compress.SnappyCodec])
所以Snappy与Spark for JSON无法分开。
但是,如果您使用镶木地板(或ORC)文件格式而不是JSON,这将是可拆分的(即使使用gzip)。