Hbase 先插入然后把这段数据删除,然后再插入这段数据,插入不进去

1 我向Hbase中插入了一天的数据 
2 我向HBase中删除了这天的数据,rowKey以日期开通,删除数据的代码如图(图一)
3 然后我再向HBase中插入这天数据,发现插入不进去。
 
为什么,如何使得能够再次插入数据?
1465196103025.png

fish - Hadooper

赞同来自: Hagrid

HBase的Delete不是直接删除数据所对应的文件位置内容,而是一个标记删除动作。 即,在删除的时候,加上一条类似<delete, cell, timestamp>的记录。在下一次major compact之前,这条delete记录跟真实的数据记录,比如<cell, timestamp1>,都存在于HBase的存储当中。   当读取的时候,<delete, cell, timestamp>跟<cell, timestamp1>都会被读取出来,以timestamp最大的最为最终返回个用户的结果(timestamp比delete这个小的,都被认为是删除掉的)。

mopishv0 - 高级开发工程师@美团

赞同来自: Hagrid

put和delete的时间戳相同? 如果是这样的话put和delete都会作为keyvalue对象保存在服务端,在你查询的时候,会查找出这两个对象,一个为写入一个为删除,删除时间戳等于写入时间戳,会被认为记录已经被删除。 另外major compact,一方面是异步的,另一方面,如果storefile数量少也不能触发compact。  

Hagrid

赞同来自:

再次插入数据的代码:贴错代码了,我再试试

fish - Hadooper

赞同来自:

reInsert函数里面,这个puts一直是个空的ArrayList吧?

Hagrid

赞同来自:

贴错代码了。insert是这样的。puts列表是我第一次插入时使用的全局变量。

fish - Hadooper

赞同来自:

整个puts队列中的记录所对应的这些timestamp,比你delete所指定的那些timestamp,要大还是小?

fish - Hadooper

赞同来自:

不要一模一样的,把后面put的timestamp都加1试试。

Hagrid

赞同来自:

@fish,我只是把第一次的puts列表保持在全局变量了而已(图),当我按题中删除代码删除这天数据后,再次插入这个puts列表就插不进去了。

Hagrid

赞同来自:

怎么加呢,老师,没有这个方法。

Hagrid

赞同来自:

改了时间戳之后是能够插进去的。不过这个时间戳是每个cell都有记录的吧,这样改太蛮烦了,老师能不能从原理上解释一下为啥第二次插入插不进去呢?

Hagrid

赞同来自:

手动改时间戳,然后插入一条数据的结果

Hagrid

赞同来自:

把那个改时间戳的减去1去掉之后,确实插不进去。

Hagrid

赞同来自:

  这样触发major compaction 行吧,试试~~

Hagrid

赞同来自:

 hBaseAdmin.majorCompact(tableName);之后并没有效果.....

fish - Hadooper

赞同来自:

恩... 你如果在hbase shell通过命令触发major compact,然后是否可以呢?

要回复问题请先登录注册