第四篇: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
系统中构建任务的完整流程,从任务提交到执行及资源调度,涵盖了多个核心组件及其交互过程,但是具体的一些细节还未展开,后续会针对每个组件专门介绍。