`
uestzengting
  • 浏览: 94521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HBase bulkload的一个bug定位

阅读更多
在HBase bulkload过程中,如果rowkey和version都一致,无法取得最新导入的数据。

问题定位:
在HBase里,如果两个HFile中都有相同rowkey和version的数据,是靠HFile的fileinfo里的MAX_SEQ_ID_KEY来判断哪个文件是最新,MAX_SEQ_ID_KEY
越大的文件越新。

1.通过flush写的HFile文件有往fileinfo里面加MAX_SEQ_ID_KEY
public void appendMetadata(final long maxSequenceId, final boolean majorCompaction)
throws IOException {
    writer.appendFileInfo(MAX_SEQ_ID_KEY, Bytes.toBytes(maxSequenceId));    
writer.appendFileInfo(MAJOR_COMPACTION_KEY, Bytes.toBytes(majorCompaction));
    appendTimeRangeMetadata();
}

2.而通过bulkload的HFileOutputFormat方式写的HFile没有往fileinfo里面加MAX_SEQ_ID_KEY

private void close(final HFile.Writer w) throws IOException {
    if (w != null) {
        w.appendFileInfo(StoreFile.BULKLOAD_TIME_KEY, Bytes.toBytes(System .currentTimeMillis()));
        w.appendFileInfo(StoreFile.BULKLOAD_TASK_KEY, Bytes.toBytes(context .getTaskAttemptID().toString()));
        w.appendFileInfo(StoreFile.MAJOR_COMPACTION_KEY, Bytes.toBytes(true)); w.close();
    }
}

3.所以导致bulkload后最新的数据取不到,得在HFileOutputFormat加上MAX_SEQ_ID_KEY才行
0
1
分享到:
评论
8 楼 uestzengting 2013-07-17  
朝阳之辉 写道
你的想法是保证rowkey唯一是吧,我的想法是rowkey是可以任意重复的,这样可以充分发挥hbase的多版本优势,而在bulkload的过程中保证version(时间戳)绝对唯一,这样才不会丢数据,经过我测试,在很少数据量下的bulkload就有可能时间戳重复,如果恰巧rowkey也相同的话,就会丢失数据


hbase的多版本我没觉得是个优势,我觉得是个糟粕,哈哈。它导致存储模型变复杂了,并同时产生过不少bug,不使用也许更好些。
7 楼 朝阳之辉 2013-07-16  
你的想法是保证rowkey唯一是吧,我的想法是rowkey是可以任意重复的,这样可以充分发挥hbase的多版本优势,而在bulkload的过程中保证version(时间戳)绝对唯一,这样才不会丢数据,经过我测试,在很少数据量下的bulkload就有可能时间戳重复,如果恰巧rowkey也相同的话,就会丢失数据
6 楼 uestzengting 2013-07-11  
朝阳之辉 写道
你的version是用的时间戳吧,在数据量非常大的情况下,怎样保证version的绝对唯一呢,如果不是时间戳,就会影响hbase对数据失效的判断吧

是时间戳,我们的数据没有到达rowkey + 时间戳也会重的地步,并且入hbase了以后也不会删除。

如果说在rowkey下用时间戳作为version会导致数据重复,可以将数据存为原rowkey + version + 自增数N位 作为新的rowkey,而version存为时间戳,也就不影响失效判断了。
5 楼 朝阳之辉 2013-07-10  
你的version是用的时间戳吧,在数据量非常大的情况下,怎样保证version的绝对唯一呢,如果不是时间戳,就会影响hbase对数据失效的判断吧
4 楼 hahaiwl 2013-04-11  
uestzengting 写道
这是0.90版的bug,不知道最新的版本有没有修复,我们的办法是在bulkload的时候version增大了点,让它version不一样绕过去了。

谢谢。管用。惊醒梦中人
3 楼 uestzengting 2013-04-10  
这是0.90版的bug,不知道最新的版本有没有修复,我们的办法是在bulkload的时候version增大了点,让它version不一样绕过去了。
2 楼 hahaiwl 2013-04-10  
我也遇到这样的问题,怎么生成,还有怎么设置啊,楼主再详细点,多谢啦
1 楼 朝阳之辉 2013-04-07  
MAX_SEQ_ID_KEY怎么生成?

相关推荐

Global site tag (gtag.js) - Google Analytics