1

我有一个“大数据”文本搜索问题,我曾在 Stackexchange 网站上寻找一般建议 - https://softwareengineering.stackexchange.com/questions/203855/text-search-big-data-problem

对于这篇 SO 帖子,这里有一个特定的问题,即围绕 ElasticSearch 与 Hadoop 的集成(但我想我会提供一些背景知识)。

问题概述

基本上我有大量的文本,分成不同的“行”,每一行代表一个项目。我有另一个较小的列表,其中包含此文本中的搜索词。我想交叉引用这两者并进行反向索引查找,并返回我找到的索引。

注意:我知道 20GB 不是海量数据,但本练习的次要目标是与大数据技术人员合作,为我们使用真正的大数据 (> TB) 项目奠定基础!

方法

我继续调查 Lucene 搜索路线,但据我所知,这将导致以下方法:

  • 使用 MapReduce 删除停用词和格式化文本等
  • 生成 Lucene 索引(可能使用 MapReduce - 这是一种优化)
  • 开发一个 C# 应用程序来与 Lucene(或 SolR)交互并进行搜索。

但对我来说,这仍然是串行的,即我将依赖于搜索服务器的可扩展性来非常快,但我仍然必须从我的列表顶部开始,然后一个接一个地完成它其他。

可以将原始列表拆分成块,然后在不同的服务器上运行我的 C# 应用程序,这将是一种方法。

具体问题

但我想知道是否可以使用 Hadoop Map Reduce 直接与 ElasticSearch(我首选的 Lucene 路线)互动?我已经搜索过(!)但找不到任何东西,除了将 Wonderdog 与 Pig 一起使用。很好 - 但我看不到 Pig UDF 和 ElasticSearch 的示例。

任何指针表示赞赏,非常欢迎代码示例!

邓肯

4

2 回答 2

4

有一个新的官方支持,称为 elasticsearch-hadoop

看看这里:http ://www.elasticsearch.org/blog/elasticsearch-and-hadoop/

另外:https ://github.com/elasticsearch/elasticsearch-hadoop

于 2013-10-16T13:05:31.783 回答
2

你也许可以完成这项工作。

一种可能的方法是让每个 hadoop 节点运行一个嵌入式路由弹性搜索节点。这应该会使查询更有效率,因为节点将确定每个查询需要联系哪些节点,并利用有效的内部协议来这样做。您可以通过添加更多的 es 数据节点来进行水平扩展。

唯一的缺点是您的 hadoop 节点不会靠近将在不同节点上的数据;所以你有一点延迟通过网络。但即便如此,您应该能够以这种方式运行大量看起来应该很便宜的查询。因为它只有 20GB,你的 es 节点应该很少需要去磁盘,并且可以在内存中做所有事情,利用过滤器缓存等。

实际上,我正在使用非 hadoop 代码对 1 节点集群中的弹性搜索进行一些消歧,并且我正在管理每秒 2000-2500 个简单查询,而不会真正强调弹性搜索。我花了大约 45 分钟来处理 700 万份文件。添加节点以进行扩展。当然,您的里程可能会有所不同。

使用许多 hadoop 节点,您可以通过处理大量并发请求来抵消延迟效应,并且大型 ES 集群应该很容易跟上集体负载。只需增加副本数量即可减少每个节点的负载。

您可能可以使用批量索引 api 以及您的 reduce 步骤的一部分。另一个想法是使用 search_type=scan 来遍历弹性搜索中的所有文档,而不是使用 hdfs 中的文件。可选,但可能效果很好。

于 2013-07-18T14:07:50.547 回答