我需要根据以下工作流程决定是否使用elasticsearch import或update / upsert。
Elasticsearch作为商业智能应用程序的后端。
我们每天从Hadoop收集大约200GB的日志和分析数据作为纯文本文件。
删除elasticsearch中的所有现有索引,并创建今日数据的新索引。
将200GB数据导入新索引。
导入大约需要3.5小时,然后elasticsearch会在接下来的24小时内为该应用提供服务,直到下一个导入过程开始,并且所有内容都会重复出现。
如果该信息可以提供帮助,我们正在使用elasticsearch-php SDK来处理批量导入。
我们导入的日志数据是以下格式
id: 30459,
age: 45,
country: US
page_view_count: 4657
显然,数据包含的字段类似于一个永不改变的国家,很少会发生变化的年龄以及可能会偶尔发生变化的观看次数。
大约超过200GB,我可以说大约80-85%的数据与昨天的数据相比没有变化。
我为专家提出了两个问题。
1-很明显,由于大多数数据都是相同的,所以我们应该使用upsert,我尝试过,但upsert过程需要太长时间,有时甚至超过8小时。 (我确实也使用了doc style update命令来确保数据是否相同,它被跳过但结果相同)。你是否认为我跳过了upsert处理器中明显缺少一些弹性搜索标志的东西,我应该在upsert之前切换并恢复到进程完成?我应该检查哪些标志,设置,集群或节点参数以使批量upsert更快(至少它应该比新索引更快..没有?)
2-删除索引并每天进行全新导入似乎违反直觉,但该过程及时完成,服务在4小时内上线。在这种特定情况下,为什么导入比upsert更快?我认为这不应该是因为索引200gb数据需要做的所有工作。
你能指出我正确的方向吗?答案 0 :(得分:0)
upsert
没有帮助您认为更新单个值只会触及文档的一部分,相反,整个对象将被重新编入索引,因为在ES中它们是不可变的。这就是update API的工作原理。
为什么会变慢?
在编写全新的文档时,ES只做两件事:索引和写入磁盘(粗略地说)。
部分更新时,它会做三件事:检索,索引,写作。
有一些general recommendations可用于调整索引性能,我建议您首先查看index.refresh_interval
,您可以考虑将其放大或完全禁用。
请注意,在创建新索引时,您不必删除索引,可以使用aliases指向当前索引。
希望有所帮助!