hbase中的数据大小增加

时间:2013-09-06 11:14:47

标签: hadoop hbase hdfs sqoop

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

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

  2. HBase表的VERSIONS定义为1.如果我导入相同的内容 来自MySQL的表,文件大小在/ hbase / 增加(几乎翻倍)。虽然HBase表中的行数 保持不变。这似乎很奇怪,因为我插入相同的行 HBase,因此文件大小应该保持不变,类似于行 计数值。

  3. 据我所知,如果我导入相同的行集,第二种情况下的文件大小不应该增加,因为为每个条目维护的max版本应该只有一个。

    任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

根据这个blog

,这取决于
  

所以计算记录大小:KeyValue格式所需的固定部分   =密钥长度+值长度+行长+ CF长度+时间戳+密钥值=(4 + 4 + 2 + 1 + 8 + 1)= 20字节

     

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

     

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

     

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

上例中row1的总大小= 123字节

     

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

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

答案 1 :(得分:1)

&#34;一些开销&#34;在HBase中可以变得非常大,因为每个值也存储密钥,系列,限定符,时间戳,版本和值本身 - 您应该努力使密钥,系列和限定符尽可能短。

此外,您可能希望使用压缩 - Snappy是一个不错的选择(您可以看到this post来进行压缩比较)

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