1

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

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

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

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

提前致谢!

4

2 回答 2

1

映射器将始终一次获取一行 - 如果您想与映射端的多行相关联,这就是 map-reduce 的工作方式,您可以自己执行此操作(例如使用一些静态变量等)或将逻辑编写为组合器,它是映射端的“减少”步骤。

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

于 2013-04-18T19:27:29.973 回答
1

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

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

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

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

于 2013-04-25T17:06:38.247 回答