hugegraph-vermeer reading
1. vermeer代码理解
1.1 架构
1.1.1 Master
Key responsibilities:
Job submission and management
Task distribution across worker nodes
Worker node health monitoring
Result collection and aggregation
Client communication
1.1.2 worker
Key responsibilities:
- Loading graph data from specified sources
- Executing assigned graph algorithms
- Processing graph partitions in memory
- Reporting computation results back to the master
- Handling custom algorithm extensions
1.2 执行流程
1.2.1 初始化
1.2.1.1 master初始化
Main(apps/master/master_main.go)->SetRouters(设置对客户端的http服务)
Main(apps/master/master_main.go)->services.ServiceMaster.Init()->Init(apps/master/services/service.go)->初始化各种组件
1.2.1.2 worker初始化
Main(apps/worker/worker_main.go)->Init(apps/worker/service.go)->SayHelloMaster(apps/master/bl/grpc_handlers.go)
1.2.2 下发任务
1.2.2.1 master下发任务
POST(apps/master/services/http_tasks.go)(客户端触发提交)->CreateTaskInfo()/QueueExecuteTasks(apps/master/bl/task_bl.go)->QueueTask(apps/master/bl/scheduler_bl.go)->[PushTask(apps/master/schedules/space_queue.go)->PushTask(apps/master/schedules/task_queue.go)]/[dispatch(apps/master/bl/scheduler_bl.go)->doDispatch(apps/master/bl/scheduler_bl.go)->HeadTasks()/startChan->唤醒waitingTask(apps/master/bl/scheduler_bl.go)->(这里通过workerMgr.ApplyGroup拿到wroker代理)handleStartTask(apps/master/bl/scheduler_bl.go)->startWaitingTask(apps/master/bl/scheduler_bl.go)->StartTask(apps/master/bl/task_starter.go)->StartComputeTask(apps/master/bl/task_starter.go)->AsyncCompute(apps/master/bl/grpc_handlers.go)->Send()]
1.2.2.2 worker接受任务
Main(apps/worker/worker_main.go)->Run(apps/worker/service.go)->HandleComputeTask(apps/worker/grpc_handlers.go)->StartCompute(apps/worker/compute_bl.go)->ComputeTaskStatus()
1.2.3 Space与Graph
1.2.3.1 Space
概念:指的是Client用于创建Graph的空间。Space由Client指定,进一步通过Token方式传入,可以通过TokenFactory创建。用法详见(client/client.go)。
1.2.3.2 Graph
概念:指的是Client在自己Space中创建的工作流。
1.2.3.3 Worker
概念:指的是实际可以处理任务的节点。
1.2.3.4 WorkerGroup
概念:一组Worker,是调度的最小粒度。
1.2.3.5 流程
Client指定Space,通过Token传入。(apps/master/services/http_admin.go)
Client向Master创建Space(目前只能通过Admin创建)。(apps/master/services/http_admin.go)
Client向Master创建Graph(目前只能通过Admin创建),从当前Client的Token中获取Space,在该Space中创建。(apps/master/services/http_admin.go)
Client向Master请求将Worker分配到WorkerGroup。(apps/master/services/http_admin.go)
Client向Master请求将WorkerGroup分配到Space或Graph。(apps/master/services/http_admin.go)
客户端下发任务。(apps/master/services/http_tasks.go)通过
CreateTaskInfo
创建Task,其中包含Task所属的Space和Graph。调度器从队列中拿出任务。(apps/master/bl/scheduler_bl.go)
试图分配agent(apps/master/schedules/broker.go)
加载graph:getAgent(apps/master/schedules/broker.go)->getAgentFromWorker(apps/master/schedules/broker.go)
开始计算:getAgent(apps/master/schedules/broker.go)->getAgentFromGraph(apps/master/schedules/broker.go)->(apps/master/schedules/broker.go)
AssignTask(apps/master/schedules/broker.go)
1.2.3.6 当初始化时确定Group
思考:首先group信息从worker配置加载,因此必须从worker向master传递。而worker启动时会向master发送sayHello消息,因此必须在这里多传入group信息(需要注意空值采用$
)
更改SayHello(apps/worker/service.go+apps/protos/master_grpc.pb.go)
master收到消息后会进行以下步骤:
检查等待重名的worker离开(自动清理)
**创建新的worker(CreateWorker)**:在此处,会尝试从对象存储中加载worker,填入group信息。因此需要考虑冲突的情况。(目前认为对象存储中的信息优先级高于默认的worker传入的信息)
添加worker(AddWorker)。注意,这里addWorker,已经能够根据worker中的group信息,自动添加group(通过workersByName,而之后查询group内的worker也只是遍历(apps/master/workers/worker_manager.go))。因此只需要在此处之前分配group信息即可。
初始化worker
恢复graph
参考
Key Features | hugegraph/hugegraph-vermeer | DeepWiki
- Title: hugegraph-vermeer reading
- Author: Ethereal
- Created at: 2025-05-21 16:41:41
- Updated at: 2025-05-30 01:30:02
- Link: https://ethereal-o.github.io/2025/05/21/hugegraph-vermeer-reading/
- License: This work is licensed under CC BY-NC-SA 4.0.