我有一个相当简单的hadoop问题,我将试着用一个例子来表示
假设您有一个字符串列表和一个大文件,并且您希望每个映射器处理一个文件和一个grep类程序中的一个字符串。
你应该怎么做?我的印象是映射器的数量是inputSplits产生的结果。我可以运行后续工作,每个字符串一个,但看起来有点......凌乱吗?编辑:我实际上并没有尝试构建一个grep map reduce版本。我用它作为向映射器提供2个不同输入的示例。我只想说我列出了A和B,并希望映射器处理列表A中的1个元素和列表B中的1个元素
因此,如果问题没有经历导致需要链接作业的数据依赖性,那么我唯一的选择是以某种方式在所有映射器上共享所有列表A,然后将列表B的1个元素输入到每个映射器?
我想要做的是为我的数据构建某种类型的前缀查找结构。所以我有一个巨大的文本和一组字符串。这个过程有很强的内存瓶颈,因此每个映射器使用1块文本/ 1个字符串
答案 0 :(得分:1)
Mappers应该能够独立工作,没有副作用。并行性可以是,映射器尝试将线与所有模式匹配。每个输入只处理一次!
否则,您可以将每个输入行与模式数相乘。使用单个模式处理每一行。然后运行减速机。 ChainMapper
是这里的首选解决方案。但请记住:如果一条线匹配两个模式,它将出现两次。这就是你想要的吗?
在我看来,您应该更喜欢第一种情况:每个映射器独立处理一行,并根据所有已知模式进行检查。
提示:您可以将带有DistributedCache
功能的模式分发给所有地图制作者! ;-)输入应使用InputLineFormat
答案 1 :(得分:0)
关于你的编辑: 通常,映射器不会用于一次处理2个元素。他一次只能处理一个元素。该作业应该以某种方式设计,每个输入记录可以有一个映射器,它仍然可以正常运行!
当然,映射器需要一些支持信息来处理输入是合适的。可以使用作业配置(例如,Configuration.setString())绕过此信息。应通过分布式缓存传递更大的数据集。
您是否看过其中一个选项? 我不确定我是否完全理解你的问题,所以请自行检查一下是否有效; - )
顺便说一句:对我以前调查好的调查投票表示赞赏; - )答案 2 :(得分:0)
一位好朋友有一个伟大的顿悟:如何链接2位地图集?
在main中,运行一个启动映射器的工作(没有reducer)。输入是字符串列表,我们可以安排事情,以便每个映射器只获得一个字符串。
反过来,第一个映射器启动一个新作业,其中输入是文本。它可以通过在上下文中设置变量来传递字符串。