pyes问题记录(bulk操作)
背景:主机统计按每5分钟create一个进程进行统计最近24小时的日志,统计host数据,然后存在到host_all里面,在host_all里面主要记录host, create_time(首次发现host的时间), lastupdate_time(最后一次发现host的时间)
经过调试发现在主机统计中index或者update 文档时速度比较慢(每次提交差不多1-2秒才结束),导致统计在5分钟内未完成,导致多个进程同时进行主机统计,由于多个进程导致host_all中的host不唯一
目前主要修改
1.将统计结果在存储es时使用的index和update修改为bulk
2.在pyes进行matchall时,每次查询size为10,将其设置为1000
目前统计基本在20s左右完成
需要注意的是:
1.在使用bulk时,如果有update的内容,需要注意在调用flush_bulk(forced=True)方法时如果提交数据会发生异常,原因时,pyes会对提交返回的数据进行检查,而在检查结果中不支持update方法(见pyes.models 212行函数)
可以通过设置bulk对象的raise_on_bulk_item_failure为False,不进行结果检查
2.注意在创建pyes.ES也有raise_on_bulk_item_failure参数,在调用create_bulker是也使用该属性初始化bulk对象,但是有bug(见pyes.es 395行函数),返回值错误
3.设置pyes进行matchall的时使用pyes.search(pyes.Search(filter=pyes.MatchAllFilter(), bulk_read=1000), indices=index_name, doc_type=doc_type_name)
4.在index后可以返回document id,若需要时用该id做去重之类的工作,可以使用flush_bluk后返回的结果,注意flush_bluk可能返回None,如果提交数据行数未达到400行(可设置),也可以使用flush_bluk(True)强制提交数据到es,根据返回结果中的id,可通过mget获取提交的文档内容(注意需要在下次使用该数据之前强制更新数据到es)