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

Database 如何在分布式机器上划分一个非常大的单词列表搜索,以获得更快的答案,database,hadoop,apache-spark,information-retrieval,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"] 在上面的示例中,word

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

假设您有一个数百万个单词的列表,并且您需要搜索这些数百万个单词是否存在于万亿个单词的集合中

例如:

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

The_corpus =
["This", "a", "test", "of", "two", "words","what","words","blah","blah2"]  
在上面的示例中,word_列表中的所有单词都在_语料库中找到,因此我们的函数将返回true。请注意,“单词”必须出现两次


我想知道我们是否可以通过Hadoop或Spark解决这个问题,方法是在集群上分发单词库,并编写Mapper和Reducer来检查单词是否存在于语料库中,但我不知道单词列表将如何分发。我无法将word_列表保留在主节点上,因为它太大。

您可以在hadoop中的hdfs上添加word_列表和语料库,这将在所有节点上分发这两个文件。现在,您可以从hdfs读取这两个文件。在映射程序代码中,可以使用文件系统类从映射程序代码中的hdfs访问word_列表文件。您可以在Hadoop jar命令中将您的语料库文件作为输入文件路径提到。

您可以在Hadoop中的hdfs上添加word_列表和语料库,这将在所有节点上分发这两个文件。现在,您可以从hdfs读取这两个文件。在映射程序代码中,可以使用文件系统类从映射程序代码中的hdfs访问word_列表文件。您可以在Hadoop jar命令中将您的语料库文件作为输入文件路径提到。

您的任务的目标类似于常见的连接操作。在实施时,您可以考虑以下几点:

  • 您可以使用基于单词列表的过滤器来缩小语料库集合中潜在值的范围
  • 对于次要收集,通常使用分布式缓存使所有任务节点上的资源可用。在您的情况下,这可能是一个巨大的空间冲击,因为它将被复制到执行实际任务的每个节点。为了改善这一点,您可以使用更大的复制系数(例如,10)(取决于集群中的节点数量)将文件直接放入文件系统中,以提高其可用性。然后,在您的任务中,您将能够直接下载它,与分布式缓存方法相比,这将显著节省您的空间,但成本将是非本地读取的带宽。您可以利用它来找到最佳的复制数量

  • 您的任务具有类似于普通联接操作的目标。在实施时,您可以考虑以下几点:

  • 您可以使用基于单词列表的过滤器来缩小语料库集合中潜在值的范围
  • 对于次要收集,通常使用分布式缓存使所有任务节点上的资源可用。在您的情况下,这可能是一个巨大的空间冲击,因为它将被复制到执行实际任务的每个节点。为了改善这一点,您可以使用更大的复制系数(例如,10)(取决于集群中的节点数量)将文件直接放入文件系统中,以提高其可用性。然后,在您的任务中,您将能够直接下载它,与分布式缓存方法相比,这将显著节省您的空间,但成本将是非本地读取的带宽。您可以利用它来找到最佳的复制数量
  • 单词_列表可以通过该机制分布在节点上。本质上,在初始作业配置阶段指定一个文件(-s),然后将该文件物理复制到将运行映射任务的所有节点。然后,每个映射任务都可以访问和使用此文件的内容

    因此,您的示例任务在Hadoop中的解决方式如下:单词列表和语料库放入HDFS中;在作业中,将word_列表设置为使用DistributedCache跨所有节点进行扩展;在映射阶段,根据特定的语料库分割检查单词列表(即,每个映射任务都有完整的单词列表和64/128/…MB的语料库分割,其中64/128/…由语料库文件的HDFS块大小集定义);在reduce阶段,需要进行聚合,例如,如果只返回True/False,则reducer输入可能是word_列表中所有单词的出现次数:如果所有单词至少出现一次,则为True,否则为False

    通常,这类任务称为映射侧连接。请参阅一些示例代码(使用DistributedCache),例如。

    单词列表可以通过该机制跨节点分布。本质上,在初始作业配置阶段指定一个文件(-s),然后将该文件物理复制到将运行映射任务的所有节点。然后,每个映射任务都可以访问和使用此文件的内容

    因此,您的示例任务在Hadoop中的解决方式如下:单词列表和语料库放入HDFS中;在作业中,将word_列表设置为使用DistributedCache跨所有节点进行扩展;在映射阶段,根据特定的语料库分割检查单词列表(即,每个映射任务都有完整的单词列表和64/128/…MB的语料库分割,其中64/128/…由语料库文件的HDFS块大小集定义);在reduce阶段,需要进行聚合,例如,如果只返回True/False,则reducer输入可能是word_列表中所有单词的出现次数:如果所有单词至少出现一次,则为True,否则为False


    通常,这类任务称为映射侧连接。请参阅一些示例代码(使用DistributedCache),例如。

    猜测您的问题是如何使用在集群节点之间以某种方式划分语料库的集群来加速搜索。这里我概述了我将要做的事情

  • 对语料库进行排序并删除重复项,但为每个单词添加多个重复项,如