关于elasticsearch的操作,我一般是使用python elasticsearch库的。 维护他人的代码所以间接的再研究下pyes。 我们的所有业务都是依赖于ElasticSearch数据库的,不说java,python关于es的模块有elasticsearch和pyes这两个库。  而我跟伟哥用的都是python elasticsearch模块。一个部门居然用不同的模块… 


该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。http://xiaorui.cc/?p=3043

对于他们的区别我这里说两句, elasticsearch-py的文档要比pyes要完整,要完善,给出的实例也很丰富。 pyes的文档实在太伤,不说别的这明明是python的模块,冷不丁出来个java api的使用方法,闹呢…  因文档太粗糙,我花了点时间读了下pyes代码,可以说pyes代码复杂度要比elasticsearch-py低不少…
elasticsearch-py是官方elastic来维护,pyes是个人组织来维护。
elasticsearch-py的更新和修复很是及时,最近也是有更新。 上次的commit是去年的10月份.  commit的最近频繁说明这项目是有活力. 我还记得去年给他们提价了一个bug,不到一个星期就给修复了.   总是一句话,推荐使用elasticsearch-py . 

正题开始,说下pyes bulk的实现方法. 为什么要说pyes bulk呢 ? 首先遇到了pyes bulk的一个坑.  以前都是使用elasticsearch-py Helpers来批量bulk操作,实现是属于典型的批量方法,我自己设立一个list,然后把doc塞到这list里面,然后把这list扔给bulk方法就可以了。

pyes不是这样的, pyes内部里面有个bulk list,而且这个list是线程安全的。如果你是多进程尽量不要共用一个es连接对象,会出现类似线程安全的问题 .


下面是pyes官方给出的bulk方法, 但这跑不通… … 

当我按照pyes给出的方法,调用refresh结果出问题…. 


我们应该这么使用pyes模块:

pyes的bulk_size默认是400,es.index后面的bulk参数一定要是True. 这样你不是真正的插入数据,而是放在客户端的队列里,当你手动force_bulk()或者bulk_size满了才能真正的推送doc文档到es.

下面是pyes批量的实现源码,这源码很多细节表明作者还是很有功底的.


下面批量插入后的性能测试结果,大家会觉得慢么? 我们的ElasticSearch的节点有70+的规模了,其实我也觉得慢…  通过kopf看到elasticsearch的状况不错…. 慢的原因是我们每个doc文档都很大,出口或调度总归有影响的. 跟Hbase Thrift Server一样,没改成批量之前,负责hadoop的同事就说,插入查询慢的原因是由于没有使用批量接口,后来我用了批量接口…. 消耗时间是线性增长的,没效果… 

ElasticSearch的bulk批量没啥好讲的,这次碰巧碰到这问题…  我还是推荐大家使用ElasticSearch-py的库…. 


END.





对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

从源码分析python批量插入elasticsearch的实现

看了elasticsearch python的一些源码,现在看到bulk批量操作.  发现网上对于elasticsearch批量插入的文章有些少,我在这里就简单描述下es bulk的各个...

阅读全文