来自HTable的MapReduce输入

时间:2013-06-20 08:56:22

标签: hadoop mapreduce hbase

我有一个MapReduce作业,输入来自HTable。从Java MapReduce代码,如何将作业输入格式设置为HBase TableInputFormat

是否有类似JDBC连接的连接到HTable数据库?

2 个答案:

答案 0 :(得分:1)

如果您的客户端和HBase在同一台计算机上运行,​​则无需为客户端配置任何与HBase通信的内容。只需创建一个HBaseConfiguration实例并连接到您的HTable:

Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, "TABLE_NAME");

但是如果您的客户端在远程计算机上运行,​​那么它依赖于ZooKeeper来与您的HBase集群通信。因此,客户端需要ZooKeeper集合的位置才能继续。这就是我们通常配置客户端以使它们连接到HBase集群的方式:

Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "ZK_MACHINE_IP/HOSTNAME");
conf.set("hbase.zookeeper.property.clientPort","2181");
HTable table = new HTable(conf, "TABLE_NAME");

这是通过Java API实现的。 HBase也支持其他一些API。您可以在此here找到更多信息。

回到第一个问题,如果您需要在MR作业中使用TableInputFormat作为InputFormat,则可以通过Job对象执行此操作,如下所示:

job.setInputFormatClass(TableInputFormat.class);

希望这能回答你的问题。

答案 1 :(得分:1)

HBase附带TableMapResudeUtil类,可以轻松设置map / reduce作业 这是第一个样本from the manual

Configuration config = HBaseConfiguration.create();
Job job = new Job(config, "ExampleRead");
job.setJarByClass(MyReadJob.class);     // class that contains mapper

Scan scan = new Scan();
scan.setCaching(500);        // 1 is the default in Scan, which will be bad for MapReduce jobs
scan.setCacheBlocks(false);  // don't set to true for MR jobs
// set other scan attrs
...

TableMapReduceUtil.initTableMapperJob(
  tableName,        // input HBase table name
  scan,             // Scan instance to control CF and attribute selection
  MyMapper.class,   // mapper
  null,             // mapper output key
  null,             // mapper output value
  job);
job.setOutputFormatClass(NullOutputFormat.class);   // because we aren't emitting anything from mapper

boolean b = job.waitForCompletion(true);
if (!b) {
  throw new IOException("error with job!");
}