代码之家  ›  专栏  ›  技术社区  ›  VikasG

hbase中的数据大小增加

  •  0
  • VikasG  · 技术社区  · 13 年前

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

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

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

    就我的理解而言,如果我导入相同的行集,则第二种情况下的文件大小不应该增加,因为为每个条目维护的最大版本应该只有一个。

    如有任何帮助,我们将不胜感激。

    2 回复  |  直到 13 年前
        1
  •  3
  •   Community Mohan Dere    6 年前

    根据这一点,这取决于 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字节

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

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

    我认为你的计算是非常错误的,也许可以和我们分享你的模式设计,我们可以计算出数学。

        2
  •  1
  •   Arnon Rotem-Gal-Oz    13 年前

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

    此外,您可能需要使用压缩- Snappy 是个不错的选择(你可以看到 this post 用于压缩之间的比较)

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