0

感谢您对我的问题感兴趣。在开始之前,我想让您知道我对 Hadoop 和 HBase 非常陌生。到目前为止,我发现 Hadoop 非常有趣,并希望在未来做出更多贡献。

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

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

我目前正在查看 SequenceFile (1);setCompressMapOutput (2)(已弃用);和类压缩(3)。我还找到了关于 Apache 的 MapReduce的教程。

有人可以解释什么是“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

4

2 回答 2

4

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

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

HBase 已经内置了以下类型的压缩:

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

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 压缩无关。

于 2012-10-27T09:07:50.803 回答
0

SequenceFile 是 Hadoop 使用的键/值对流。您可以在 Hadoop wiki 上阅读有关它的更多信息。

于 2011-06-20T21:11:22.427 回答