【发布时间】:2016-06-21 10:50:01
【问题描述】:
我想从每个映射器批量插入 N 行到 HBase 表。我目前知道这样做的两种方法:
- 创建Put 对象列表并使用HTable 实例的
put(List<Put> puts)方法,同时确保禁用autoFlush参数。 - 使用TableOutputFormat 类并使用
context.write(rowKey, put)方法。
哪个更好?
在第一种方式中,context.write() 不是必需的,因为hTable.put(putsList) 方法用于直接将数据放入表中。我的映射器类正在扩展Class Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>,那么我应该为KEYOUT 和VALUEOUT 使用哪些类?
在第二种方式中,我必须拨打context.write(rowKey, put) N 次。有什么方法可以让我使用context.write() 列出Put 操作?
还有其他方法可以使用 MapReduce 做到这一点吗?
提前致谢。
【问题讨论】:
-
为什么是单个映射器,为什么不是多个映射器?你如何指定映射器的数量?即使您指定这是对代码的建议,也不能保证映射器的数量是一个。
-
您可以使用 setNumMapTasks 或 conf.set('mapred.map.tasks','numberofmappersyouwanttoset') 更改映射器的数量(但它是对配置的建议),但不能保证映射器实例会被设置。此外,它取决于输入拆分。
-
看stackoverflow.com/questions/37239944/…请看我详尽的回答..随时提问。
-
对于使用你的第一种方式,可以像“public class HBasePutOrDeleteMapper extends TableMapper
{” -
我不知道你从哪里得到的例子。 “我的映射器类正在扩展类映射器
,那么我应该为 KEYOUT 和 VALUEOUT 使用哪些类”