如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Vermeer是一个高性能内存图计算平台,采用单二进制部署模式。它提供20多种图算法、自定义算法扩展功能,并能与HugeGraph无缝集成。该平台专为中大型图数据的快速迭代计算设计,支持主从架构实现横向扩展,可通过REST API和gRPC轻松与现有系统集成,并提供内置的Web UI仪表板用于监控和作业管理。
mermaidgraph TB subgraph Client["客户端层"] API[REST API客户端] UI[Web UI仪表板] end subgraph Master["主节点"] HTTP[HTTP服务器 :6688] GRPC_M[gRPC服务器 :6689] GM[图管理器] TM[任务管理器] WM[工作节点管理器] SCH[调度器] end subgraph Workers["工作节点"] W1[工作节点1 :6789] W2[工作节点2 :6789] W3[工作节点N :6789] end subgraph DataSources["数据源"] HG[(HugeGraph)] CSV[本地CSV] HDFS[HDFS] end API --> HTTP UI --> HTTP HTTP --> GM HTTP --> TM GRPC_M <--> W1 GRPC_M <--> W2 GRPC_M <--> W3 W1 <--> HG W2 <--> HG W3 <--> HG W1 <--> CSV W1 <--> HDFS style Master fill:#e1f5fe style Workers fill:#fff3e0 style DataSources fill:#f1f8e9
vermeer/ ├── main.go # 单二进制入口点 ├── Makefile # 构建自动化 ├── algorithms/ # 20+算法实现 │ ├── pagerank.go │ ├── louvain.go │ ├── sssp.go │ └── ... ├── apps/ │ ├── master/ # 主服务 │ │ ├── services/ # HTTP处理器 │ │ ├── workers/ # 工作节点管理 | | ├── schedules/ # 任务调度策略 │ │ └── tasks/ # 任务调度 │ ├── compute/ # 工作节点计算逻辑 │ ├── graphio/ # 图I/O(HugeGraph、CSV、HDFS) │ │ └── hugegraph.go # HugeGraph集成 │ ├── protos/ # gRPC定义 │ └── common/ # 工具类、日志、指标 ├── config/ # 配置模板 │ ├── master.ini │ └── worker.ini ├── tools/ # 二进制依赖(supervisord、protoc) └── ui/ # Web仪表板
选项1:Docker(推荐)
拉取镜像:
bashdocker pull hugegraph/vermeer:latest
创建专用配置目录(例如 ~/vermeer-config/),并在其中放置 master.ini 和 worker.ini 文件(参见配置部分)。
使用Docker运行:
bash# 主节点 docker run -v ~/vermeer-config:/go/bin/config hugegraph/vermeer --env=master # 工作节点 docker run -v ~/vermeer-config:/go/bin/config hugegraph/vermeer --env=worker
安全注意:仅挂载包含Vermeer配置文件的目录。避免挂载整个主目录以最小化安全风险。
Docker Compose
更新 ~/worker.ini 中的 master_peer 为 172.20.0.10:6689,并编辑 docker-compose.yml 以挂载配置目录:
yamlvolumes: - ~/:/go/bin/config # 在此处更改为实际配置路径
bashdocker-compose up -d
选项2:二进制下载
bash# 下载二进制文件(替换版本和平台) wget https://github.com/apache/hugegraph-computer/releases/download/vX.X.X/vermeer-linux-amd64.tar.gz tar -xzf vermeer-linux-amd64.tar.gz cd vermeer # 运行主节点和工作节点 ./vermeer --env=master & ./vermeer --env=worker &
--env 参数指定 config/ 文件夹中的配置文件名(例如 master.ini、worker.ini)。
使用Shell脚本
在 vermeer.sh 中配置参数,然后:
bash./vermeer.sh start master ./vermeer.sh start worker
选项3:从源码构建
前提条件
curl 和 unzip 工具(用于下载依赖)构建步骤
推荐:使用Makefile:
bash# 首次设置(下载supervisord和protoc二进制文件) make init # 为当前平台构建 make # 或为特定平台构建 make build-linux-amd64 make build-linux-arm64
替代方案:使用构建脚本:
bash# 自动检测平台 ./build.sh # 或指定架构 ./build.sh amd64 ./build.sh arm64
开发构建
用于Web UI热重载的开发模式:
bashgo build -tags=dev
清理构建产物
bashmake clean # 移除二进制文件和生成的资源 make clean-all # 同时移除下载的工具(supervisord、protoc)
主节点配置(master.ini)
ini[default] # 主节点HTTP监听地址 http_peer = 0.0.0.0:6688 # 主节点gRPC监听地址 grpc_peer = 0.0.0.0:6689 # 主节点对等地址(工作节点引用) master_peer = 127.0.0.1:6689 # 运行模式 run_mode = master # 任务调度策略 task_strategy = 1 # 并行任务数量 task_parallel_num = 1
注意:HugeGraph连接详情(pd_peers、server、graph)在图加载API请求中提供,而非配置文件。详见HugeGraph集成部分。
工作节点配置(worker.ini)
ini[default] # 工作节点HTTP监听地址 http_peer = 0.0.0.0:6788 # 工作节点gRPC监听地址 grpc_peer = 0.0.0.0:6789 # 要连接的主节点gRPC地址 master_peer = 127.0.0.1:6689 # 运行模式 run_mode = worker # 工作节点组标识符 worker_group = default
| 算法 | 类别 | 描述 |
|---|---|---|
| PageRank | 中心性 | 通过链接结构衡量顶点重要性 |
| Personalized PageRank | 中心性 | 从特定源顶点计算PageRank |
| Betweenness Centrality | 中心性 | 通过最短路径衡量顶点重要性 |
| Closeness Centrality | 中心性 | 衡量到所有其他顶点的平均距离 |
| Degree Centrality | 中心性 | 简单的入/出度计算 |
| Louvain | 社区检测 | 基于模块度的社区检测 |
| Louvain (Weighted) | 社区检测 | 边加权图的加权变体 |
| LPA | 社区检测 | 标签传播算法 |
| SLPA | 社区检测 | 说话者-听者标签传播 |
| WCC | 社区检测 | 弱连通分量 |
| SCC | 社区检测 | 强连通分量 |
| SSSP | 路径查找 | 单源最短路径(Dijkstra) |
| Triangle Count | 图结构 | 计算图中的三角形数量 |
| K-Core | 图结构 | 查找k核子图 |
| K-Out | 图结构 | k度过滤 |
| Clustering Coefficient | 图结构 | 衡量局部聚类程度 |
| Cycle Detection | 图结构 | 检测有向图中的环 |
| Jaccard Similarity | 相似度 | 计算基于邻居的相似度 |
| Depth (BFS) | 遍历 | 广度优先搜索深度分配 |
Vermeer在端口 6688(可在 master.ini 中配置)上公开REST API。
| 端点 | 方法 | 描述 |
|---|---|---|
/api/v1/graphs | POST | 从数据源加载图 |
/api/v1/graphs/{graph_id} | GET | 获取图元数据 |
/api/v1/graphs/{graph_id} | DELETE | 从内存中卸载图 |
/api/v1/compute | POST | 在已加载的图上执行算法 |
/api/v1/tasks/{task_id} | GET | 获取任务状态和结果 |
/api/v1/workers | GET | 列出已连接的工作节点 |
/ui/ | GET | Web UI仪表板 |
bash# 1. 从HugeGraph加载图 curl -X POST http://localhost:6688/api/v1/graphs \ -H "Content-Type: application/json" \ -d '{ "graph_name": "my_graph", "load_type": "hugegraph", "hugegraph": { "pd_peers": ["127.0.0.1:8686"], "graph_name": "hugegraph" } }' # 2. 运行PageRank curl -X POST http://localhost:6688/api/v1/compute \ -H "Content-Type: application/json" \ -d '{ "graph_name": "my_graph", "algorithm": "pagerank", "params": { "max_iterations": 20, "damping_factor": 0.85 }, "output": { "type": "hugegraph", "property_name": "pagerank_value" } }' # 3. 检查任务状态 curl http://localhost:6688/api/v1/tasks/{task_id}
Vermeer通过以下方式与HugeGraph集成:
ScanPartition)从HugeGraph Store流式传输顶点/边图加载请求中的配置:
json{ "load_type": "hugegraph", "hugegraph": { "pd_peers": ["127.0.0.1:8686"], "graph_name": "hugegraph", "vertex_label": "person", "edge_label": "knows" } }
从本地CSV文件加载图:
json{ "load_type": "csv", "csv": { "vertex_file": "/path/to/vertices.csv", "edge_file": "/path/to/edges.csv", "delimiter": "," } }
从Hadoop分布式文件系统加载:
json{ "load_type": "hdfs", "hdfs": { "namenode": "hdfs://namenode:9000", "vertex_path": "/graph/vertices", "edge_path": "/graph/edges" } }
自定义算法需实现 algorithms/algorithms.go 中的 Algorithm 接口:
注意:以下是简化的概念性接口,用于说明。实际算法实现需参见
apps/compute/api.go中定义的WorkerComputer和MasterComputer接口。
gotype Algorithm interface { // 初始化算法 Init(params map[string]interface{}) error // 为顶点计算一次迭代 Compute(vertex *Vertex, messages []Message) (halt bool, outMessages []Message) // 聚合全局状态(可选) Aggregate() interface{} // 检查终止条件 Terminate(iteration int) bool }
注意:这是简化的概念示例。实际算法必须实现
WorkerComputer接口。详见vermeer/algorithms/degree.go获取工作示例。
gopackage algorithms type DegreeCount struct { maxIter int } func (dc *DegreeCount) Init(params map[string]interface{}) error { dc.maxIter = params["max_iterations"].(int) return nil } func (dc *DegreeCount) Compute(vertex *Vertex, messages []Message) (bool, []Message) { // 将度存储为顶点值 vertex.SetValue(float64(len(vertex.OutEdges))) // 第一次迭代后停止 return true, nil } func (dc *DegreeCount) Terminate(iteration int) bool { return iteration >= dc.maxIter }
在 algorithms/algorithms.go 中注册算法:
gofunc init() { RegisterAlgorithm("degree_count", &DegreeCount{}) }
Vermeer采用内存优先的方法:
最佳实践:确保工作节点总内存超过图大小2-3倍,以提供算法工作空间。
将Vermeer作为守护进程运行,支持自动重启和日志轮转:
bash# 配置位于 config/supervisor.conf ./tools/supervisord -c config/supervisor.conf -d
示例supervisor配置:
ini[program:vermeer-master] command=/path/to/vermeer --env=master autostart=true autorestart=true stdout_logfile=/var/log/vermeer-master.log
如果修改 .proto 文件,需重新生成Go代码:
bash# 安装protobuf Go插件 go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28.0 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2.0 # 生成(根据平台调整protoc路径) vermeer/tools/protoc/linux64/protoc vermeer/apps/protos/*.proto --go-grpc_out=vermeer/apps/protos/. --go_out=vermeer/apps/protos/. # 请注意移除任何许可证头
damping_factor=0.85、tolerance=0.0001 以加快收敛weighted=true您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务