【问题标题】:Django Haystack/ElasticSearch indexing process abortedDjango Haystack/ElasticSearch 索引过程中止
【发布时间】:2013-01-26 01:40:09
【问题描述】:

我正在使用 django 1.4、Haystack 2 beta 和 ElasticSearch .20 运行设置。我的数据库是 postgresql 9.1,它有几百万条记录。当我尝试使用 haystack/elasticsearch 索引我的所有数据时,该过程超时并且我收到一条消息,上面写着“Killed”。到目前为止,我注意到以下几点:

  1. 我确实获得了要编入索引的文档数量,所以我没有收到类似“0 个要编入索引的文档”之类的错误。
  2. 索引一个小的集合,例如 1000,就可以正常工作。
  3. 我已尝试在 haystack/backends/__init__.py 中硬编码超时,但似乎没有效果。
  4. 我尝试更改 elasticsearch.yml 中的选项也无济于事。

如果硬编码超时不起作用,那么我还能如何延长索引时间?是否有另一种方法可以直接在 ElasticSearch 中进行更改?或者也许是一些批处理方法?

提前致谢!

【问题讨论】:

    标签: python django elasticsearch django-haystack


    【解决方案1】:

    我敢肯定,问题在于生成要发送到 ElasticSearch 的文档,而使用 batch-size 选项将帮助您。

    ElasticSearch backend 中的 update 方法准备文档以从每个提供的查询集中建立索引,然后为该查询集执行单个批量插入。

    self.conn.bulk_index(self.index_name, 'modelresult', prepped_docs, id_field=ID)
    

    因此,如果您有一个包含数百万条记录的表,则在该索引模型上运行 update_index 意味着您需要生成数百万条文档,然后对它们进行索引。我敢冒险这就是问题所在。使用--batch-size 选项设置批处理限制应该限制由您的批处理大小的查询集切片生成的文档。

    【讨论】:

    • 我试过了,它不是批量大小,虽然它是一个很好的起点。默认批量大小为 1000,这对于 AWS 上具有 4GB RAM 的服务器来说应该不是问题。
    【解决方案2】:

    这个版本的 haystack 有问题。在文件 haystack/management/commands/update_index.py 的以下行中找到了导致问题的代码行:

    pks_seen = set([smart_str(pk) for pk in qs.values_list('pk', flat=True)])
    

    导致服务器内存不足。但是,对于索引,似乎不需要它。所以,我只是将其更改为:

    pks_seen = set([])
    

    现在它正在分批运行。谢谢大家回答!

    【讨论】:

    • 我的 rebuild_index 在 haystack 2.3.1 中内存不足。你知道这是否已经解决了吗?
    【解决方案3】:

    当您尝试索引所有这些记录时,您是否观察过您的进程消耗的内存?通常,当您看到“已终止”时,表示您的系统内存不足,the OOM killer 已决定终止您的进程以释放系统资源。

    【讨论】:

    • 我没有,但我们假设是这样。我将如何配置弹性搜索来处理巨大的数据负载?这确实是问题的症结所在。我知道,如果我使用 java 与 sql db 交互,并且需要处理大型数据集,我会使用 spring batch 之类的东西,并以增量方式处理数据。似乎很奇怪,弹性搜索似乎没有等效的方法。
    • 看起来这是您要查看的代码:github.com/toastdriven/django-haystack/blob/master/haystack/…。我会研究 batchsize 选项,这可能会有所帮助。
    • 只是权衡说 ES 可能不是摔倒的那个。 ES 每秒可以轻松处理数百万个文档和数千个插入。在个人基准测试中,我使用普通插入达到了 15-40k/秒,甚至没有使用批量 API。我对 Haystack 一无所知,但我猜它正试图将您的整个记录​​集塞入内存。
    • Haystack update_index 命令(由rebuild_index 使用)正在推送和构建您的文档,可能来自搜索索引模板。可能不是问题,但我会开始朝那个方向看。
    • @Zach 你说得对,这不是 ES,而是干草堆层出了问题。
    猜你喜欢
    • 2015-04-28
    • 2013-04-22
    • 2023-03-06
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多