Elasticsearch数据二进制内存耗尽。

4

我正在尝试将一个800GB的文件上传到Elasticsearch,但我不断收到一个内存错误,告诉我数据二进制超出了内存。我的系统上有64GB的RAM和3TB的存储空间。

curl -XPOST 'http://localhost:9200/carrier/doc/1/_bulk' --data-binary @carrier.json

我想知道是否有在配置文件中增加内存的设置,以便我可以上传他的文件

谢谢


curl: 选项 --data-binary: 内存不足 curl: 请尝试使用 'curl --help' 或 'curl --manual' 查看更多信息。 - Taimoor Khan
你的文本里写的是GB,这不是打错了吧(比如误写成MB)? - Andrei Stefan
不,这是一个800GB的JSON大文件。 - Taimoor Khan
你能展示一下你的 carrier.json 文件的简短摘录吗? - Val
1个回答

8

一次发送800GB的数据量相当大,ES需要将所有内容放入内存中进行处理,因此对于您拥有的内存量来说可能太大了。

解决这个问题的一种方法是将文件分成几个部分,然后逐个发送。您可以使用下面这个小shell脚本实现。

#!/bin/sh

# split the main file into files containing 10,000 lines max
split -l 10000 -a 10 carrier.json /tmp/carrier_bulk

# send each split file
BULK_FILES=/tmp/carrier_bulk*
for f in $BULK_FILES; do
    curl -s -XPOST http://localhost:9200/_bulk --data-binary @$f
done

更新

如果您想解释ES响应,可以将响应输入到一个小的Python一行代码中进行处理,例如:

curl -s -XPOST $ES_HOST/_bulk --data-binary @$f | python -c 'import json,sys;obj=json.load(sys.stdin);print "    <- Took %s ms with errors: %s" % (obj["took"], obj["errors"])';

非常好的例子!有没有一种简单的方法可以专门输出错误信息(即使将其拆分成10000行时内存耗尽)?默认情况下,ES返回完整详细的结果输出,这使得搜索错误变得不可能。 - Gabe Hiemstra
@GabeHiemstra 当然,我已经更新了我的答案,并附上了一个示例。 - Val

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接