【发布时间】: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