目录

es性能优化

写入性能优化

增加refresh的时间间隔

默认1s就会触发一次Refresh,然后Refresh会把内存中的数据刷新到操作系统的文件缓存系统中(buffer ——> OS cache)。每次索引的refresh会产生一个新的segment段,这会导致频繁的segment merge行为。一般在查询实时性要求不高的场景下可改为30s,甚至是“-1”(关闭refresh)。入库完之后修改回默认值是1s即可,形如:

refresh参数设置
Curl -XPUT "localhost:9200/[index_name]/_settings?pertty" -d '{
	"index":{
		"refresh_interval":"30s"
	}
}'

减少副本

es为了保证集群的可用性,提供了Relicas(副本支持),然而每个副本也会执行分析、索引及可能的合并过程,所以Replicas的数量会严重影响索引的效率。
当写索引时,需要把写入的数据都同步到副本节点,副本节点越多,写索引的效率就越慢。
如果我们需要大批量的进行写入操作,可以先禁止Replicas复制,设置index.number_of_replicas:0关闭副本,在写入完成后,Replica修改回正常状态。

副本调整
Curl -XPUT "localhost:9200/[index_name]/_settings?pertty" -d '{
	"index":{
		"number_of_replicas":0
	}
}'

增加translog flush大小

flush主要目的是待translog达到多大之后将入库的数据从内存flush到磁盘,并生成新的translog。在不发生频繁长gc的前提下可以适当调大该参数以提高入库性能。
但该参数变大之后recovery的时间会边长,默认值是512m。形如:

translog大小调整
Curl -XPUT "localhost:9200/[index_name]/_settings?pertty" -d '{
	"index":{
		"translog_flush_threshold_size":"4g"
	}
}'

设置bulk queue

建立索引的过程偏计算密集型任务,应该使用固定大小的线程池配置,来不及处理的放入队列,线程数量配置为CPU核心数+1,避免过多的上下文切换,队列大小可以适当增加,形如:

bulk queue设置
Curl -XPUT "localhost:9200/[index_name]/_settings?pertty" -d '{
	"persistent":{
		"threadpool.bulk.queue_size":
	}
}'

persistent:保证修改的cluster参数在集群重启后生效
指bulk队列的长度,配置可以防止流量。

设置batch.size(insert)

esdrive批量插入的大小:sql运行时可设置的参数
set esdrive.insert.batch.size=20000;
默认值是1000
在hive-site.xml文件中修改以下参数:需重启inceptor。

<property>
	<name>discovery.zen.ping.unicast.hosts</name>
	<value>localhost</value>
</property>

Transwarp Search的transport client会将所有Transwarp client会将所有Transwarp Search请求发到本地的Transwarp Search node上做转发,这样可以少走2次网络传输,但在cluster mode下需要保证每个运行的executor的机器上都有Transwarp Search node,在localmode下需要考虑本地Transwarp Search node是否容易过载。

查询性能优化

合并segments

每个segment文件都会占用文件句柄,内存,CPU使用等各种资源。这就意味着存在的segment越多,搜索请求就会变得更慢,查询性能越低,因此对于segments较多的index,可以定期手动或写脚本合并一下,单个segment合并到4-5g为最佳。
a、需要通过curl命令查看所需查询的index的segment数量。

segments查看
Curl -XGET 'localhost:9200/_cat/segments/[index_name]?v'

<index_name>:所需查询的index名

b、若该index中存在很多较小的segment(100mb以下),可以通过optimize操作将这些小文件合并成一个大的segment文件,具体命令如下:

合并segments
Curl -XPOST 'localhost:9200/[index_name]/_optimize?max_num_segments=5&pertty'

设置batch.size(select)

在sql运行时可设置的参数,多版本通用参数:设置查询批量的大小
set esdrive.select.batch.size=10000;
每次查询每个shard时返回的document数量,默认值是1000。
TDH5.0中可用参数
设置查询类型
set esdrive.search.type=transwarp_scan_all;
可选的属性值包括:scan,transwarp_scan,transwarp_scan_all(默认值),默认值对返回数据量叫达的全表扫描非常友好,当返回的数据条数小于总数据量的3%时,可改成transwarp_scan。设置统计查询结果的上限。
set esdrive.aggregation.buckets.threshold=1000;
只在local mode下有效,作用于有统计分析的sql,设置的每一批统计结果中buckets的上限,可根据实际场景来调整。
住:更多调优参数,包括es快速重启等,可以参考search运维手册。