我正在努力为几个映射任务以适当的方式分配我的HBase行。我的目标是通过行键分割我的扫描,并将一组行分配给一个映射作业。
到目前为止,我只能定义一个扫描,我的映射器每次总是得到一行。但这不是我想要的——我需要映射输入集。
是否有可能拆分我的HBase表。扫描成n组行,然后输入n个映射器?
我不是在寻找一个解决方案来启动一个MapReduce作业写n个文件和另一个MapReduce作业再次读取它们作为文本输入来获取这些集。
提前感谢!
映射器每次总是得到一行——这就是map-reduce的工作方式如果你想在地图端关联多行,你可以自己做(例如使用一些静态变量等),或者将逻辑写为一个组合器,这是一个地图端的"减少"步骤。
请注意,您仍然需要一个reducer来处理相关键由不同映射器处理的边缘情况-因为在hbase中键是在磁盘上排序的,您只能在分裂的结束/开始时得到它。您可以通过预拆分
查看实现,我发现使用一次扫描调用映射步骤会导致只使用一个映射器。这就是为什么输入集没有被分割。
使用扫描列表,将其赋给TableMapReduceUtil.initTableReducerJob
函数,每次扫描时将输入集拆分。因此,可以定义MapReduce作业中使用的映射器的数量。
另一种方法是扩展TableInputFormat
类并重写split方法。
正如Arnon Rotem-Gal-Oz所说的,在映射器的map函数中,一次只能访问一行。