Hadoop 从REDUCER向多个表写入输出
我可以从reducer向HBase中的多个表写入输出吗?我浏览了不同的博客文章,但我找不到方法,甚至使用了Hadoop 从REDUCER向多个表写入输出,hadoop,mapreduce,hbase,Hadoop,Mapreduce,Hbase,我可以从reducer向HBase中的多个表写入输出吗?我浏览了不同的博客文章,但我找不到方法,甚至使用了MultiTableOutputFormat 我提到这一点: 但无法找出上下文的API签名。编写调用 减速器代码: public class MyReducer extends TableReducer<Text, Result, Put> { private static final Logger logger = Logger.getLogger( MyReduce
MultiTableOutputFormat
我提到这一点:
但无法找出上下文的API签名。编写调用
减速器代码:
public class MyReducer extends TableReducer<Text, Result, Put> {
private static final Logger logger = Logger.getLogger( MyReducer.class );
@SuppressWarnings( "deprecation" )
@Override
protected void reduce( Text key, Iterable<Result> data, Context context ) throws IOException, InterruptedException {
logger.info( "Working on ---> " + key.toString() );
for ( Result res : data ) {
Put put = new Put( res.getRow() );
KeyValue[] raw = res.raw();
for ( KeyValue kv : raw ) {
put.add( kv );
}
context.write( obj, put );
**// I dont know how to give table name here.**
}
}
}
公共类MyReducer扩展了TableReducer{
私有静态最终记录器Logger=Logger.getLogger(MyReducer.class);
@抑制警告(“弃用”)
@凌驾
受保护的void reduce(文本键、Iterable数据、上下文上下文)引发IOException、InterruptedException{
logger.info(“处理-->”+key.toString());
对于(结果:数据){
Put Put=新Put(res.getRow());
KeyValue[]raw=res.raw();
用于(关键值kv:原始){
增加(千伏);
}
context.write(obj,put);
**//我不知道这里怎么给桌子起名字**
}
}
}
要识别表名,应将表名作为键传递给上下文。write(key,put)
方法:
ImmutableBytesWritable key = new ImmutableBytesWritable(Bytes.toBytes("tableName"));
context.write(key, put);
但是,如果您想通过MapReduce作业一次加载大量数据,那么使用MultiTableHFileOutputFormat
可能会很有趣。此输出格式为您需要的每个HBase表创建HFiles,然后您可以使用LoadIncrementalHFiles
工具轻松加载这些文件:
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/multiTableJobResult hbaseTable
您可以在文章中阅读有关MultiTableHFileOutputFormat
的更多信息:是的,没错(+1)我们必须通过上述方法将表作为键传递。如果你是通过mapper写作,那么下面提到的就是方法rowKey是从lineBytes Put Put=new Put(rowKey)生成的hbase rowKey;//创建KeyValue对象put.add(kv);上下文。写(“动作”,放);//写入操作表