2011-06-20 49 views
0

感谢您对我的问题感兴趣。 在开始之前,我想告诉你,我对Hadoop & HBase很陌生。到目前为止,我发现Hadoop非常有趣,并希望在未来贡献更多。HBase键值压缩?

我主要对提高HBase的性能感兴趣。为此,我修改了HBase的/io/hfile/Hfile.java中的Writer方法,使其能够进行高速缓冲数据汇编,然后直接写入Hadoop,以便稍后由HBase加载。

现在,我试图想出一种方法来压缩键值对,以便可以节省带宽。我已经做了大量的研究来弄清楚如何;然后意识到HBase具有内置的压缩​​库。

我正在查看SequenceFile (1); setCompressMapOutput (2)(已弃用);和类压缩(3)。我还在Apache的MapReduce上找到了一个tutorial

有人可以解释一下“SequenceFile”是什么,以及我如何实现这些压缩库和算法?这些不同的课程和文件对我来说非常混乱。

我真诚感谢您的帮助。

-

超链接:

(1):hadoop.apache.org/common/docs/current/api/org/apache/hadoop/io/SequenceFile.html

( 2):hadoop.apache.org/common/docs/current/api/org/apache/hadoop/mapred/JobConf.html#setCompressMapOutput%28boolean%29

(3):www.apache.org/dist/ hbase/docs/apidocs/org/apache/hadoop/hbase/io/hfile/Compression.html

回答

0

SequenceFile是Hadoop使用的键/值对的流。你可以阅读更多关于它on the Hadoop wiki

4

SequenceFile是在Hadoop中实现的键/值对文件格式。尽管在HBase中用于存储预写日志,但SequenceFile的块压缩实现不是。

Compression类是Hadoop压缩框架的一部分,因此用于HBase的HFile块压缩。

的HBase已经内置了以下类型的压缩,磁盘

  • HFILE块压缩。这使用Hadoop的编解码器框架并支持压缩算法,如LZO,GZIP和SNAPPY。此类型的压缩仅适用于存储在磁盘上的HFile块,因为需要对整个块进行解压缩以检索键/值对。
  • 缓存中键缓存(在HBase术语中称为“数据块编码”) - 参见HBASE-4218。实现的编码算法包括各种类型的前缀和增量编码,并且在编写本文时(HBASE-4676)正在实施编码。数据块编码算法充分利用HFile块中排序后的键之间的冗余性,并仅存储连续键之间的差异。这些算法目前不涉及值,因此对于小值(相对于密钥大小)的情况来说最为有用,例如,计数器。由于这些数据块编码算法的轻量性质,可以仅对块的必要部分进行有效解码以检索所请求的密钥或前进到下一个密钥。这就是为什么这些编码算法对于提高缓存效率有好处。然而,在一些真实世界的数据集上,增量编码还允许在LZO压缩之上节省多达50%(例如,应用增量编码,然后仅使用LZO与LZO),因此也实现了磁盘的显着节省。
  • HBASE-4608中实现了基于自定义字典的预写日志压缩方法。注意:即使SequenceFile用于HBase中的预写日志存储,SequenceFile的内置块压缩也不能用于预写日志,因为用于块压缩的缓存键/值对会导致数据丢失。

HBase RPC压缩是一项正在进行的工作。正如您所提到的,压缩客户端和HBase之间传递的键/值对可以节省带宽并提高HBase性能。这已经在Facebook的HBase版本0.89-fb(HBASE-5355)中实现,但尚未移植到官方的Apache HBase中继。 HBase 0.89-fb支持的RPC压缩算法与Hadoop压缩框架(例如GZIP和LZO)支持的算法相同。

setCompressedMapOutput方法是一种map-reduce配置方法,与HBase压缩无关。

+1

+1 - 应该为大量用户提供信息 –