0

我正在尝试使用 sqoop 将数据从 MySQL 导入 HBase。MySQL 表中有大约 900 万条记录,大小接近 1.2GB。hadoop集群的复制因子是3。
以下是我面临的问题:

  1. 导入hbase后数据大小超过20GB!!!理想情况下,它应该接近 5GB(1.2G*3 + 一些开销)

  2. HBase 表的 VERSIONS 定义为 1。如果我再次从 MySQL 导入同一个表,/hbase/ 中的文件大小会增加(几乎翻倍)。尽管 HBase 表中的行数保持不变。这看起来很奇怪,因为我在 HBase 中插入了相同的行,因此文件大小应该保持不变,类似于行计数值。

据我了解,如果我导入与为每个条目维护的最大版本相同的行集,则第二种情况下的文件大小不应增加。

任何帮助将不胜感激。

4

2 回答 2

3

根据这个博客,这取决于

所以计算记录大小: KeyValue 格式所需的固定部分 = Key Length + Value Length + Row Length + CF Length + Timestamp + Key Value = ( 4 + 4 + 2 + 1 + 8 + 1) = 20 Bytes

KeyValue 格式所需的可变部分 = 行 + 列族 + 列限定符 + 值

所需总字节数 = 固定部分 + 可变部分

因此,对于上面的示例,让我们计算记录大小: 第一列 = 20 + (4 + 4 + 10 + 3) = 41 字节 第二列 = 20 + (4 + 4 + 9 + 3) = 40 字节 第三列 = 20 + (4 + 4 + 8 + 6) = 42 字节

上例中第 1 行的总大小 = 123 字节

要存储 10 亿条此类记录,所需空间 = 123 * 10 亿 = ~ 123 GB

我认为您的计算非常不正确,也许与我们分享您的架构设计,我们可以计算出数学。

于 2013-09-06T11:23:24.610 回答
1

“一些开销”在 HBase 中可能会变得相当大,因为每个值还存储键、族、限定符、时间戳、版本和值本身——你应该努力使键、族和限定符尽可能短.

此外,您可能希望使用压缩 - Snappy是一个不错的选择(您可以查看这篇文章以比较压缩之间的内容)

关于你的第二个问题。当您再次复制表格时,您将获得每个值的另一个副本。压缩后其他版本将被清除。这是因为 HBase 将其数据存储在 Hadoop 中,因此一旦写入文件就是只读的。压缩创建仅包含所需数据的新文件并删除不需要的数据/文件

于 2013-09-06T20:34:32.507 回答