1、Es2.2.1升级升级6.4 脚本执行问题
今天在全量索引用户充值信息时,遇到如下问题,从头梳理一下:
原始code:
修改之后:
在第一遍调接口执行全量索引时:
报如下错误:
java.lang.IllegalArgumentException: failed to execute script
因为是升级到了6.4,es的eslaticsrarch.yml配置里面没有加一下参数:
网上搜了一下,也说是没有这几个参数导致的。所以就直接在6.4的配置文件中加了这几个参数。加完之后启动Es时,Es启动失败。后来将先修改了script,最初修改的是这样的:
与最终的相比较就查了四个params.这里先不解释。再去查日志,es日志显示如下错误:
其中,说Too many dynamic script compilations within, max: [75/5m],因为我们索引的数据量比较大,而且索引时使用的是批量索引,考虑有可能是这个原因导致的,随即在yml中配置了这个参数,先配成了script.max_compilations_rate:300/1m,重新启动,同样显示此错误。以为这个值太小,所以将值配成了20000/1m,这次果然没报相同错误,但是出现了新的错误如下:
说是变量没有被定义,但是我确实是定义了,未果,看源码:
这是源码中的一个例子,然后就想可能是参数结构错误:
参数改成这样还不行,又试了一下,将代码改成了上面贴的最终的,重启测试,一切正常。但是因为配置了script.max_compilations_rate,所以还是不确定到底是哪里引起了最原始的错误,然后将script.max_compilations_rate改成了默认的,启动测试,还是正常的。到这里才算搞明白,原来是script的参数结构不对导致的。
中间还出现了这个异常:
所以还一度认为是批量处理的问题,改成单条index依然没有效果。
总结:
(1)Es6.4和先前版本还是有很多区别的,版本不兼容的地方很多,这个script参数结构就是一个。
(2)在向Es的yml配置文件写参数时,:后面要加空格,否则会导致Es启动失败。