Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Map 在hadoop上有两组组合的输入_Map_Hadoop_Input_Mapper - Fatal编程技术网

Map 在hadoop上有两组组合的输入

Map 在hadoop上有两组组合的输入,map,hadoop,input,mapper,Map,Hadoop,Input,Mapper,我有一个非常简单的hadoop问题,我将尝试用一个例子来说明 假设您有一个字符串列表和一个大文件,并且希望每个映射程序在类似grep的程序中处理一段文件和一个字符串 你该怎么做?我的印象是,映射器的数量是产生输入拆分的结果。我可以运行后续作业,每个字符串一个,但似乎有点。。。凌乱 编辑:我实际上并没有试图构建一个grep-map-reduce版本。我用它作为一个例子,有两个不同的输入到一个映射器。让我们假设我列出了A和B,并且希望映射器处理列表A中的1个元素和列表B中的1个元素 因此,考虑到问题

我有一个非常简单的hadoop问题,我将尝试用一个例子来说明

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

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

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

因此,考虑到问题没有导致需要链接作业的数据依赖性,我唯一的选择是在所有映射器上共享所有列表A,然后向每个映射器输入列表B的1个元素吗


我试图做的是为我的数据构建某种类型的前缀查找结构。所以我有一个巨大的文本和一组字符串。这个过程有一个很强的内存瓶颈,因此每个映射器需要1块文本/1个字符串,映射器应该能够独立工作并且没有副作用。并行性可以是,映射器尝试将一条线与所有模式匹配。每个输入只处理一次

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

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

提示:您可以使用
DistributedCache
功能将模式分发给所有映射器!;-)应使用InputLineFormat对输入进行拆分,以进行编辑: 通常,映射器不用于同时处理2个元素。他一次只能处理一个元素。作业的设计应确保每个输入记录都有一个映射器,并且仍能正确运行

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

你看过其中一个选项吗? 我不确定我是否完全理解您的问题,所以请您自己检查是否可行;-)


顺便说一句:对我之前仔细调查过的答案投一张感谢票会很好;-)

一个好朋友有一个伟大的顿悟:链接两个地图绘制者怎么样

在main中,运行一个引发映射器(无缩减器)的作业。输入是字符串列表,我们可以进行安排,使每个映射器只获得一个字符串


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

您真的想像grep那样做吗?如果是这样的话,在映射器中保留您想要的所有模式,然后针对每个模式测试每行数据可能更有效。您的意思是,每个映射器应该在其各自文本段上的所有字符串上循环。我已经考虑过了,但这不会妨碍并行性吗?谢谢你的回答,我编辑了我的问题,试图澄清我的真实想法。啊,是的,我的错,你确实提到了ChainMapper和所有这些,当时我不清楚如何建模问题。“将每个输入行与模式数相乘。用单个模式处理每行”对我来说仍然有点模糊。无论如何,我会尝试这种方法。好吧,链映射器和通过上下文传递变量对我来说并不新鲜,关于我以前的两篇文章。。。不管怎样:每个地图绘制者开始新的工作对我来说都很可怕!如果你有n个字符串,你就有n个工作?!urgs:-(每个映射程序都应该一次将所有字符串处理成一个记录。听我说;-)我想我真的需要这个。我的映射器将构建一个10倍于拆分大小的数据结构。我不想去缓存等。另一个建议的想法是对数据本身进行n*m处理:在输入文件夹中预先组合所有内容。想象一下,我有300个字符串和一个10GB的输入序列。是的,这个想法涉及300*10GB的输入。。。问题是,少量的工作处理大量数据,还是大量的工作处理较少的数据?我要第二个。顺便说一句,chainmapper实际上并没有什么帮助,因为我的想法是:开始一个作业,没有减缩器,将它指向输入字符串。这个映射程序有一个for循环,用于启动新作业、设置字符串等。好的,我对您的场景有更好的理解。让我声明,这是可以的,甚至是框架的意图,映射器(和还原器)正在忙于他们所做的工作。Hadoop基本上是为大吞吐量和处理大数据而构建的。但是map()/reduce()不需要几行代码!如果他们需要更长的时间,也可以。这就是为什么reportProgress()方法被设计成告诉主节点,从节点仍然处于活动状态,但很忙。每个作业都意味着开销,所以应该避免有很多作业。相反,如果一些作业运行几个小时也没关系。顺便说一句:在一个作业中开始几个新作业-你知道,作业是顺序执行的,而不是并行执行的吗?你是对的,投票是有序的。正如我所说,我需要n*m映射器,除了上面的答案之外,还有其他方法吗?同样,让每个映射程序为其各自的拆分处理所有字符串是一种糟糕的情况——我的处理内存太大了。