十一加班,发现之前用python脚本每天导的数据作的图不对劲,感觉好像有的数据貌似没有导完整。后来查问题,发现原因应该就是脚本定时跑的时候正好赶上elasticsearch在做GC的时候stop-the-world了。。。。。es这玩意GC又把握不准的,至多调大点HEAP_SIZE,减少GC频率,但依然有可能碰巧遇到数据导到一半es触发GC了。想了半天,结果其实有个相当简单的办法,之前没想到。其实只要把buik导数据的timeout调大就可以了,因为es的GC时间不长,等等其实就过去了。
后来查了下论坛和官方文档。其实只要在bulk请求的方法上添加request_timeout参数即可。官网的描述如下:
** Global timeout can be set when constructing the client (see Connection‘s timeout parameter) or on a per-request basis using request_timeout (float value in seconds) as part of any API call, this value will get passed to the perform_request method of the connection class **
with open(self.filename) as f: for line in f: #去掉每行结尾换行符 line = line.strip('\n') body = self.splitdata(line) action = { "_index": indexName, "_type": "flow", "_source": body } actionLst.append(action) if len(actionLst) == 500: helpers.bulk(es,actionLst,request_timeout=60) actionLst = [] #self.senddata(body) if len(actionLst) > 0: helpers.bulk(es,actionLst,request_timeout=60) actionLst = []
像这样就可以了,对了默认的request_timeout貌似只有10秒钟,太短了。这里我调了60秒并且加了一些日志,先运行一段时间看看效果,如果仍然有问题,那就应该不是上面我推测的原因了。。。。。。。
如果那样的话就当我这篇文章在胡扯吧= =
------------------分割线--------------------
亲测有效
Cloudhu 个人随笔|built by django|
沪ICP备16019452号-1