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

2024-06-26 00:05:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两组索引,索引A和索引B。我需要在B.*中创建一个父子结构。B_*已经包含父文档,A_*包含子文档。因此,从本质上讲,我需要将子文档从A_*复制到B_*中,中间有一些逻辑,根据作为唯一键的几个字段的匹配,将子文档匹配到父文档。你知道吗

一个*包含大约40个索引,文档计数在1亿到2.5亿之间。每个索引在100-500GB之间。包含16个索引,每个索引有1500万个文档,每个文档大小为20GB。你知道吗

我尝试通过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滚动遍历助手.扫描并且,基于给定子文档中某些字段的值,确定该文档父级的id。对于每一个文档,它都会生成索引操作,将子文档索引到B.*中相应的父文档下。你知道吗

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

  • 使用xargs并行运行脚本会导致大量索引错误,最多只会导致1/3的语料库被索引。如果这能奏效,这将是一个理想的方法,因为它将把整个过程缩短到2-4天。你知道吗
  • 在1进程中运行python脚本不会导致BulkIndexingErrors,但它只索引了大约2200-2800万个文档,此时会发生读取超时,整个进程只是无限期挂起。这是不太理想的方法,因为在最好的情况下,需要7-8天才能完成。在我尝试以这种方式运行它的过程中,我在Kibana监视集群,发现搜索量激增到每秒30000个文档,之后立即骤降到0,之后再也没有出现。在那一点上分度逐渐变小。你知道吗
  • 我尝试了扫描大小、块大小和线程计数的不同值。对于扫描大小为6000、块大小为1000、线程数为6的1个进程,我获得了最快的性能,但是我也注意到了前面提到的读取峰值,所以看起来我可能读得太多了。把它缩小到4000的扫描大小仍然会导致读取超时(我无法在那个设置下监视搜索速率)。你知道吗

更多细节:

  • ES版本:5.2.1
  • 节点数:6
  • 主碎片:956
  • 副本:76
  • 我目前需要从运行ES的服务器运行脚本。你知道吗

我需要想办法在尽可能少的几天内完成父子索引。任何提示,以解决我的上述尝试的问题将有所帮助,新的想法也欢迎。你知道吗


Tags: 方法文档self脚本sizeindexdoces