那年那日那朵花

".......(o´ω`o)......"

避免导数据到elasticsearch超时的方法

2016-10-03 14:32 python elk

十一加班,发现之前用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