(原文地址:http://blog.csdn.net/codemosi/article/category/2777041,转载麻烦带上原文地址。hadoop hive hbase mahout storm spark kafka flume,等连载中,做个爱分享的人)
1:如果有一大票数据比如1000万条,或者批量的 插入HBase的表中,HBase提供的java API 中的PUT方法,一条接一条记录的插入方式效率上就非常慢。
2:如果要 取出HBase一个表里的1000万条数据。用GET一条一条的来,效率也是可想而知,scan的方法批量取出1000万条记录没什么问题,但问题是这个api是在单机上运行的,取庞大的数据效率就有问题了
为解决这种大规模数据的 get 和put 操作的效率问题,HBase提供org.apache.hadoop.hbase.mapreduce这个包,基于hadoop上的mapreduce分布式读取HBase表的解决方案,中国山东找蓝翔 。
2 关键类
1 Class TableMapper<KEYOUT,VALUEOUT>
- java.lang.Object
- org.apache.hadoop.mapreduce.Mapper<ImmutableBytesWritable,Result,KEYOUT,VALUEOUT>
- org.apache.hadoop.hbase.mapreduce.TableMapper<KEYOUT,VALUEOUT>
- org.apache.hadoop.hbase.mapreduce.TableMapper<KEYOUT,VALUEOUT>
- Type Parameters:KEYOUT - The type of the key.VALUEOUT - The type of the value.
2 Class TableReducer<KEYIN,VALUEIN,KEYOUT>
- java.lang.Object
- org.apache.hadoop.mapreduce.Reducer<KEYIN,VALUEIN,KEYOUT,org.apache.hadoop.io.Writable>
- org.apache.hadoop.hbase.mapreduce.TableReducer<KEYIN,VALUEIN,KEYOUT>
- org.apache.hadoop.hbase.mapreduce.TableReducer<KEYIN,VALUEIN,KEYOUT>
- Type Parameters:KEYIN - The type of the input key.VALUEIN - The type of the input value.KEYOUT - The type of the output key.
3 批量存(put)取(get) hbase的表
//1 mapreduce 批量读出 表中所有的id 和 name字段的值。
class HBaseMap extends TableMapper<Text, Text> { @Override
protected void map(ImmutableBytesWritable key, Result value, Context context)
throws IOException, InterruptedException {
Text keyText = new Text(new String( key.get()));
String family = "info";
String qualifier = "name";
byte[] nameValueBytes = value.getValue( family.getBytes(), qualifier
.getBytes());
Text valueText = new Text(new String(nameValueBytes));
context.write(valueText, keyText);
}
}
//2 mapreduce 批量插入 name 和id。
class HBaseReduce extends TableReducer<Text, Text, ImmutableBytesWritable> {
@Override
protected void reduce(Text key, Iterable<Text> value, Context context)
throws IOException, InterruptedException {
String family = "info";
String qualifier = "name";
String keyString = key.toString();
Put put = new Put(keyString.getBytes());
for (Text val : values) {
put.add( family.getBytes(), qualifier.getBytes(), val.toString()
.getBytes());
}
}
}
最后用hadoop的Job api执行这两个mapreduce。打成jar包。放到hadoop上跑。批量存取hbase的数据