使用 MapReduce 程序将值发送到 HBase 表时出错

Posted

技术标签:

【中文标题】使用 MapReduce 程序将值发送到 HBase 表时出错【英文标题】:Error in sending the value to HBase table by using MapReduce program 【发布时间】:2016-12-23 06:27:20 【问题描述】:

我编写了一个 mapreduce 程序,我需要从特定列族的 HBase 表中读取数据。

例如,HBase 表中的数据如下所示:

Row    Column+Cell

1        column=Name:FName, timestamp=...,value=ABC

1        column=Name:LName, timestamp=...,value=XYZ

现在我需要将 FName 和 LName 作为 FullName 附加到同一列族下的另一列中。在 map 中,我正在提取数据并将其附加并发送到 reducer。

在 Reducer 中,我只是获取键、值对并尝试将 FullName 添加到表中。

我的 reducer 实现如下所示:

public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException 
  Put put = new Put(Bytes.toBytes(key.toString()));
  put.add(Bytes.toBytes("Name"), Bytes.toBytes("FullName"), Bytes.toBytes(values.toString()));
  context.write(null, put);

当我检查 hbase 表中的 Fullname 时,值不是“ABCXYZ”而是我得到的值是 org.apache.hadoop.mapreduce.task.ReduceContextImpl$ValueIterable

请告诉我如何解决此问题。

【问题讨论】:

【参考方案1】:

reduce 函数中的values 参数是Iterable,而不是单个值。这是因为通常使用 reduce 来reduce 具有相同键的多个值。但是在您的程序中,每个键只有一个值。您可以使用 values.next() 从此迭代中获取第一个值。无需调用 next(),您只需在 Iterable 对象本身上调用 toString() 方法,该方法会打印其类名。

顺便说一句,因为您不需要reduce多个值,您可以将hadoop配置为完全不使用reducer——只使用mapper。

【讨论】:

嗨,我只对映射器做同样的事情,我得到一个错误为“错误:org.apache.hadoop.hbase.client.Put.add(Lorg/apache/hadoop/hbase/ KeyValue;)Lorg/apache/hadoop/hbase/client/Put;"那是因为我的客户端和服务器版本不同吗?

以上是关于使用 MapReduce 程序将值发送到 HBase 表时出错的主要内容,如果未能解决你的问题,请参考以下文章

通过 shell 命令和 mapreduce 扫描 HBase 会给出两种不同的结果

HBase结合MapReduce批量导入

饼图更新或如何将值从gridview发送到饼图以进行更新

如何在rails中通过tcp发送值?

使用 mqtt 将值从 cc3200 发送到我的服务器

使用 ajax 将值输入类型文本发送到另一个 php 文件