针对不同映射器的 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 拆分扫描的主要内容,如果未能解决你的问题,请参考以下文章