【源码剖析】一篇看懂havenask索引构建任务全流程

第四篇:bs_admin构建任务流程

上一篇介绍了bs_admin的主流程,包括顶层的 Admin Worker,作为系统的主要入口,负责接收用户的请求,并将这些请求分发给 ServiceKeeper 进行处理 ;ServiceKeeper 是后台的核心管理者,负责所有构建任务的管理、调度和生命周期维护 ;针对单个构建任务,则由GenerationKeeper 负责单个构建任务(Build)的生命周期管理,包括任务的启动、恢复、停止和状态同步 ;GenerationKeeper 主要通过 GenerationTask 来执行具体的构建任务,并使用 WorkerTable 来管理工作节点。上面就是整个顶层的一些核心概念,本节我们会结合具体的代码,对一个构建任务做个分析。

1提交新的构建任务

bash 复制代码
hape create table -t in1 -p 2 -s /ha3_install/example/cases/normal/in0_schema.json  -f hdfs://HDFS4001844/luotian/test.data -c /ha3_install/hape_conf/k8s  

执行这个命令的时候,他会向catalog Service发送一个create_table的请求,里面会包含表的全量数据、swift上的topic(增量数据),表的schema定义。

2感知到新构建

CatalogServiceKeeper 中感知到有新的构建,CatalogServiceKeeper会周期性的查询Catalog,看是否有新的构建任务,一旦发现有新增,就会启动一个新的构建任务,一个具体的日志如下:

3通过startBuild方法启动1个新构建

在 CatalogServiceKeeper 中,他最终会调用到 ServiceKeeper::startBuild 方法,启动一个新的

代次管理器(GenerationKeeper)=> 代次任务(GenerationTask)。

4代次任务加载配置

在加载配置的时候,会先调用基类GenerationTaskBase的loadFromConfig,然后回调到子类GenerationTask的doLoadFromConfig方法。

5加载图配置

在GenerationTask的doLoadFromConfig方法中,会去读取具体的构建任务的图配置,在这个例子中,会去读取 BuildIndexV2.graph 文件,里面定义了5个工作流TaskFlow,每个工作流由一系列任务组成,这就是对一个具体的索引构建任务的描述,下面分别介绍。

5.1数据预处理

任务类型是:prepare_data_source,具体实现类是:PrepareDataSourceTaskController,创建的位置在 BuildIndexV2.graph 中通过lua脚本调用loadSimpleFlow创建,在初始化 PrepareDataSourceTaskController 过程中,发现数据源中有文件,所以会设置 PrepareDataSourceTaskController 中存在一个处理目标,执行的时候下发给具体的Worker,他的主要功能是:

●根据用户提供的数据描述,扫描文件系统并收集所有符合条件的文件清单。这份清单最终会被整理并存储在一个元数据文件中,为后续的数据抽取和构建任务提供可靠的数据源信息。

最终会在hdfs上产出一个bs_raw_file_meta的文件,里面的内容如下:

5.2全量processor

任务类型是:processor,具体的实现类是:ProcessorTask。在初始化的时候,会去解析输入、输出。

●输入包括了文件和swift两部分

●输出此处没有提供的话,ProcessorTask内部会自动创建一个topic

典型:

5.3增量processor

增量processor和全量一致,也会创建一个topic

5.4全量build

定义在FullBuildV2.flow中,任务类型:builderV2,具体实现类:SingleBuilderTaskV2。他的输入输出为:

●输入:前置flow全量processor的swift topic

●输出:hdfs上一个地址,每个分片单独一个地址

5.5增量build

定义在IncBuildV2.flow中,任务类型也是builderV2,输入和输出也类似:

●输入:前置flow增量processor的swift topic

●输出:hdfs上一个地址,每个分片单独一个地址

6任务执行

上面完成任务初始化后,代次管理器(GenerationKeeper)会启动一个线程,周期性的调用代次任务(GenerationTask)的 makeDecision 方法,完成整个任务的驱动。整个调用路径如下:

arduino 复制代码
- GenerationKeeper::makeDecision
  - TaskFlowManager::stepRun 【驱动任务流】
  - TaskFlowManager::getAllTask() 【获取所有任务】
    - 针对每个Task执行 Task::syncTaskProperty
      - BuildServiceTask::doSyncTaskProperty
        - AdminTaskBase::run
          - TaskController::operate

最终在每个循环里会产出需要的WorkerNode,以及每个Node的目标。

7资源调度

除了上面的这个循环外,服务管理器 (ServiceKeeper)还有有一个循环,他会周期性的调用当前执行的GenerationKeeper,收集他需要的workerNode,最终生成一个执行计划,调用底层的carbon做二层调度。

总结

本文详细分析了bs_admin系统中构建任务的完整流程,从任务提交到执行及资源调度,涵盖了多个核心组件及其交互过程,但是具体的一些细节还未展开,后续会针对每个组件专门介绍。

相关推荐
Elastic 中国社区官方博客10 小时前
Observability:适用于 PHP 的 OpenTelemetry:EDOT PHP 加入 OpenTelemetry 项目
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·php
Elastic 中国社区官方博客1 天前
Elasticsearch:如何为 Elastic Stack 部署 E5 模型 - 下载及隔离环境
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Elastic 中国社区官方博客2 天前
Elasticsearch:相关性在 AI 代理上下文工程中的影响
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Albert Edison2 天前
【项目设计】基于正倒排索引的Boost搜索引擎
linux·网络·c++·后端·http·搜索引擎
极客学术工坊3 天前
2023年第十五届 “电工杯” 大学生数学建模竞赛-B题 人工智能对大学生学习影响的评价-人工智能对大学生学习影响的评价
搜索引擎
青鱼入云3 天前
ES脚本语言Painless介绍
大数据·elasticsearch·搜索引擎
熙客4 天前
搜索引擎数据库介绍
搜索引擎
Elastic 中国社区官方博客5 天前
使用 Mastra 和 Elasticsearch 构建具有语义回忆功能的知识 agent
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
新手小白*5 天前
Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】
大数据·elasticsearch·搜索引擎
网络精创大傻5 天前
构建 Multilingo:一个集成 Telex 的 AI 翻译代理
人工智能·搜索引擎