概要描述
优化search数据入库性能
详细说明
增加refresh的间隔时间。
Search每个index默认1s就会触发一次 refresh,然后Refresh会把内存中的的数据刷新到操作系统的文件缓存系统中。每次索引的 refresh 会产生一个新的 segment 段,这会导致频繁的segment merge 行为。一般在查询实时性要求不高的场景下可改为30s,甚至是”-1”(关闭refresh)。 入库完之后修改回默认值是1s 即可,如:
curl -XPUT "localhost:9200/[index_name]/_settings?pretty" -d '{
"index" : {
"refresh_interval" : "30s"
}
}'
减少副本
ES 为了保证集群的可用性,提供了 Replicas(副本)支持,然而每个副本也会执行分析、索引及可能的合并过程,所以 Replicas 的数量会严重影响写索引的效率。
当写索引时,需要把写入的数据都同步到副本节点,副本节点越多,写索引的效率就越慢。
如果我们需要大批量进行写入操作,可以先禁止 Replica 复制,设置 index.number_of_replicas: 0 关闭副本。在写入完成后,Replica 修改回正常的状态。
curl -XPUT "localhost:9200/[index_name]/_settings?pretty" -d '{
"index" : {
"number_of_replicas" : 0
}
}'
merge相关参数
增大每次merge的segment大小,从而减少merge次数,减轻负载
curl -XPUT '192.168.2.181:9200/index/_settings?pretty' -d '
{
"index.merge.policy.floor_segment": "100mb",
"index.merge.scheduler.max_thread_count": "1",
"index.merge.policy.max_merged_segment":"100m"
}'
去掉mapping中_all字段
Index中默认会有_all这个字段,默认会把所有字段的内容都拷贝到这一个字段里面,这样会给查询带来方便,但是会增加索引时间和索引尺寸。
在创建index mapping中设置
"_all":{"enabled":false}
使用es自动生成id
es对于自动生成的id有优化,避免了版本查找。因为其生成的id是唯一的
方法为在bulk写入时不指定_id的值
精细设置全文域
string类型字段默认会分词,不仅会额外占用资源,而且会影响创建索引的速度。所以,把不需要分词的字段设置为not_analyzed
提升段合并速度
ES 默认对段合并的速度是 20m/s,如果使用了 SSD,我们可以通过以下的命令将这个合并的速度增加到 100m/s。
curl -XPUT "localhost:9200/_cluster/settings
{
"persistent" : {
"indices.store.throttle.max_bytes_per_sec" : "100mb"
}
}
增加translog flush大小
Flush主要目的是待translog达到多大之后将入库的数据从内存flush到磁盘,并生成新的translog。在不发生频繁长gc的前提下可以适当调大该参数以提高入库性能, 但该参数变大之后recovery的时间会变长。 默认值是512m 。
curl -XPUT "localhost:9200//_settings?pretty" -d '{
"index" : {
"translog.flush_threshold_size" : "4g"
}
}
设置bulk queue
建立索引的过程偏计算密集型任务,应该使用固定大小的线程池配置,来不及处理的放入队列,线程数量配置为 CPU 核心数+1,避免过多的上下文切换.队列大小可以适当增加。
curl -XPUT 'localhost:9200/_cluster/settings?pretty' -d '{
"persistent": { ①
"threadpool.bulk.queue_size" : 1000 ②
}
}'
① persistent: 保证修改的cluster参数在集群重启后生效。
② 指bulk队列的长度, 配置可以防止流量。
注意:es 5.x以后版本不支持动态设置,参数调整为thread_pool.bulk.queue_size,并需将其配置到elasticsearch.yml文件中,可以去manager界面进行修改,然后配置服务、
设置batch.size(insert)
esdrive批量插入的大小:sql运行时可设置的参数
set esdrive.insert.batch.size=20000; ①
① 默认值是1000.
在 hive-site.xml 文件中修改以下参数:需重启inceptor。
discovery.zen.ping.unicast.hosts=localhost ①
① Transwarp Search的transport client会将所有Transwarp Search请求发到本地的Transwarp Search node上做转发,这样可以少走2次网络传输。但在cluster mode下需要保证每个运行的executor的机器上都有Transwarp Search node,在localmode下需要考虑本地Transwarp Search node是否容易过载。