导语:在腾讯金融科技数据应用部的全民BI项目里,我们每天面对超过10亿级的数据写入,提高es写入性能迫在眉睫,在最近的一次优化中,有幸参与到了elasticsearch开源社区中。
背景
为了更便捷地分析数据,腾讯金融科技数据应用部去年推出了全民BI的系统。这个系统通过elasticsearch进行基础的统计,超过10亿级的数据量需要尽可能快速地导入到es系统中。即使经过多次的参数优化,我们依然需要几个小时才能完成导入,这是系统此前存在的一大瓶颈。
在这样的背景下,我们开始决定进一步深入es,寻找优化点。
优化前的准备
我们准备了1000万的数据,并在原程序(spark程序写入)上进行了几轮单机压测,得到了一些基本的性能数据。
机器配置:CPU 24核,内存 64G
ES基本配置:
· 堆内存31G
· 其他参数调整包括lock memory,translog.durability调整成async等(更详细的策略可以参见https://github.com/elastic/elasticsearch/issues/45371)
文档数:1000万,字段400个(没有text字段)
写入耗时:26分钟
CPU:80%+
寻找理论值
在往下进入深水区之前,我们需要先回顾一下es本身,es本身是基于lucene基础上设计的分布式搜索系统,在写入方面主要提供了:
· 事务日志和成组提交的机制提高写入性能并保证可靠性
· 提供schema的字段定义(映射到lucene的字段类型)
要进行优化,首先得验证一个问题:lucene的极限速率能到达多少,所以我在我的本机上构建了这样的一个测试。
Macbook pro 15,6核12线程
数据量1000万,每个document 400个字段,10个线程并发(考虑mac cpu Turbo 4.5G ,服务器2.4G(24核),所以只采用10线程并发)
验证写入耗时549s(约10分钟)。
26分钟 —> 10分钟,意味着理论上是可行的。那剩下的就看如何接近这个极限。因为那说明一定是es本身的一些默认特性导致了写入速率无法提升。
下面的介绍忽略了一些相对简单的参数调优,比如