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. Xcode 如何计算整个项目的代码行数

    参考链接:https://www.cnblogs.com/sunfuyou/p/7921538.html 1.打开终端 2.cd 空格 将工程的文件夹拖到终端上,回车,此时进入到工程的路径 此时已经进 ...

  2. 遇到的cannot find module 'xxx' 问题

    昨天配置新项目的环境,明明都npm inatsll都安装了,再次运行的时候一直报错,缺少模块.我以为就一个没安装上,就手动npm install -g 'xxx' :结果一个装好了,又继续蹦出cann ...

  3. 用LCT解一类动态图的问题

    很显然,学过了LCT,大家一定都会用LCT来维护动态树结构了 那么,遇到图问题的时候,是不是也能用lct来解决呢? 解决图问题的时候,我们必须要仍然维护一棵树的形态,否则,lct是做不动的 那么下面来 ...

  4. 品质与合身 无须昂贵 | Tailorwoods在线男装定制

    品质与合身 无须昂贵 | Tailorwoods在线男装定制 北京市朝阳区姚家园北一路八月照相馆2F

  5. 【spring mvc】后台spring mvc接收List参数报错如下:org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.List]: Specified class is an interface

    后台spring mvc接收List参数报错如下:org.springframework.beans.BeanInstantiationException: Failed to instantiate ...

  6. IOS 教你玩转UITableViewController和TableView

    iphone和Ipad开发中UITableViewController和TableView应该是用得比較多得控件. 可是你是会由于写这些控件写得多了而厌烦. 全部怎么让这个控件一直能用.怎么让这个控件 ...

  7. JS里面的call, apply以及bind

    参考了这篇文章:http://www.tuicool.com/articles/EVF3Eb 给几个例子 function add(a,b) { alert(a+b); } function sub( ...

  8. sql的一些知识_高级

    1.视图 http://www.cnblogs.com/wang666/p/7885934.html 2.存储过程 http://www.cnblogs.com/wang666/p/7920748.h ...

  9. Swift----编程语言语法

    1   简单介绍 今天凌晨Apple刚刚公布了Swift编程语言,本文从其公布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的iOS&a ...

  10. js动态函数

    最近项目中使用百度模板引擎baiduTemplate.js,使用动态函数解析模板中代码. 通过new Function([arg1,arg2,...,argN,]functionBody)方式实现动态 ...