hugegraph-vermeer reading

Ethereal Lv4

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 流程
  1. Client指定Space,通过Token传入。(apps/master/services/http_admin.go)

  2. Client向Master创建Space(目前只能通过Admin创建)。(apps/master/services/http_admin.go)

  3. Client向Master创建Graph(目前只能通过Admin创建),从当前Client的Token中获取Space,在该Space中创建。(apps/master/services/http_admin.go)

  4. Client向Master请求将Worker分配到WorkerGroup。(apps/master/services/http_admin.go)

  5. Client向Master请求将WorkerGroup分配到Space或Graph。(apps/master/services/http_admin.go)

  6. 客户端下发任务。(apps/master/services/http_tasks.go)通过CreateTaskInfo创建Task,其中包含Task所属的Space和Graph。

  7. 调度器从队列中拿出任务。(apps/master/bl/scheduler_bl.go)

  8. 试图分配agent(apps/master/schedules/broker.go)

    1. 加载graph:getAgent(apps/master/schedules/broker.go)->getAgentFromWorker(apps/master/schedules/broker.go)

    2. 开始计算:getAgent(apps/master/schedules/broker.go)->getAgentFromGraph(apps/master/schedules/broker.go)->(apps/master/schedules/broker.go)

  9. AssignTask(apps/master/schedules/broker.go)

1.2.3.6 当初始化时确定Group

思考:首先group信息从worker配置加载,因此必须从worker向master传递。而worker启动时会向master发送sayHello消息,因此必须在这里多传入group信息(需要注意空值采用$

  1. 更改SayHello(apps/worker/service.go+apps/protos/master_grpc.pb.go)

  2. master收到消息后会进行以下步骤:

    1. 检查等待重名的worker离开(自动清理)

    2. **创建新的worker(CreateWorker)**:在此处,会尝试从对象存储中加载worker,填入group信息。因此需要考虑冲突的情况。(目前认为对象存储中的信息优先级高于默认的worker传入的信息)

    3. 添加worker(AddWorker)。注意,这里addWorker,已经能够根据worker中的group信息,自动添加group(通过workersByName,而之后查询group内的worker也只是遍历(apps/master/workers/worker_manager.go))。因此只需要在此处之前分配group信息即可。

    4. 初始化worker

    5. 恢复graph

参考

Key Features | hugegraph/hugegraph-vermeer | DeepWiki

HugeGraph-Vermeer Quick Start | HugeGraph

Architecture | 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.
 Comments
On this page
hugegraph-vermeer reading