database - 如何在分布式机器上划分一个非常大的单词列表搜索以获得更快的答案

标签 database hadoop apache-spark information-retrieval

这更像是一个架构问题,您将如何大规模解决这个问题。

假设您有一个包含数百万个单词的列表,您需要搜索这数百万个单词是否存在于数万亿个单词的语料库中。

例如:

Word_List =
["This", "a", "test", "of", "two", "words","what","words"]  

The_corpus =
["This", "a", "test", "of", "two", "words","what","words","blah","blah2"]  

在上面的示例中,在 the_corpus 中找到了 word_list 中的所有单词,因此我们的函数将返回 true。请注意,“单词”必须出现两次。

我想知道我们是否可以通过将 the_corpus 分布在集群上并编写 Mapper 和 Reducer 来检查该词是否存在于语料库中来使用 Hadoop 或 Spark 来解决这个问题,但我无法弄清楚 word_list 将如何分布。我无法将 word_list 保留在主节点上,因为它太大了。

最佳答案

您的任务具有类似于普通连接操作的目标。在实现它时,您可以考虑某些事项:

  1. 您可以使用 Bloom根据 Word_List 进行过滤,以缩小 The_corpus 集合中的潜在值范围
  2. 对于次要收集,通常使用分布式缓存使资源在所有任务节点上可用。在您的情况下,这应该是一个很大的空间命中,因为它将被复制到将执行实际任务的每个节点。为了改善这一点,您可以将文件直接放入具有更大复制因子的文件系统中,例如 10(取决于集群中的节点数),以提高其可用性。然后在您的任务中,您将能够直接下载它,与分布式缓存方法相比,这将显着节省您的空间,但成本将是您在非本地读取中的带宽。您可以尝试使用它来找到最佳复制次数。

关于database - 如何在分布式机器上划分一个非常大的单词列表搜索以获得更快的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42335551/

相关文章:

scala - Spark 上的 Redis :Task not serializable

database - 银行是否以明文形式存储密码?

java - 如何在数据库访问中使用 Future

mysql - 在 mySql 中找到类似的条目

hadoop - 有没有办法在单独的文件中设置查询参数(变量)?

hadoop - 有没有办法在删除文件时将 skipTrash 选项插入 oozie fs (HDFS) 操作?

scala - 将 Yarn 集群配置添加到 Spark 应用程序

scala - Scala和Spark : Cast multiple columns at once

python - 如何使用 Python Pyramid 处理多个数据库

hadoop - 映射器输出中的零件文件是否代表拆分?