hfile到hbase

去年年底留下的一个问题,我当时查找错误时,就觉得这个问题肯定是我使用的方法不对,绝对不是hbase的bug。可当时大家都要保证稳定过年,所以也就没有找人帮我来查找这个问题。


具体是我将大文件通过写入hfile,然后再load到hbase中。但是我发现hbase中几乎没什么key value了。count得到的数目是对的,但是通过key找value时是找不到的。而我反查hfile也没发现有问题。


那个时候就把相应的一些任务转到读mapreduce任务了。

前几天两位同事一起发现了原因。具体是因为,我当时写入hfile文件时,由于我没有定义partitiner,所以出现了一个hfile的part文件中的key和另外一个hfilepart文件中的key出现交叉现象。这个时候,去hbase查找时,只有特别少的一部分可以查找,因为hbase默认是按照key排序的,如果开始一block找不到,就不会再去找了。


哎,看来还是我对hadoop的东西不了解导致的。其实当时我查找时已经发现了这个问题,发现不同的hfile文件中间key会交叉。但是我缺少进一步的认识,所以想不到那么多。


按照同事的说法,我把key在partitioner进行了排序。然后就好了。哎,真是TMD啊。


其实,我知道原来的key从mapper输出后不会是排序的,可是在生成hfile文件时,还有一个keyvaluereducer.class调用,我还以为这里面会进行排序的。看来我还是没有对reducer理解正确,reducer会处理相同的key进行merge,但是它无法控制都是那些key到一个reducer,所以出来的文件key会出现交叉。


所以说,要好好看看hadoop,要好好理解和思考。

你可能感兴趣的:(mapreduce,hadoop,hbase,任务,merge)