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. 两个 DataTable 读取重复数据

    今天正好用到Excel 导入转换成table , 文件中数据要和数据库里数据进行比对,有重复的抛出重复数据. 和大家分享下,欢迎高手留言指点.有问题可以留言关注! /// <summary> ...

  2. AC日记——最短路 洛谷 P2384

    题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你100000000000000000000000000000000000%10金币w ...

  3. L1-3. 情人节【求第2个、第14个人的名字,设置计数器并标记一下即可】

    L1-3. 情人节 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家. ...

  4. luogu P2746 [USACO5.3]校园网Network of Schools

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...

  5. [CQOI2018] 社交网络

    题目背景 当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分.通常,一个用户在社交网络上发布一条消息(例如微博.状态.Tweet等) 后,他的好友们也可以看见这条消息,并可能转发.转发的消息 ...

  6. 转:关于使用ImageMagick和Tesseract进行简单数字图像识别

    据说Tesseract可是世界排名第三的OCR神器,2010年又更新了3.0版本.Tesseract原先是HP写的,现在Open Source了. 下面介绍怎么用Tesseract配合ImageMag ...

  7. javascript --- 临时构造器F()

    这篇内容也是之前讲到过的,纯属无聊,莫要见怪.~(- ̄▽ ̄)-~(- ̄▽ ̄)-~(- ̄▽ ̄)-~(- ̄▽ ̄)-~(- ̄▽ ̄)- 正如上文所说,如果所有的prototype属性都指向了一个相同的对象,父 ...

  8. CSS3模拟IOS滑动开关

    前言 H5站点需要IOS滑动按钮的效果,想了想似乎CSS3能搞起,就折腾出来了...挺简单的..请看注释 效果 代码 <!DOCTYPE html> <html lang=" ...

  9. KVC技巧二则

    说两个与KVC相关的技巧. 1.KVC与字典 有时候我们需要取出嵌套字典中的某个键的值.例如某个嵌套字典: NSDictionary *dict = @{@"subDict":@{ ...

  10. iOS开发 CGBitmapContextCreate

    最近项目中,需要对图片进行各种操作. 使用CGBitmapContextCreate 创建位图上下文. CG_EXTERN CGContextRefCGBitmapContextCreate(void ...