使用spark-connector 读取Nebula3报错 no parts succeed, error message: Unable to activate object

这里确实是当前的设计,99% 的场景下 meta/storage 都不需要外部访问,只访问 graphD 就行了。

所以在需要用到 storageclient 的时候,目前就需要 meta/storage 绑定的地址外部可以访问。

现在服务里给绑定地址还必须是存在的一个网卡上的地址,公有云的 floating IP/NAT 的外网 IP 都不是这样的,这里就会有问题。

最直接的绕过方式是把 storageclient(spark)的运行环境挪到和 nebulagraph 所在的同一个内网里。

否则的话需要一些其他的变化才行:sob:(比如 1. 在 spark 所在环境做一些路由或者代理让它走到公有云那个地址,或者 2. 看看能不能改一下 storaged 的绑定网卡机制)

关于 2. 我去提一个 issue。https://github.com/vesoft-inc/nebula/issues/4507

不知道你们有没有条件在 nebulagraph 的同一个腾讯云内网里起 spark 呢?

cc @MuYi

1 个赞

首先,我们公有云部署不是nat 的,另外按这个说法,是不是我目前这种部署方式,Nebula服务配置的内网地址,然后通过外网访问,这种是怎么都连接不到storaged 服务的? 这个可以通过比如修改服务的配置啊,ip 的能解决么?如果一定要部署到云上,那开发起来就很不方便了,肯定是希望本地能读到在本地测试,这个就跟本地java 程序读取 mysql 这种存储系统一样,理解上觉得没啥区别啊,为啥就是不行呢?

这里的背景是 spark connector 有能力绕过 nebulagraph 的外部interface (GraphD)直接扫底层数据,不是最常见的链接数据库的情况哈。

还有,这里边的设计把服务的地址和identity 耦合了,所以失去了重新配置的灵活性(https://github.com/vesoft-inc/nebula-spark-connector/pull/47 之前尝试过解决,但是发现还有其他问题搁置了)

这里,服务去 validate 绑定地址为网卡上的地址造成了配置 floating IP 是不允许的,我们确实可以考虑改善这个场景。可能把服务的 identity 和地址直接绑定去掉在短期不是特别可行了,可以想办法比如引入外部地址和内部地址的机制允许外部的 storageclient 访问的机制。

https://github.com/vesoft-inc/nebula/blob/2f3259de4673ff3d5c6f2281a6c606375b0afebe/src/common/network/NetworkUtils.cpp#L325-L326

撞到用 floating ip 配置为接口这个情况的确是第一次遇到,我们会好哈讨论一下怎么解决哈。

如果可能,可以先把 spark 跑在云上运行么?

嗯嗯 nat 只是一个可能,想表达不是网卡上的地址,撞到了 validation,这个外网 ip 是在 storage 所在操作系统的网卡下的地址么?

https://github.com/vesoft-inc/nebula/blob/2f3259de4673ff3d5c6f2281a6c606375b0afebe/src/common/network/NetworkUtils.cpp#L325-L326

因为 Nebula Graph 的计算存储分离机制下,在图分析的全图扫描查询场景下,可以做到绕过 Query 接口,从 StorageD 直接访问 NebulaGraph ,这本来是一个便利,但是也带来了不便,就是咱们现在遇到的问题,外部需要访问本来是内部的接口,这里我们准备研究一下怎么弄更合理一些,比如允许 graphD 透传 storage 接口,或者其他方面的

从目前了解下来看,我的感觉就是如果Nebula 服务在云上部署的话,其实直接是访问不了stroaged 服务的,也就是个storage不支持外网ip访问,就像上面说的,给定的绑定地址还必须是存在一个网卡上的地址
2. nebulagraph 的同一个腾讯云内网里起 spark 这个问题,我理解下来是把程序部署到内网的机器上跑吧,只不过我现在还是处于开发测试阶段,测试代码,还没到部署的阶段额,如果每次改点代码就需要打包到服务器上执行,那真的受不了的,太麻烦了 :joy:,大佬,按我理解是不是现有架构下,Nebula 服务云环境部署,外网访问就是都是有这个问题? 那如果不部署在云服务器上应该就是不会有这个问题了吧

的确,另外我也在想,也可以考虑为 storage 在 graphD 上增加存储接口透传的可能性 https://github.com/vesoft-inc/nebula/issues/4509 ,或者是上边的那个 issue (肯定不能直接取消那个validation,因为那样内部的traffic会绕到公有云网关)

感谢感谢回复,既然知道目前不好解决,我这边确实不能使用云服务器部署的Nebula进行本地开发调试,我只能想办法在本地重新搭建一个单机版的Nebula,把数据导入到本地Nebula中进行本地开发调试,这块,确实如果能直接连接云服务器供本地调试就方便很多了,因为大多时间不在公司,在客户这里,又要连接公司服务器做开发测试,我们服务器又都是云服务器

嗯嗯,理解,非常抱歉哈。

你可以试试我的 https://github.com/wey-gu/nebula-up/

里边的 all-in-one 模式支持一键拉起来 spark + nebulagraph 在容器里哈:

curl -fsSL nebula-up.siwei.io/all-in-one.sh | bash -s -- v3 spark

不过依赖 docker

之后有一些小快捷方式,比如

~/.nebula-up/nebula-pyspark.sh

就进到 pyspark shell 了。

嗯嗯,感谢大佬,先star一波

1 个赞

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。