我正在努力以适当的方式为多个地图任务分发我的HBase行。 我的目标是通过行键分割我的扫描并将每组行分配给一个地图作业。
就目前而言,我只能定义一个扫描,其中我的映射器一次总是一行。但这不是我想要的 - 我需要设置地图输入。
因此有可能拆分我的HBase表格。扫描到n组行,然后输入n个映射器?
我不是在寻找一个解决方案来启动MapReduce作业编写n个文件和另一个MapReduce作业,以便再次将它们作为文本输入读回来获取这些集合。
提前致谢!
答案 0 :(得分:1)
Mappers总是会一次获得一行 - 这就是map-reduce的工作方式 如果你想与地图一侧的多行相关,你可以自己做(例如使用一些静态变量等)或者将逻辑写为combiner,这是一个地图侧“减少”步骤。 / p>
请注意,您仍然需要一个reducer来处理相关键由不同映射器处理的边缘情况 - 因为在hbase密钥是在磁盘上排序的,您只能在分割的结尾处开始。您可以通过预分割来降低发生这种情况的风险
答案 1 :(得分:1)
查看实现,我看到用一次扫描调用map-step会导致使用一个mapper。这就是输入集根本没有拆分的原因。
使用扫描列表将其提供给TableMapReduceUtil.initTableReducerJob
功能,每次扫描时分割输入集。因此,可以定义MapReduce作业中使用的映射器数量。
另一种方法是扩展TableInputFormat
类并重写split方法。
正如Arnon Rotem-Gal-Oz所说,在映射器的映射函数中,一次只能访问一行。