解决数据导入报错 circuit_breaking_exception

4,734 阅读1分钟

在进行 bulk 批量数据导入的时候,如果每次批量导入的数据量太大会报类似的错,意思大概就是要传输的数据是 947.7mb ,超过了 上限 940.3mb :

TransportError(429, 'circuit_breaking_exception', '[parent] Data too large, data for [<http_request>] would be [993837424/947.7mb], which is larger than 
the limit of [986061209/940.3mb], real usage: [984848776/939.2mb], new bytes reserved: [8988648/8.5mb], usages [request=9224248/8.7mb, fielddata=0/0b, 
in_flight_requests=88005626/83.9mb, accounting=1591187/1.5mb]')

经过查找,在终端查看 GET _cluster/stats 中的 heap_max_in_bytes 属性是 1037959168 ,由于 Parent circuit breaker 设置的熔断点为 JVM heap 的 95 % ,所以熔断点是 986061209 ,和上面的报错中的 limit 一致,所以解决办法如下:

  1. 最暴力最直接的办法就是提升 config/jvm.options 中的 Xms 和 Xmx 的值,因为已经是 95% 了,再提升比例的意义已经不大了。
  2. 就是优化 mapping 的结构,优化字段,这样在进行批量导入数据的时候,占内存量不多,自然就不会引发熔断器的报错了。
  3. 减少 bulk 中包含的请求数量,尝试找到 bulk 可容纳的最佳的请求数量。

另外,针对各种熔断器的报错,都可以详查默认配置,并进行调整,具体内容:www.elastic.co/guide/en/el…