MapReduce接口

HBase提供了TableInputFormat、TableOutputFormat、TableMapper和TableReducer类来支持使用MapReduce框架处理HBase上的数据,并提供了TableMapReduceUtil类来初始化一个HBase-MapReduce任务。下面介绍一下这些接口。
TableInputFormat类
TableInputFormat负责将HBase数据按Region进行切片,该类继承自TableInputFormatBase类,TableInputFormatBase类实现了InputFormat类的大部分功能,TableInputFormat只是在其上添加了几个配置接口。TableInputFormat类通过setConf接口进行配置。如果需要自定义HBase的InputFormat类,可以通过重载TableInputFormatBase类的方法进行开发。
TableOutputFormat类
TableOutputFormat类负责将MapReduce任务输出的数据写入HBase表中。TableOutputFormat类同样通过setConf方法进行配置,如通过设置 TableOutputFormat.OUTPUT_TABLE来设置输出的目标表格。
TableMapper类
TableMapper类是一个抽象类,继承自Mapper类,如下所示:

/* @param <KEYOUT> The type of the key. 
@param <VALUEOUT> The type of the value. 
@see org.apache.hadoop.mapreduce.Mapper 
*/ 
public abstract class TableMapper<KEYOUT, VALUEOUT> 
extends Mapper<ImmutableBytesWritable, Result, KEYOUT, VALUEOUT> {

}

TableMapper输入的Key为RowKey的字节码数据,输入的Value为Result类型,表示一行数据。开发者需要重载TableMapper类的map方法来实现自己的Map任务。
TableReducer类
TableReducer类也是一个抽象类,继承自Reducer类,如下所示:

/* @param <KEYIN> The type of the input key. 
@param <VALUEIN> The type of the input value. 
@param <KEYOUT> The type of the output key. 
@see org.apache.hadoop.mapreduce.Reducer 
*/ 
public abstract class TableReducer<KEYIN, VALUEIN, KEYOUT> 
extends Reducer<KEYIN, VALUEIN, KEYOUT, Writable> { 
}

可见,TableReducer与普通的Reducer类没有区别,开发者需要重载TableReducer类的reduce方法来实现自己的Map任务。
TableMapReduceUtil类
TableMapReduceUtil是一个辅助类,用来简化一个HBase-MapReduce作业的配置过程。该类提供了多个方法来初始化map任务和reduce任务。常见的方法如下 :
static void initTableMapperJob(byte[] table, Scan scan, 
Class<? extends TableMapper> mapper, 
Class<?> outputKeyClass, 
Class<?> outputValueClass,
org.apache.hadoop.mapreduce.Job job)
static void initTableReducerJob(String table, 
Class<? extends TableReducer> reducer, 
org.apache.hadoop.mapreduce.Job job)
void setNumReduceTasks(String table,
org.apache.hadoop.mapreduce.Job job)

MapReduce接口示例

下面给出了一个HBase-MapReduce应用实例,该例将一张表中不同的值进行统计,将结果输出到另一张表中。

public class HBaseMapReduceDemo {

public static void main(String[] argv){

if(argv.length < 2){ 
System.exit(0); 
}

String sourceTable = argv[0]; 
String targetTable = argv[1];

Configuration config = HBaseConfiguration.create(); 
Job job = new Job(config,"ExampleReadWrite"); 
job.setJarByClass(HBaseMapReduceDemo.class);

Scan scan = new Scan(); 
scan.setCaching(500); // 在MR作业中,适当设置该值可提升性能 
scan.setCacheBlocks(false); // 在MR作业中,应总为false

TableMapReduceUtil.initTableMapperJob
sourceTable, // 输入表 
scan, // 扫描表配置 
MyMapper.class, // mapper类 
Text.class, // mapper输出Key 
IntWritable.class, // mapper输出Value 
job); 
TableMapReduceUtil.initTableReducerJob
targetTable, // 输出表 
MyTableReducer.class, // reducer类 
job); 
job.setNumReduceTasks(0);

boolean b = job.waitForCompletion(true); 
if (!b) { 
throw new IOException("error with job!"); 

}

public static class MyMapper 
extends TableMapper<Text, IntWritable> {

private final IntWritable ONE = new IntWritable(1); 
private Text text = new Text();

public void map(ImmutableBytesWritable row, Result value, Context context) 
throws IOException, InterruptedException { 
String val = new String(value.getValue(Bytes.toBytes("cf"), 
Bytes.toBytes("attr1"))); 
text.set(val); 
context.write(text, ONE); 

}

public static class MyTableReducer 
extends TableReducer<Text, IntWritable, ImmutableBytesWritable> {

public void reduce(Text key, Iterable<IntWritable> values, Context context) 
throws IOException, InterruptedException { 
int i = 0; 
for (IntWritable val : values) { 
i += val.get(); 

Put put = new Put(Bytes.toBytes(key.toString())); 
put.add(Bytes.toBytes("cf"), Bytes.toBytes("count"), Bytes.toBytes); 
context.write(null, put); 


}

HBase开发的更多相关文章

  1. eclipse+hbase开发环境部署

    一.前言 1. 前提 因为hbase的运行模式是伪分布式,需要用到hdfs,所以在此之前,我已经完成了hadoop-eclipse的开发环境搭建,详细看另一篇文章:hadoop开发环境部署——通过ec ...

  2. HBase开发错误记录(一):java.net.UnknownHostException: unknown host: master

    windows下开发HBase应用程序.HBase部署在linux环境中, 在执行调试时可能会出现无法找到主机,类似异常信息例如以下: java.net.UnknownHostException: u ...

  3. eclipse+HBASE开发环境搭建(已实践)

    开发准备: jdk1.8.45 hbase-1.2.2(windows下和linux个留一份) hadoop-2.7.2(linux一份) Linux系统(centos或其它) Hadoop安装环境 ...

  4. HBase 开发环境搭建(Eclipse\MyEclipse + Maven)

    写在前面的话 首先, 搭建基于MyEclipse的Hadoop开发环境 相信,能看此博客的朋友,想必是有一定基础的了.我前期写了大量的基础性博文.可以去补下基础. 比如, CentOS图形界面下如何安 ...

  5. HBase学习3(win下使用Eclipse搭建hbase开发环境)

    第一步:创建一个java project命名为wujiadong_hbase 第二步:在该工程下创建一个folder命名为lib(储存依赖的jar包) 第三步:将集群中的hbase安装目录下载一份到w ...

  6. HBase开发错误记录(java.net.UnknownHostException: unknown host: hadoop111)

    windows下开发HBase应用程序,HBase部署在linux环境中, 在运行调试时可能会出现无法找到主机,类似异常信息如下: java.net.UnknownHostException: unk ...

  7. hbase开发实例

    1.put/checkAndPut package com.testdata; import java.io.IOException; import org.apache.hadoop.conf.Co ...

  8. HBase学习(十四)LINUX下用Eclipse构建HBase开发环境

    Eclipse,HBase版本号眼下没有发现须要特别指定 1:从HBase集群中复制一份Hbase部署文件,放置在开发端某一文件夹下(如在/app/hadoop/hbase096文件夹下). 2:在e ...

  9. 基于MapReduce的HBase开发

    在伪分布式模式和全分布式模式下 HBase 是架构在 HDFS 上的,因此完全可以将MapReduce 编程框架和 HBase 结合起来使用.也就是说,将 HBase 作为底层“存储结构”, MapR ...

随机推荐

  1. loading上下左右居中

    .loading { width: 50px; height: 60px; text-align: center; font-size: 10px; position:fixed; left:50%; ...

  2. null相关

    本文转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html null代表不确定的对象: Java中,null是一个 ...

  3. 洛谷——P1508 Likecloud-吃、吃、吃

    P1508 Likecloud-吃.吃.吃 题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一 ...

  4. Remove Nth Node From End of List(链表,带测试代码)

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  5. 并行程序设计---cuda memory

    CUDA存储器模型: GPU片内:register,shared memory: host 内存: host memory, pinned memory. 板载显存:local memory,cons ...

  6. Python学习笔记8:标准库之正則表達式

    Python拥有强大的标准库.从如今起,開始学习标准库中提供的一些经常使用功能. 首先看正則表達式(regular expression),它的主要功能是从字符串(string)中通过特定的模式(pa ...

  7. vue2.0 自定义过滤器

    2.0中已经废弃了过滤器,需要我们自定义 <div id="app"> {{message|uppercase}} </div> //过滤器 Vue.fil ...

  8. 江湖问题研究-- intent传递有没有限制大小,是多少?

    出门一步,便是江湖.江湖上有很多流言. 比方这条: intent传递是有限制大小的,详细在40KB左右. 当然也有传言说是1M左右. 数百头母驴为何半夜慘叫? 小卖部安全套为何屡遭黑手? 女生宿舍内裤 ...

  9. 使用Golang利用ectd实现一个分布式锁

    http://blog.codeg.cn/post/blog/2016-02-24-distrubute-lock-over-etcd/ By zieckey · 2016年02月24日 · 1205 ...

  10. js逻辑非同时两次使用 !!null

    今天遇到了“!!null”的写法,百度没有找到直接的解释,翻书在<javascript高级设计>P44找到了相应的解释: 同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数 ...