如何让容器化NebulaGraph对接外部Spark工具(含Spark Connector)
容器外Spark对接容器化NebulaGraph的核心要求
不管是Docker-Compose还是K8s部署的NebulaGraph集群,容器外Spark要正常对接,核心要解决网络连通性和服务地址正确性两个问题,以下分场景说明具体要求:
Docker-Compose 部署场景
- 端口映射配置:在
docker-compose.yml中,必须将NebulaGraph核心组件的端口映射到宿主机可访问的端口:- Graph服务(graphd):默认容器端口9669,映射到宿主机端口(如
9669:9669) - Meta服务(metad):默认容器端口9559,映射到宿主机端口(如
9559:9559) - Storage服务(storaged):默认容器端口9779,映射到宿主机端口(如
9779:9779)
注意:如果宿主机端口被占用,可自定义映射(如
19669:9669),后续Spark配置需使用自定义端口 - Graph服务(graphd):默认容器端口9669,映射到宿主机端口(如
- Spark Connector地址配置:在Spark读取数据的配置中,必须使用宿主机IP + 映射后的端口,而非容器内部IP。例如:
spark.read.nebula("graphd://宿主机IP:9669", "metad://宿主机IP:9559", "my_space", "my_tag") - 网络权限开放:宿主机防火墙、安全组需开放上述映射端口,允许Spark所在机器的IP访问。
K8s 部署场景
- 服务外部暴露:将NebulaGraph的三个核心组件通过K8s Service暴露到集群外部:
- 优先使用
LoadBalancer类型(有云厂商负载均衡支持时),直接获取外部可访问的IP和端口 - 无负载均衡时使用
NodePort类型,通过K8s节点IP + NodePort访问
注意:Storage服务是分布式节点,每个storaged Pod都需要暴露对应的端口(或通过Headless Service配合NodePort,确保每个节点端口可访问)
- 优先使用
- 元数据地址配置:部署NebulaGraph时,必须将metad的
--meta_server_addrs参数设置为外部可访问的地址(如LoadBalancer的IP:端口,或节点IP:NodePort),否则storaged会向metad注册内部Pod IP,导致Spark无法连接到storaged节点 - Spark Connector地址配置:Spark配置中使用外部暴露的地址:
若使用NodePort,则替换为spark.read.nebula("graphd://LB_IP:9669", "metad://LB_IP:9559", "my_space", "my_tag")节点IP:NodePort - 网络策略放行:如果K8s集群启用了网络策略,需添加规则允许Spark所在IP段访问Nebula的Service端口
通用要求
- 版本匹配:Spark Connector的版本必须与NebulaGraph集群版本完全一致(如Nebula 3.5.0对应Spark Connector 3.5.0),版本不兼容会引发连接或数据读取失败
- 权限配置:确保Spark使用的Nebula账号拥有目标图空间的
READ权限,执行授权命令:GRANT READ ON SPACE my_space TO spark_user; - 连接参数完整性:Spark Connector配置中需明确指定图空间名称、用户名、密码(若开启认证),避免因参数缺失导致连接失败
内容的提问来源于stack exchange,提问作者Wey Gu
相关产品推荐
相关产品推荐

