1、先看一个标准的hbase作为数据读取源和输出源的样例:

View Code JAVA
1
2
3
4
5
6
7
8
Configuration conf = HBaseConfiguration.create();
Job job = new Job(conf, "job name ");
job.setJarByClass(test.class);
Scan scan = new Scan();
TableMapReduceUtil.initTableMapperJob(inputTable, scan, mapper.class,Writable.class, Writable.class, job);
TableMapReduceUtil.initTableReducerJob(outputTable, reducer.class, job);
job.waitForCompletion(true);

首先创建配置信息和作业对象,设置作业的类。这些和正常的mapreduce一样,唯一不一样的就是数据源的说明部分,TableMapReduceUtil的initTableMapperJob和initTableReducerJob方法来实现。

用如上代码:
数据输入源是hbase的inputTable表,执行mapper.class进行map过程,输出的key/value类型是 ImmutableBytesWritable和Put类型,最后一个参数是作业对象。需要指出的是需要声明一个扫描读入对象scan,进行表扫描读取数 据用,其中scan可以配置参数,这里为了例子简单不再详述。
数据输出目标是hbase的outputTable表,输出执行的reduce过程是reducer.class类,操作的作业目标是job。与map比 缺少输出类型的标注,因为他们不是必要的,看过源代码就知道mapreduce的TableRecordWriter中write(key,value) 方法中,key值是没有用到的。value只能是Put或者Delete两种类型,write方法会自行判断并不用用户指明。

接下来就是mapper类:

View Code JAVA
1
2
3
4
5
6
7
8
9
10
11
public class mapper extendsTableMapper<KEYOUT, VALUEOUT> {public void map(Writable key, Writable value, Context context)throws IOException, InterruptedException {//mapper逻辑context.write(key, value);}}
}

继承的是hbase中提供的TableMapper类,其实这个类也是继承的MapReduce类。后边跟的两个泛型参数指定类型是mapper输 出的数据类型,该类型必须继承自Writable类,例如可能用到的put和delete就可以。需要注意的是要和initTableMapperJob 方法指定的数据类型一直。该过程会自动从指定hbase表内一行一行读取数据进行处理。

然后reducer类:

View Code JAVA
1
2
3
4
5
6
7
8
public class countUniteRedcuer extendsTableReducer<KEYIN, VALUEIN, KEYOUT> {public void reduce(Text key, Iterable<VALUEIN> values, Context context)throws IOException, InterruptedException {//reducer逻辑context.write(null, put or delete);}
}

reducer继承的是TableReducer类。后边指定三个泛型参数,前两个必须对应map过程的输出key/value类型,第三个必须是 put或者delete。write的时候可以把key写null,它是不必要的。这样reducer输出的数据会自动插入outputTable指定的 表内。

2、有时候我们需要数据源是hdfs的文本,输出对象是hbase。这时候变化也很简单:

View Code JAVA
1
2
3
4
5
6
7
8
9
10
11
Configuration conf = HBaseConfiguration.create();
Job job = new Job(conf, "job name ");
job.setJarByClass(test.class);job.setMapperClass(mapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
FileInputFormat.setInputPaths(job, path);TableMapReduceUtil.initTableReducerJob(tableName,reducer.class, job);

你会发现只需要像平常的mapreduce的作业声明过程一样,指定mapper的执行类和输出key/value类型,指定 FileInputFormat.setInputPaths的数据源路径,输出声明不变。便完成了从hdfs文本读取数据输出到hbase的命令声明过 程。 mapper和reducer如下:

View Code JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class mapper extends Mapper<LongWritable,Writable,Writable,Writable> {public void map(LongWritable key, Text line, Context context) {//mapper逻辑context.write(k, one);}
}
public class redcuer extendsTableReducer<KEYIN, VALUEIN, KEYOUT> {public void reduce(Writable key, Iterable<Writable> values, Context context)throws IOException, InterruptedException {//reducer逻辑context.write(null, put or delete);}
}

mapper还依旧继承原来的MapReduce类中的Mapper即可。同样注意这前后数据类型的key/value一直性。

3、最后就是从hbase中的表作为数据源读取,hdfs作为数据输出,简单的如下:

View Code JAVA
1
2
3
4
5
6
7
8
9
10
Configuration conf = HBaseConfiguration.create();
Job job = new Job(conf, "job name ");
job.setJarByClass(test.class);
Scan scan = new Scan();
TableMapReduceUtil.initTableMapperJob(inputTable, scan, mapper.class,Writable.class, Writable.class, job);
job.setOutputKeyClass(Writable.class);
job.setOutputValueClass(Writable.class);
FileOutputFormat.setOutputPath(job, Path);
job.waitForCompletion(true);

mapper和reducer简单如下:

View Code JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class mapper extendsTableMapper<KEYOUT, VALUEOUT>{public void map(Writable key, Writable value, Context context)throws IOException, InterruptedException {//mapper逻辑context.write(key, value);}}
}public class reducer extendsReducer<Writable,Writable,Writable,Writable>  {public void reducer(Writable key, Writable value, Context context)throws IOException, InterruptedException {//reducer逻辑context.write(key, value);}}
}

最后说一下TableMapper和TableReducer的本质,其实这俩类就是为了简化一下书写代码,因为传入的4个泛型参数里都会有固定的参数类型,所以是Mapper和Reducer的简化版本,本质他们没有任何区别。源码如下:

View Code JAVA
1
2
3
4
5
6
7
public abstract class TableMapper<KEYOUT, VALUEOUT>
extends Mapper<ImmutableBytesWritable, Result, KEYOUT, VALUEOUT> {}public abstract class TableReducer<KEYIN, VALUEIN, KEYOUT>
extends Reducer<KEYIN, VALUEIN, KEYOUT, Writable> {}

好了,可以去写第一个wordcount的hbase mapreduce程序了。

ps:另外详细的读写优化可以看之后的一篇,更为详尽的内容看这里

hbase MapReduce程序样例入门相关推荐

  1. S7-200Smart 恒压供水程序样例+485通讯样例 + 触 摸屏样例子

    S7-200Smart 恒压供水程序样例+485通讯样例 + 触 摸屏样例子. 1.此程序样例为一拖二恒压供水样例,采用S7-200Smart PLC和smart 700触摸屏人机与abb变频器485 ...

  2. S7-200Smart 恒压供水程序样例+485通讯样例 + 触摸屏样例子

    S7-200Smart 恒压供水程序样例+485通讯样例 + 触摸屏样例子. 1.此程序样例为一拖二恒压供水样例,采用S7-200Smart PLC和smart 700触摸屏人机与abb变频器485通 ...

  3. 安川机器人DX200运输带同步程序样例

    安川机器人DX200运输带同步程序样例,自己做的,在生产中.发电子邮箱 17100625757785033永***j

  4. 全套S7-1200一拖三恒压供水程序样例+PID样例+触摸屏样例

    全套S7-1200一拖三恒压供水程序样例+PID样例+触摸屏样例 . 1.此程序采用S7-1200PLC和KTP1000PN触摸屏人机执行PID控制变频器实现恒压供水. 包括plc程序,触摸屏程序,项 ...

  5. 04-ABB工业机器人中断程序样例

    前段时间一个项目需要机器人将自己的坐标定时发送给上位机,我师父随手写了一个中断样例,在这里分享一下: 首先介绍两个RAPID指令: 1.IDelete:删除中断,用于取消或者删除中断预定. 2.CON ...

  6. C语言必知-指针数组(附程序样例和详解)

    指针数组 除了类型之外,指针变量和其他的变量很相似,只不过加上指针标识就行 例如int *api[10],由于下标引用的优先级高于间接访问(就是解引用),因此 api是一个数组,数组中的元素的类型就是 ...

  7. python运行代码示例_python程序样例

    <Python和HDF 5大数据应用>--2.2 设置 本节书摘来自异步社区<Python和HDF 5大数据应用>一书中的第2章,第2.2节,作者[美]Andrew Colle ...

  8. C++基础教学(含程序样例)

    解决闪现问题 在return 0; 的代码上方添加 system("PAUSE"); cout 代表"控制台输出"(console output),必须在代码行 ...

  9. 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...

    一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...

  10. java程序样例_一个完整的java程序示例

    一个完整的java程序示例 2020-08-15 05:22 阅读数 74 第一个java程序 package mypack; //相当于一个目录 public class HelloWorld{ p ...

最新文章

  1. [原]unity3d之http多线程异步资源下载
  2. 人月神话第一篇阅读笔记
  3. C++中有关queue常用函数的用法及其注意要项
  4. 怎样编写测试类测试分支_编写干净的测试-被认为有害的新内容
  5. 计算机配置界面在那,在哪里设置关机画面?设置为原来的经典界面?
  6. .net页面调用JS时出现乱码
  7. 使用VS2010的Database项目模板统一管理数“.NET研究”据库对象
  8. redirect与forward跳转的区别
  9. HTML5 开源游戏引擎 LayaAir
  10. Srs之Clion编译
  11. ZooKeeper分布式过程协同技术详解2——了解ZooKeeper
  12. linux+加载迅雷插件,linux下使用aria2c + chrome插件取代迅雷
  13. SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP实现多数据源
  14. SQLite3 数据库全文搜索 - SQL Server - 红黑联盟
  15. cpu倍频模式怎么调_BIOS:增加倍频比率调整选项
  16. 每个 iOS 开发者都应该关注的 5 个网站
  17. vue 禁止input输入框输入特殊字符和汉字
  18. 高新技术企业补助政策
  19. 200行Perl 语言实现 VCD 转ATE测试pattern ---pattern的解析
  20. GX Works2 SFC编程基础

热门文章

  1. P3373 线段树2(多重标记线段树)题解
  2. 2019牛客多校第五场C generator 2(BSGS)题解
  3. python7.2抛出自定义异常
  4. hdu-1521 排列组合 指数型母函数
  5. java单元测试的用法及原因
  6. [充电]Code Review
  7. 转帖:Three Ways to Inject Your Code into Another Process
  8. R_circlize包_和弦图(一)
  9. Pythonamp;R爬取分析赶集网北京二手房数据(附详细代码)
  10. PhpStorm无法获取Post数据 配置