【问题标题】:Queries on Elasticsearch Configuration and Bulk ImportElasticsearch 配置和批量导入查询
【发布时间】:2014-09-27 21:55:12
【问题描述】:

我正在尝试使用大约 500 万条记录设置弹性搜索。每个文档有 150 个 KV 对。我在具有 4GB RAM 和 40GB 磁盘空间的 Ubuntu 12.04 上使用 ES 1.2.1。我已经使用了 ES 的所有默认配置来创建索引、插入文档等等。

这样做的几个问题是:

1) 我能够使用批量 api 从 JSON 文件中插入最多 30K 条记录。我还观察到它仅适用于 15-20MB 左右的文件大小。谁能指定批量导入的原因、上限和最佳大小?

2) 用于批量 api 的 JSON 文件包含数千条记录。因此,每次在实际数据之前,我都必须编写规范行。例如,

{"index":{"_index":"indexName","_type":"testName","_id":"someValue"}}

{"field1":"value1","field2":"value2".....}

{"index":{"_index":"indexName","_type":"testName","_id":"someValue"}}

{"field1":"value1","field2":"value2".....}

{"index":{"_index":"indexName","_type":"testName","_id":"someValue"}}

{"field1":"value1","field2":"value2".....}......

这不是很麻烦吗?我的意思是如果我必须插入 100 条记录,我还必须在文件中添加 100 条规范行?

3) 我通过一次重复插入 30,000 条记录成功地插入了大约 3,30,000 条记录。但后来我尝试同时执行此操作并开始一次运行 5 个线程。 ES 崩溃了!!!内存不足异常是原因。我重新启动了 ES,发现现在只存在 2,07,000 条记录。在 5 个分片中只有 2 个成功,这意味着数据消失了!这是一个严重的问题,可能会破坏应用程序。 对于如此庞大的数据,任何人都可以帮助我解决理想的分片和内存要求吗?还有我们如何在创建索引时指定这些设置并在创建索引后修改?

4) 现在,在这次崩溃之后,当我搜索具有 id 'x' 的特定记录时,ES 将数据返回给我,但是当我尝试使用 Get 检索相同的文档时,它失败了!可能出了什么问题?

非常感谢您的帮助。提前致谢。

【问题讨论】:

  • 您不应该一次插入 500 万条记录。相反,您应该将数据以块的形式流式传输到 ES 中(每个块 1k-10k 条记录应该是可以的)。 ES 崩溃的可能原因是 ES 想将 500 万条记录加载到内存中,而你得到了内存不足异常。与 ES 可以处理的相比,500 万条记录微不足道。尝试使用类似elasticsearch-py.readthedocs.org/en/master/…
  • @g00fy:谢谢哥们!我还关心第四点和第三点中提到的 1,00,000 条丢失记录。你能解释一下这背后的原因和逻辑吗?
  • AFAIR ES 1.2 存在一些问题,当您一次索引大量文档时,会导致刷新/合并损坏 lucene 索引。尝试使用描述的方法重建索引。还请提供一些您运行的查询的示例。我建议你使用 sense chrome 扩展。如果没有一些数据,很难猜测发生了什么。

标签: elasticsearch


【解决方案1】:

我发现每个批量请求的最佳位置是 > 2k 且

如果你还没有尝试过,你可以尝试使用 Node 客户端将批量请求推送到 ES。与 http/TransportClient 不同,使用节点客户端可减少由于集群内的数据分配而产生的额外网络干扰。它将数据推送到将存储它的节点,而不是盲目地将数据推送到节点,然后节点可能会将其传递到最终目的地。如果您有任何需要数天时间才能编制索引的流程,这可以为您节省一些体面的时间。对于需要几个小时的过程,这可能不值得。

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多