针对不同映射器的 HBase MapReduce 拆分扫描

Posted

技术标签:

【中文标题】针对不同映射器的 HBase MapReduce 拆分扫描【英文标题】:HBase MapReduce split scan for different mappers 【发布时间】:2013-04-18 12:56:15 【问题描述】:

我正在努力以适当的方式为几个地图任务分配我的 HBase 行。 我的目标是通过行键拆分我的扫描并将一组行分配给一个映射作业。

就目前而言,我只能定义一个扫描,在该扫描中,我的映射器总是一次获取一行。但这不是我想要的 - 我需要按集设置地图输入。

那么有没有可能拆分我的 HBase 表。扫描成 n 组行,然后输入给 n 个映射器?

我不是在寻找一个解决方案来启动一个 MapReduce 作业写入 n 个文件和另一个 MapReduce 作业来再次读取它们作为获取这些集合的文本输入。

提前致谢!

【问题讨论】:

***.com/questions/11039562/… 【参考方案1】:

映射器总是一次得到一行 - 这就是 map-reduce 的工作方式 如果您想与地图端的多行相关联,您可以自己执行(例如使用一些静态变量等)或将逻辑编写为 combiner,这是一个地图端“减少”步骤。

请注意,您仍然需要一个 reducer 来处理相关键由不同映射器处理的边缘情况 - 因为在 hbase 中,键是在磁盘上排序的,您只能在拆分的结束/开始时得到它。您可以通过预拆分来降低发生这种情况的风险

【讨论】:

【参考方案2】:

查看实现,我发现使用一次扫描调用 map-step 会导致只使用一个映射器。这就是输入集根本不拆分的原因。

使用扫描列表,将其提供给TableMapReduceUtil.initTableReducerJob 函数,输入集在每次扫描时被拆分。从而可以定义 MapReduce 作业中使用的映射器数量。

另一种方法是扩展 TableInputFormat 类并重写 split 方法。

正如 Arnon Rotem-Gal-Oz 所说,在映射器的 map 函数中一次只能访问一行。

【讨论】:

以上是关于针对不同映射器的 HBase MapReduce 拆分扫描的主要内容,如果未能解决你的问题,请参考以下文章

使用 HBase 表作为 MapReduce 源

使用 MapReduce 在 HBase 中插入多行

具有单个映射器和两个不同减速器的 hadoop 作业

使用 MapReduce/Hadoop 对大数据进行排序

具有多种键类型的 Hadoop MapReduce 映射器和化简器

Hadoop MapReduce访问减速器中的映射器输出编号