我有加入两种类型实体的hadoop作业。映射步骤会进行一些过滤,计算并生成适当的键值记录,以便以后加入。在这种情况下,Hadoop MultipleInputs可以正常工作。
地图逻辑的一部分可以在另一个上下文中重用,所以我正在寻找一种链接不同映射器的解决方案。我看到的默认值是ChainMapper。但是我还不清楚如何将它与MultipleInputs混合使用,每个输入都有单独的链。
请告诉我smb是否面临同样的问题,并且有一些想法,想法甚至是如何实现这一目标的例子。谢谢!
我继续浏览Hadoop源代码,看起来ChainMapper中的每个Mapper都在一个单独的线程中运行。在我的情况下,这看起来像开销。如果第一个映射器中的context.write在第二个映射器中直接调用map方法就足够了。
实施例: 一个地方有猴子和香蕉。
class Banana {
location
class
mature
}
class Monkey {
location
type
}
YellowBananaMapper { filter out non yellow }
MatureBananaMapper { filter out non mature }
BananaByLocation { map banana to location -> banana }
MonkeyByLocation { map monkey to location -> monkey }
如果我有疑问:猴子哪里有足够的黄香蕉? 我愿意:猴子:MonkeyByLocation;香蕉:YellowBananaMapper - > BananaByLocation。
如果我被要求列出黄色成熟香蕉, 我愿意:香蕉:YellowBananaMapper - > MatureBananaMapper。
PS。
我已经读过有关Pig和Hive的内容,这不是我的解决方案,因为我被迫使用java MR作业。