复制巨大的索引以创建父子结构

时间:2017-05-10 17:42:40

标签: python elasticsearch

我有两组索引,索引A_ *和索引B_ *。我需要在B_ *中创建一个父子结构。 B_ *已包含父文档,A_ *包含子文档。所以,基本上,我需要将子文档从A_ *复制到B_ *,中间有一些逻辑,根据作为唯一键的几个字段的匹配,将子文档与父文档进行匹配。

A_ *包含大约40个文档计数介于100-250万之间的索引。每个索引介于100-500 GB之间。 B_ *包含16个索引,每个索引有1500万个文档,每个文档大小为20 GB。

我试图通过python脚本执行此操作,主要逻辑如下:

doc_chunk = helpers.scan(self.es, index=some_index_from_A, size=4000, scroll='5m')
actions = self.doc_iterator(doc_chunk)
deque(helpers.parallel_bulk(self.es, actions, chunk_size=1000, thread_count=4))

函数doc_iterator滚动helpers.scan返回的迭代器,并根据给定子文档中某些字段的值确定该文档父级的id。对于每个文档,它产生索引操作,索引子文档在B _ *。

中的相应父项下

我尝试了几种不同的方法来创建这个父子索引,但似乎没有任何工作:

  • 使用xargs并行运行脚本会导致BulkIndexingErrors,并且最多只会导致被索引的语料库的1/3。如果这样做,那将是理想的方法,因为它会将整个过程减少到2-4天。
  • 在1进程中运行python脚本不会导致BulkIndexingErrors,但它只会索引大约22-28万个文档,此时会发生读取超时,整个过程只会无限期挂起。这是不太理想的方法,因为最好的情况下需要7-8天才能完成。在我尝试以这种方式运行它的过程中,我正在监控Kibana中的集群并注意到搜索已经飙升到30,000个文档/秒,之后它们立即暴跌至0并且之后从未接收到。索引逐渐减少。
  • 我尝试过不同的扫描尺寸,块尺寸和线程数值。我获得了1个进程的最快性能,扫描大小为6000,块大小为1000,线程数为6,但我也注意到上面提到的这个设置的读取尖峰,所以看起来我可能读得太多了。将其降至4000的扫描尺寸仍会导致读取超时(我无法监控该设置下的搜索速率)。

更多细节:

  • ES版本:5.2.1
  • 节点:6
  • 主要分片:956
  • 副本:76
  • 我目前需要从运行ES的服务器运行不同的服务器。

我需要找到一种方法在尽可能短的几天内完成父子索引。任何解决上述尝试问题的技巧都会有所帮助,也欢迎新的想法。

0 个答案:

没有答案