我正在尝试使用sqoop将数据从mysql导入hbase。mysql表中大约有900万条记录,大小接近1.2gb。hadoop集群的复制因子是3。
以下是我面临的问题:
导入到hbase后的数据大小超过20 gb!!!理想情况下应该接近5gb(1.2g*3+一些开销)
hbase表的版本定义为1。如果我再次从mysql导入同一个表,/hbase/中的文件大小会增加(几乎是原来的两倍)。尽管hbase表中的行数保持不变。这看起来很奇怪,因为我在hbase中插入了相同的行,因此文件大小应该保持不变,类似于行计数值。
据我所知,如果导入相同的行集,则第二种情况下的文件大小不应增加,因为为每个条目维护的最大版本应该只有一个。
任何帮助都将不胜感激。
2条答案
按热度按时间xam8gpfp1#
hbase中的“一些开销”可能会非常大,因为每个值还存储键、族、限定符、时间戳、版本和值本身—您应该努力使键、族和限定符尽可能短。
此外,您可能希望使用压缩-snappy是一个很好的选择(您可以在本文中看到压缩之间的比较)
关于你的第二个问题。再次复制表时,会得到每个值的另一个副本。其他版本将在压实后清除。这是因为hbase将其数据存储在hadoop中,因此一旦写入,这些文件将是只读的。压缩创建只包含所需数据的新文件,并删除不需要的数据/文件
3pmvbmvn2#
这要看情况,根据这个博客
因此要计算记录大小: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
我想你的计算是非常不正确的,也许和我们分享一下你的方案设计,我们就可以算出数学了。