这更多的是一个架构问题,您将如何在规模上解决这个问题。
假设您有一个数百万单词的列表,您需要搜索这数百万单词是否存在于一个数万亿单词的集合中。
例如,:
Word_List =
["This", "a", "test", "of", "two", "words","what","words"]
The_corpus =
["This", "a", "test", "of", "two", "words","what","words","blah","blah2"] 在上面的示例中,word_list中的所有单词都在the_corpus中找到,因此我们的函数将返回true。请注意,“单词”必须出现两次。
我想知道我们能否通过在集群上分发the_corpus并编写Mapper和Reducer来检查单词是否存在于语料库中来解决这个问题,但我不知道word_list将如何分布。我不能将word_list保存在主节点上,因为它太大了。
发布于 2017-02-20 09:53:03
您的任务具有与普通联接操作类似的目标。在实现它时,您可以考虑到以下几点:
发布于 2017-02-20 13:40:47
word_list可以通过Hadoop's DistributedCache机制跨节点分布。本质上,文件(-s)是在初始作业配置阶段指定的,然后物理地复制到将运行映射任务的所有节点。然后,每个map任务都可以访问和使用该文件的内容。
因此,您的示例任务通过以下方式在Hadoop中得到解决: word_list和语料库被放入HDFS;在工作中,word_list被设置为在所有节点上使用DistributedCache进行扩展;在地图阶段,word_list将根据特定的语料库拆分进行检查(即每个地图任务都有完整的word_list,64/128/MB的语料库拆分,其中64/128/.由HDFS为语料库文件设置的块大小定义);在还原阶段,需要进行聚合,例如,如果应该返回True/False,那么减缩器的输入可能是word_list中所有单词出现的次数:如果所有单词至少有一次出现,则为真,否则为假。
通常,这类任务称为映射端连接.参见一些示例代码(使用DistributedCache),例如,这里。
发布于 2017-02-20 02:48:02
您可以在hadoop中在hdfs上添加word_list和语料库,这将在所有节点上分发两个文件。现在,您可以从hdfs读取后续文件。在映射程序代码中,可以使用文件系统类访问映射代码中的word_list文件。您可以在Hadoop命令中将您的语料库文件作为输入文件路径。
https://stackoverflow.com/questions/42335551
复制相似问题