输出多行的HBase映射器

输出多行的HBase映射器,hbase,Hbase,我有一个映射器,我想在HBase(0.90.4;Hadoop 0.20)中运行,它将在不同的HBase表中为每个输入行生成多个(1000-10000)新行数据 我从一个TableMapper开始,我假设在map函数中,我会调用context.write(someSingleOutputRowPut)1000次,将数据推送到输出表中 如果我有一个只读映射器,并用一批put列表手动写入我的输出表,会更好吗?或者我应该将映射器的输出类型更改为List吗?还是可以称之为上下文。写很多次这样的话 编辑:开

我有一个映射器,我想在HBase(0.90.4;Hadoop 0.20)中运行,它将在不同的HBase表中为每个输入行生成多个(1000-10000)新行数据

我从一个
TableMapper
开始,我假设在map函数中,我会调用
context.write(someSingleOutputRowPut)
1000次,将数据推送到输出表中

如果我有一个只读映射器,并用一批put列表手动写入我的输出表,会更好吗?或者我应该将映射器的输出类型更改为List吗?还是可以称之为上下文。写很多次这样的话

编辑:开始收集一些关于调用context.write数千次的“天真”方法的数据,但到目前为止看起来不太好(尤其是现在我正在尝试更大的数据集),所以是时候尝试一些随机的东西,看看有什么改进。

使用context.write(…)或使用table.put(…)本质上是一样的

在写入数据时,应关闭自动刷新以产生批处理效果。确保在映射程序阶段结束时执行刷新,以避免丢失任何数据


听起来您不需要reducer阶段,您应该保持这种状态,因为它可以通过避免洗牌、排序和数据传输阶段来提高性能。

我不知道表reducer会有什么帮助。在hbase表映射器中,您无法直接访问基础表,只是上下文-我看不出哪里会弄乱自动刷新设置。我认为上下文必须在幕后进行某种批处理,但我想知道它是否是在整个map任务结束时进行的,而不是在给定map调用结束时进行的。你是对的,我跳过了reducer。我的重点不是使用context.write函数,这样你的映射程序就不会写出任何内容,而是在映射程序内部,你使用table.put(…)。在HTable上,有一个方法setAutoFlush(布尔值)。将其设置为false,它将为您批处理。您必须在最后调用HTable上的close,以便它正确地刷新缓冲区。如果出现异常,则整个映射任务将失败。