hbase MapReduce程序样例入门

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 extends
		TableMapper<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 extends
		TableReducer<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 extends
		TableReducer<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 extends
		TableMapper<KEYOUT, VALUEOUT>{
 
	public void map(Writable key, Writable value, Context context)
			throws IOException, InterruptedException {
		        //mapper逻辑
			context.write(key, value);
		}
 
	}
}
 
public class reducer extends
		Reducer<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程序了。

自:http://blog.pureisle.net/archives/1938.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 配置mapreduce程序可访问操作hbase的hadoop环境: 要配置mapreduce程序以访问操作HBase的Hadoop环境,需要执行以下步骤: 1)安装和配置Hadoop和HBase:首先,需要正确安装和配置Hadoop和HBase,以确保它们正常启动并可以相互通信。 2)引入Hadoop和HBase依赖项:在mapreduce程序的pom.xml(如果使用Maven构建)或build.gradle文件中,需要将Hadoop和HBase的依赖项添加为项目的依赖项。 3)编写mapreduce程序:在mapreduce程序中,需要使用HBase提供的Java API来读取和写入HBase表。 4)设置Hadoop和HBase的配置:在程序中,需要使用Hadoop的Configuration类和HBaseHbaseConfiguration类来设置Hadoop和HBase的配置信息,如HBase的ZooKeeper地址、Hadoop的文件系统等。 5)编写mapreduce程序的输入和输出格式:在mapreduce程序中,需要指定输入数据的格式(如TextInputFormat)和输出数据的格式(如TableOutputFormat)。 6)配置HBase的输入和输出表:在程序中,需要使用HBase的TableMapReduceUtil类来设置输入和输出表的信息,包括表的名称、列族等。 7)运行mapreduce程序:将编译后的mapreduce程序提交到Hadoop集群上以运行,程序将访问和操作HBase的数据。 2. HBase mapreduce程序设计: 设计HBase mapreduce程序需要考虑以下几个方面: 1)Mapper类的实现:需要自定义Mapper类,继承自Hadoop的Mapper类,并重写map方法。在map方法中,可以根据需求读取HBase表中的数据,并将结果输出为键值对形式。 2)Reducer类的实现:需要自定义Reducer类,继承自Hadoop的Reducer类,并重写reduce方法。在reduce方法中,可以对Mapper输出的键值对进行处理,并将结果写入HBase表中。 3)输入和输出格式的设置:可以使用Hadoop提供的TextInputFormat等格式类来设置程序的输入数据格式。对于输出,可以使用HBase提供的TableOutputFormat类将结果写入HBase表中。 4)配置程序的输入和输出表:可以使用HBase的TableMapReduceUtil类来设置程序的输入表和输出表的信息,包括表的名称、列族等。 5)程序的参数设置:可以使用Hadoop的Configuration类来设置程序的参数,如HBase的ZooKeeper地址、Hadoop的文件系统等。 6)运行程序:将编译后的mapreduce程序提交到Hadoop集群上以运行,程序将按照设定的逻辑读取HBase表中的数据并进行处理,并将结果写入HBase表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值