onl*_*one 7 compression gzip hadoop hdfs
我最近一直在研究hadoop和HDFS.将文件加载到HDFS时,它通常会将文件拆分为64MB块,并在群集周围分发这些块.除非gzip文件无法执行此操作,因为无法拆分gzip文件.我完全理解为什么会这样(我不需要任何人解释为什么gzip文件不能拆分).但是为什么HDFS不能将纯文本文件作为输入并像普通文件一样拆分,然后分别使用gzip压缩每个拆分?访问任何拆分时,它只是在运行中解压缩.
在我的方案中,每个拆分都是完全独立压缩的.拆分之间没有依赖关系,因此您不需要整个原始文件来解压缩任何一个拆分.这是该补丁采用的方法:https://issues.apache.org/jira/browse/HADOOP-7076,请注意,这不是我想要的.
这似乎很基本......我错过了什么?为什么不能这样做?或者如果可以做到,为什么hadoop开发人员不会忽视这条路线?考虑到我发现有多少人想要在HDFS中分割gzip文件,这似乎很奇怪.
简单的原因是"关注点分离"的设计原则.
如果你按照你的建议做,那么HDFS必须知道文件的实际位和字节是什么意思.还必须使HDFS能够对其进行推理(即提取,解压缩等).一般来说,您不希望在软件中出现这种混合责任.
因此,理解比特含义的"唯一"部分是必须能够读取它的应用程序:通常使用Hadoop的MapReduce部分编写.
正如HADOOP-7076的Javadoc所述(我写了那个东西;)):
永远记住有其他方法:
- 解压缩原始的gzip压缩文件,将其拆分成碎片并重新压缩,然后再将它们提供给Hadoop.
例如: 拆分gzip压缩日志文件而不将未压缩的拆分存储在磁盘上- 解压缩原始的gzip压缩文件并使用不同的可拆分编解码器进行压缩.例如BZip2Codec或根本不压缩.
HTH