开发者学堂课程【HBase入门教程:HBase MapReduce_1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/397/detail/5096
HBase MapReduce_1
内容介绍
一、读表案例
二、写表案例
一、举例
下面的案例主要是如何 将 HBase 作为 MapReduce 源使用,如果,有 Mapper instance 但是没有 Reducer ,并且 Mapper 中没有任何发出的进程,此时代码应该如下:
Configuration config = HBaseConfiguration.create();
Job job=newJob(config,"ExampleRead");job.setJarByClass(MyReadJob.class);
// 包含 mapper 的类
Scan scan = new
Scan();scan.setCaching(500);
// 1 是指浏览当中的错误,会对 MapReduce 进行有害
scan.setCacheBlocks(false);
//不要为 MR jobs 设置为
ture...TableMapReduceUtil.initTableMapperJob(tableName,
// 输入 HBase 表名称scan,
MyMapper.class, // mappernull,
// mapper 主要输出null,
// mapper 输出内容
job);job.setOutputFormatClass(NullOutputFormat.class);
// 因为此时haimeiy9ou从 mapper 中发送出任何进程boolean b =
job.waitForCompletion(true);if (!b) {throw new IOException("error with job!");} public static class MyMapper extends TableMapper{public void map(ImmutableBytesWritable row, Result value,
//map 内可以按照自身需求填写Context context) throws InterruptedException, IOException {}}
二、书写案例
下面主要讲解,当 HBase 在 MapReduce 中, 即用来当做一个 source 由用来当做一个 sink,可以先直接把代码复制过来修改,代码如下:
Configuration config = HBaseConfiguration.create();Job job = new Job(config,"ExampleReadWrite");job.setJarByClass(MyReadWriteJob.class);
// 包含 mapper 的类
Scan scan = new Scan();
scan.setCaching(500);
// 1 是指浏览当中的错误,会对 MapReduce 进行有害
scan.setCacheBlocks(false);
// 不要为 MR jobs 设置为
ture TableMapReduceUtil.initTableMapperJob(sourceTable,
// 输入表scan,
MyMapper.class,
// mapper 类 null, // mapper 主要输出键 null,
// mapper 输出内容job);TableMapReduceUtil.initTableReducerJob(targetTable,
//输出表null,
//reducer 类job);job.setNumReduceTasks(0); boolean b = job.waitForCompletion(true);if (!b) {throw new IOException("error with job!");}Reduce 为空,
没有被指定,此例子中,只定义到了 map ,而没有指定到 reduce。
接下来下一个例子,代码如下
:TableMapReduceUtil.initTableMapperJob(sourceTable,
// 输入表 scan,
MyMapper.class,
// mapper 类 Text.class,
// mapper 输出关键字IntWritable.class,job);TableMapReduceUtil.initTableReducerJob(targetTable,
// 输出表
MyTableReducer.class,
// reducer 类 job);job.setNumReduceTasks(1);
// 要求至少调整一处
boolean b = job.waitForCompletion(true);if (!b) {throw new IOException("error with job!");}
这个案例中,指定了一个 MyTableReducer,在指定的时候,先指定了所要操作的目标表,还有 job 和 reduce 方法,里面继承了 MyTableReduce ,reduce 在拿到数据之后,做累加,然后将键放到 put 中去,put 再进来之后,带上列族和字段,在放入 put 中,输出时,只将 put 输出,插入到 Hbase 的表当中。
此案例中,没看到表关联的原因是:在初始化时,写 reduce 的时候已经直接写入了,目标表已经被指定了。
而之前 map 指定的时候中的目标表,是读表目标,不是写表目标。