使用 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 表时出错的主要内容,如果未能解决你的问题,请参考以下文章