2

我有一个相当简单的 hadoop 问题,我将尝试用一个例子来介绍

假设您有一个字符串列表和一个大文件,并且您希望每个映射器在类似 grep 的程序中处理一段文件和一个字符串。

你应该怎么做?我的印象是映射器的数量是产生的 inputSplits 的结果。我可以运行后续作业,每个字符串一个,但它似乎有点......凌乱?

编辑:我实际上并没有尝试构建 grep map reduce 版本。我用它作为一个映射器有 2 个不同输入的例子。假设我列出了 A 和 B,并希望映射器处理列表 A 中的 1 个元素和列表 B 中的 1 个元素

因此,鉴于该问题没有导致需要链接作业的数据依赖性,我唯一的选择是以某种方式在所有映射器上共享所有列表 A,然后将列表 B 的 1 个元素输入到每个映射器?

我想要做的是为我的数据构建某种类型的前缀查找结构。所以我有一个巨大的文本和一组字符串。这个过程有很强的内存瓶颈,因此我在每个映射器之后使用 1 块文本/1 个字符串

4

3 回答 3

1

映射器应该能够独立工作并且没有副作用。并行性可以是,映射器尝试将一条线与所有模式匹配。每个输入只处理一次!

否则,您可以将每个输入行与模式数相乘。使用单个模式处理每一行。然后运行减速器。AChainMapper是这里选择的解决方案。但请记住:一条线会出现两次,如果它匹配两个模式。那是你要的吗?

在我看来,您应该更喜欢第一种情况:每个映射器独立处理一条线并根据所有已知模式检查它。

提示:您可以将具有该DistributedCache特征的模式分发给所有映射器!;-) 输入应与 InputLineFormat 分开

于 2010-04-29T09:28:48.700 回答
0

关于您的编辑:通常,映射器不用于一次处理 2 个元素。他一次只能处理一个元素。这项工作应该以某种方式设计,每个输入记录都可以有一个映射器,并且它仍然可以正常运行!

当然,映射器需要一些支持信息来处理输入是合适的。此信息可以通过作业配置(例如 Configuration.setString() )绕过。更大的数据集应通过分布式缓存传递。

您是否看过这些选项之一?我不确定我是否完全理解您的问题,所以请自行检查是否可行;-)

顺便说一句:对我经过充分调查的先前答案的赞赏投票会很好;-)

于 2010-05-03T09:16:53.110 回答
0

一位好朋友顿悟了:链接 2 个映射器怎么样?

主要是运行一个启动映射器(没有减速器)的作业。输入是字符串列表,我们可以安排一些事情,使每个映射器只得到一个字符串。

反过来,第一个映射器开始一个新的工作,输入是文本。它可以通过在上下文中设置变量来传递字符串。

于 2010-05-03T09:26:54.350 回答