elasticsearch批量索引和操作部分中的冗余数据

时间:2018-11-14 03:05:51

标签: elasticsearch elasticsearch-bulk-api elasticsearch-bulk

使用elasticsearch的批量API为数据编制索引时,此处是site documentation的示例json

POST _bulk
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "field1" : "value2" }
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }

在“准备”要由批量API使用的数据时,我必须在第一行中指定操作,而在下一行中,我将提供数据。每行上的一些冗余部分可能看起来很明显且无害,但是当我为数万亿的行建立索引时,它是否会增加延迟?是否有更好的方法通过指定索引名称并仅在标题处键入一次来推送所有行?特别是当我可以使用自动生成的ID时,可以避免一次又一次地出于相同的目的而在每行前面添加TB级数据。

我相信我在这里遗漏了一些明显的东西,否则我相信那些Elastic的家伙足够聪明,已经弄清楚了,如果他们这样做的话,应该有一些原因。但是呢

3 个答案:

答案 0 :(得分:1)

这里有快捷方式:

POST /test/_doc/_bulk
{ "index": {} }
{ "field1" : "value1" }
{ "index": {} }
{ "field1" : "value2" }
{ "index": {} }
{ "field1" : "value3" }

不幸的是,您仍然需要重复{ "index": {} }行,但是要在路径中指定索引名称和文档类型。

请在Cheaper in Bulk文章中查看更多选项。

答案 1 :(得分:1)

在准备数据方面没有更好的方法。您唯一可以做的就是以编程方式准备数据。

您只需编写代码即可构造所需的json,然后使用_bulk API将其发送出去。

理想情况下,最好通过名为indexer的特定应用程序进行索引编制,该应用程序实际上要等到一批文档(例如收集50100,然后以编程方式执行_bulk API。

或者您可以使用消息传递队列逐个文档(即event based)来代替这样的批处理。 (使索引过程中的延迟最小化的最佳方法)

另一种选择是使用简单的Java程序或您使用的任何其他编程语言创建输入文件data.json(纯批处理),以编程方式附加所有想要的文档,并使用CURL命令将请求发送为如下所示:

$ curl -s -XPOST <host_name>:9200/_bulk --data-binary @data.json

因此,对于此indexer应用程序,您可以通过以下方式添加计划和邮件通知:了解每个作业的运行状态和计划时间,具体取决于每天/每周何时运行根据您的要求。

哦,您可以使用Logstash。抱歉,它不是最好的答案,但希望对您有所帮助。

答案 2 :(得分:1)

正如Piotr Pradzynski's great answer中已经说过的,您无能为力,而且最小的足迹是Pyotr建议的。我认为有几个细节值得补充。

批量API有何帮助?

考虑使用批量API的主要原因是tuning for indexing speed。这里性能的提高主要是由于在Elasticsearch方面节省了处理更少的HTTP连接的费用。实际上,如果您设法不发送那些重复的{ "index": {} }部分,则您的集群将无法更快地为文档建立索引。

如果网络带宽是瓶颈,那该怎么办?

在这种情况下,我认为最好的方法是发送压缩后的数据,如下所示:

curl -v 'http://localhost:9200/my_index/doc/_bulk' \
    -H "Content-encoding: gzip"
    -H "content-type: application/json; charset=UTF-8"
    -X POST --data-binary @bulk_data.json.gz

为了说明这个想法,我生成了一个包含随机数据的文件,如下所示:

$ head bulk_data.json
{"index":{}}
{"request_id":"40485"}
{"index":{}}
{"request_id":"12417"}
{"index":{}}
{"request_id":"11945"}
{"index":{}}
{"request_id":"81722"}
{"index":{}}
{"request_id":"52613"}

使用GZip压缩后,文件的大小减小了10倍:

$ ls -l
-rw-r--r--  1 vasiliev  staff  358836 Nov 16 20:09 bulk_data.json
-rw-r--r--  1 vasiliev  staff   35744 Nov 16 19:41 bulk_data.json.gz

在带宽有限的情况下,这可能会很有帮助。

压缩也可以从客户端库(例如elasticsearch-py库)中获得。

希望有帮助!