mapreduce生成HFile通过bulkload入hbase库问题

来源:互联网 发布:公司域名备案流程 编辑:程序博客网 时间:2024/05/22 14:22
最近有个需求,要将相同id的记录存储为hbase的一行,于是就将
id做md5后作为rowkey,相同id记录数据以json存储在列中,开始
想用一个mapper和一个reducer搞定的,mapper负责将数据组织好(
以id的md5值做key,整行数据组织成json串做value输出),reducer负责将相同
key的value拼接起来,并write到HFile中。
方法一:
mapper的输入输出格式为LongWritable,Text, Text, Text
reducer的输入输出格式为Text, Text,ImmutableBytesWritable, KeyValue
map阶段没问题,但是到了reduce的时候会出现类型转换异常,Text can't cast to ImmutableBytesWritable
百度了一番,说要map和reduce的输出必须都是ImmutableBytesWritable, KeyValue才行。
于是尝试方法二:
mapper的输入输出格式为LongWritable,Text, ImmutableBytesWritable, KeyValue
reducer的输入输出格式为ImmutableBytesWritable, KeyValue,ImmutableBytesWritable, KeyValue
map和reduce都顺利通过,但是输出到HFile的数据总是缺少,通过
hbase hfile -p -f hftp://ns1nn2/terminal_test/hbase/2016/05/10/data/3eb1ee99f7414255a2762b0fa5bc2631|grep "236857970"
查看其中的一个id对应的数据发现,相同id的数据没有拼接在一起,并且相同id的数据只有一条,
也就是在map阶段就把相同id的数据给过滤成只写一条了,不知道什么原因,猜测写ImmutableBytesWritable, KeyValue
的时候相同key的记录会相互覆盖吧。
方法三:
增加一个job处理相同id记录的json字符串拼接,
job1的mapper的输入输出格式为LongWritable,Text, Text, Text
reducer的输入输出格式为Text, Text, Text, Text
job2的输入路径为job1的reducer的输出路径,
mapper输入输出格式为Text, Text,ImmutableBytesWritable, KeyValue
成功!
0 0