] CSV[Local 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 # Single binary entry point ├── Makefile # Build automation ├── algorithms/ # 20+ algorithm implementations │ ├── pagerank.go │ ├── louvain.go │ ├── sssp.go │ └── ... ├── apps/ │ ├── master/ # Master service │ │ ├── services/ # HTTP handlers │ │ ├── workers/ # Worker management | | ├── schedules/ # Task scheduling strategies │ │ └── tasks/ # Task scheduling │ ├── compute/ # Worker-side compute logic │ ├── graphio/ # Graph I/O (HugeGraph, CSV, HDFS) │ │ └── hugegraph.go # HugeGraph integration │ ├── protos/ # gRPC definitions │ └── common/ # Utilities, logging, metrics ├── config/ # Configuration templates │ ├── master.ini │ └── worker.ini ├── tools/ # Binary dependencies (supervisord, protoc) └── ui/ # Web dashboard
Pull the image:
bashdocker pull hugegraph/vermeer:latest
Create a dedicated config directory (e.g., ~/vermeer-config/) with master.ini and worker.ini files (see Configuration section).
Run with Docker:
bash# Master node docker run -v ~/vermeer-config:/go/bin/config hugegraph/vermeer --env=master # Worker node docker run -v ~/vermeer-config:/go/bin/config hugegraph/vermeer --env=worker
Security Note: Only mount directories containing Vermeer configuration files. Avoid mounting your entire home directory to minimize security risks.
Docker Compose
Update master_peer in ~/worker.ini to 172.20.0.10:6689, and edit docker-compose.yml to mount your config directory:
yamlvolumes: - ~/:/go/bin/config # Change here to your actual config path
bashdocker-compose up -d
bash# Download binary (replace version and platform) 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 # Run master and worker ./vermeer --env=master & ./vermeer --env=worker &
The --env parameter specifies the configuration file name in the config/ folder (e.g., master.ini, worker.ini).
Using the Shell Script
Configure parameters in vermeer.sh, then:
bash./vermeer.sh start master ./vermeer.sh start worker
Prerequisites
curl and unzip utilities (for downloading dependencies)Build Steps
Recommended: Use Makefile:
bash# First-time setup (downloads supervisord and protoc binaries) make init # Build for current platform make # Or build for specific platform make build-linux-amd64 make build-linux-arm64
Alternative: Use build script:
bash# Auto-detect platform ./build.sh # Or specify architecture ./build.sh amd64 ./build.sh arm64
Development Build
For development with hot-reload of web UI:
bashgo build -tags=dev
Clean Build Artifacts
bashmake clean # Remove binaries and generated assets make clean-all # Also remove downloaded tools (supervisord, protoc)
master.ini)ini[default] # Master HTTP listen address http_peer = 0.0.0.0:6688 # Master gRPC listen address grpc_peer = 0.0.0.0:6689 # Master peer address (self-reference for workers) master_peer = 127.0.0.1:6689 # Run mode run_mode = master # Task scheduling strategy task_strategy = 1 # Number of parallel tasks task_parallel_num = 1
Note: HugeGraph connection details (pd_peers, server, graph) are provided in the graph load API request, not in the configuration file. See HugeGraph Integration section for details.
worker.ini)ini[default] # Worker HTTP listen address http_peer = 0.0.0.0:6788 # Worker gRPC listen address grpc_peer = 0.0.0.0:6789 # Master gRPC address to connect master_peer = 127.0.0.1:6689 # Run mode run_mode = worker # Worker group identifier worker_group = default
| Algorithm | Category | Description |
|---|---|---|
| PageRank | Centrality | Measures vertex importance via link structure |
| Personalized PageRank | Centrality | PageRank from specific source vertices |
| Betweenness Centrality | Centrality | Measures vertex importance via shortest paths |
| Closeness Centrality | Centrality | Measures average distance to all other vertices |
| Degree Centrality | Centrality | Simple in/out degree calculation |
| Louvain | Community Detection | Modularity-based community detection |
| Louvain (Weighted) | Community Detection | Weighted variant for edge-weighted graphs |
| LPA | Community Detection | Label Propagation Algorithm |
| SLPA | Community Detection | Speaker-Listener Label Propagation |
| WCC | Community Detection | Weakly Connected Components |
| SCC | Community Detection | Strongly Connected Components |
| SSSP | Path Finding | Single Source Shortest Path (Dijkstra) |
| Triangle Count | Graph Structure | Counts triangles in the graph |
| K-Core | Graph Structure | Finds k-core subgraphs |
| K-Out | Graph Structure | K-degree filtering |
| Clustering Coefficient | Graph Structure | Measures local clustering |
| Cycle Detection | Graph Structure | Detects cycles in directed graphs |
| Jaccard Similarity | Similarity | Computes neighbor-based similarity |
| Depth (BFS) | Traversal | Breadth-First Search depth assignment |
Vermeer exposes a REST API on port 6688 (configurable in master.ini).
| Endpoint | Method | Description |
|---|---|---|
/api/v1/graphs | POST | Load graph from data source |
/api/v1/graphs/{graph_id} | GET | Get graph metadata |
/api/v1/graphs/{graph_id} | DELETE | Unload graph from memory |
/api/v1/compute | POST | Execute algorithm on loaded graph |
/api/v1/tasks/{task_id} | GET | Get task status and results |
/api/v1/workers | GET | List connected workers |
/ui/ | GET | Web UI dashboard |
bash# 1. Load graph from 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. Run 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. Check task status curl http://localhost:6688/api/v1/tasks/{task_id}
Vermeer integrates with HugeGraph via:
ScanPartition)Configuration in graph load request:
json{ "load_type": "hugegraph", "hugegraph": { "pd_peers": ["127.0.0.1:8686"], "graph_name": "hugegraph", "vertex_label": "person", "edge_label": "knows" } }
Load graphs from local CSV files:
json{ "load_type": "csv", "csv": { "vertex_file": "/path/to/vertices.csv", "edge_file": "/path/to/edges.csv", "delimiter": "," } }
Load from Hadoop Distributed File System:
json{ "load_type": "hdfs", "hdfs": { "namenode": "hdfs://namenode:9000", "vertex_path": "/graph/vertices", "edge_path": "/graph/edges" } }
Custom algorithms implement the Algorithm interface in algorithms/algorithms.go:
NOTE: The following is a simplified conceptual interface for illustration purposes. For actual algorithm implementation, see the
WorkerComputerandMasterComputerinterfaces defined inapps/compute/api.go.
gotype Algorithm interface { // Initialize the algorithm Init(params map[string]interface{}) error // Compute one iteration for a vertex Compute(vertex *Vertex, messages []Message) (halt bool, outMessages []Message) // Aggregate global state (optional) Aggregate() interface{} // Check termination condition Terminate(iteration int) bool }
NOTE: This is a simplified conceptual example. Actual algorithms must implement the
WorkerComputerinterface. Seevermeer/algorithms/degree.gofor a working example.
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) { // Store degree as vertex value vertex.SetValue(float64(len(vertex.OutEdges))) // Halt after first iteration return true, nil } func (dc *DegreeCount) Terminate(iteration int) bool { return iteration >= dc.maxIter }
Register the algorithm in algorithms/algorithms.go:
gofunc init() { RegisterAlgorithm("degree_count", &DegreeCount{}) }
Vermeer uses an in-memory-first approach:
Best Practice: Ensure total worker memory exceeds graph size by 2-3x for algorithm workspace.
Run Vermeer as a daemon with automatic restarts and log rotation:
bash# Configuration in config/supervisor.conf ./tools/supervisord -c config/supervisor.conf -d
Sample supervisor configuration:
ini[program:vermeer-master] command=/path/to/vermeer --env=master autostart=true autorestart=true stdout_logfile=/var/log/vermeer-master.log
If you modify .proto files, regenerate Go code:
bash# Install protobuf Go plugins 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 # Generate (adjust protoc path for your platform) vermeer/tools/protoc/linux64/protoc vermeer/apps/protos/*.proto --go-grpc_out=vermeer/apps/protos/. --go_out=vermeer/apps/protos/. # please note remove license header if any
damping_factor=0.85, tolerance=0.0001 for faster convergenceweighted=true only if edge weights are meaningfulAccess the Web UI dashboard at http://master-ip:6688/ui/ for:
master_peer in worker.ini matches master's gRPC address6689 (gRPC)compute_threads in worker configSee the main Contributing Guide for how to contribute to Vermeer.
Vermeer is part of Apache HugeGraph-Computer, licensed under https://github.com/apache/hugegraph-computer/blob/master/LICENSE.
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务