我正在努力为几个Map任务以正确的方式分配hbase行。我的目标是通过row键分割扫描,并将一组行分配给一个map作业。到目前为止,我只能定义一个扫描,我的Map器总是一次一行。但这不是我想要的-我需要的Map输入设置明智。那么有没有可能拆分我的hbase表resp。扫描成n组行,然后输入n个Map器?我不是在寻找一个解决方案,开始一个mapreduce作业写n个文件和另一个mapreduce作业读回它们作为文本输入获取这些集。提前谢谢!
fslejnso1#
Map程序总是一次得到一行-这就是map reduce工作的方式如果你想关联到map端的多行,你可以自己做(例如使用一些静态变量等),或者把逻辑写成一个合并器,这是map端的“reduce”步骤。请注意,您仍然需要一个reducer来处理边缘情况,在这种情况下,相关的键由不同的Map器处理—因为在hbase中,键是在磁盘上排序的,所以只能在分割的结束/开始时获得。您可以通过预拆分来降低发生这种情况的风险
lyfkaqu12#
查看实现时,我发现使用一次扫描调用map步骤只会导致使用一个Map器。这就是为什么输入集没有被分割。使用扫描列表,将其交给 TableMapReduceUtil.initTableReducerJob 函数,则在每次扫描时分割输入集。因此,可以定义mapreduce作业中使用的Map器的数量。另一种方法是延长 TableInputFormat 类并重写split方法。正如arnon rotem gal oz所说的,在mapper的map函数中一次只能访问一行。
TableMapReduceUtil.initTableReducerJob
TableInputFormat
2条答案
按热度按时间fslejnso1#
Map程序总是一次得到一行-这就是map reduce工作的方式如果你想关联到map端的多行,你可以自己做(例如使用一些静态变量等),或者把逻辑写成一个合并器,这是map端的“reduce”步骤。
请注意,您仍然需要一个reducer来处理边缘情况,在这种情况下,相关的键由不同的Map器处理—因为在hbase中,键是在磁盘上排序的,所以只能在分割的结束/开始时获得。您可以通过预拆分来降低发生这种情况的风险
lyfkaqu12#
查看实现时,我发现使用一次扫描调用map步骤只会导致使用一个Map器。这就是为什么输入集没有被分割。
使用扫描列表,将其交给
TableMapReduceUtil.initTableReducerJob
函数,则在每次扫描时分割输入集。因此,可以定义mapreduce作业中使用的Map器的数量。另一种方法是延长
TableInputFormat
类并重写split方法。正如arnon rotem gal oz所说的,在mapper的map函数中一次只能访问一行。