使用spark-connector始终无法读取Nebula Graph数据,抛出ExecuteFailedException: Execute failed: no parts succeed, error message: Unable to activate object

我也遇到了类似的问题,读取数据的时候,df.show一直不返回结果,就报ERROR ScanVertexResultIterator: get storage client error

1 个赞
  1. 关于帖子中已有问题: 单机部署 使用默认配置部署,spark connector 使用示例代码 读取nebula,报 ERROR ScanVertexResultIterator: get storage client error - #5,来自 nicole 本质都是一样的,确认你的spark环境是否能访问 你在nebula中show hosts 显示出来的地址。

读写调用的Nebula服务不一样,写数据调用graph服务,默认端口号9669, 读数据调用storage服务,默认端口号9779.

storage服务都是正常的,如下:
image

端口也可正常访问

image

我这边感觉是docker-compose部署的问题,端口指定应该是有问题


但是我这边都做了转发 :joy: 不知道怎么改一下

这里再补充一下,我使用spark-connector自带的docker-compose.yaml 在本地部署是可以连接访问的。但是,以同样的方式部署到服务器,获取数据仍然会出现get storage client error 报的错是超时,但是数据量并不大,用的是官方的basketball数据集。是不是在服务器部署不推荐使用docker-compose的形式?

虽然你的9779端口映射出来了,但meta返回的是容器内的地址。 connector内部使用的storage地址是show hosts中的地址。 你show hosts 贴一下。

ps:如果需要用到storage服务,不建议docker部署。

OK,明白了。docker-compose的yaml应该需要显式指定storage ip,我这边debug出来显示的ip是有问题,我再改一下,感谢!

你好,我也遇到了get storage client error的问题。
我在本地使用docker-compose启动nebula,在docker-compose.yaml中显式指定了端口映射。
telnet 127.0.0.1 9559/9669/9779都成功
show hosts的内容为(不知道为啥不能上传图片):


| HOST | Port | Status | Leader count | Leader distribution | Partition distribution |
| "storage0" | 9779 | "ONLINE" | 5 | "importer_test:5" | "importer_test:5" |
|"Total" |  |  |  5 | "importer_test:5" | "importer_test:5" |

请问如何解决呢?

@viper 是这样的,代码里获取 storage 地址是从 metaD 获取的,而 metaD 里的 storage 地址是 storage自己的配置里上报给 metaD 的,所以,您需要保证的是配置里的地址和 docker 暴露出来的 给 spark 访问的地址一定。

我的情况呢,我的Storage服务检查是没问题的。。避免重复复制粘贴,具体请看我上个回复,麻烦了。

哈哈,抱歉我以为楼主的已经解决了,原来是歪楼了。
其实和我回复上边同学的信息一致

  • storaged 的地址不是 client(spark)指定的,而是从 meta 读取出来的信息等价于 show hosts 的 host 列,我这里的例子是 domain name 的
(root@nebula) [basketballplayer]> show hosts storage
+-------------+------+----------+-----------+--------------+----------------------+
| Host        | Port | Status   | Role      | Git Info Sha | Version              |
+-------------+------+----------+-----------+--------------+----------------------+
| "storaged0" | 9779 | "ONLINE" | "STORAGE" | "07ccfde"    | "2021.11.03-nightly" |
| "storaged1" | 9779 | "ONLINE" | "STORAGE" | "07ccfde"    | "2021.11.03-nightly" |
| "storaged2" | 9779 | "ONLINE" | "STORAGE" | "07ccfde"    | "2021.11.03-nightly" |
+-------------+------+----------+-----------+--------------+----------------------+
Got 3 rows (time spent 2060/4074 us)
  • 如果我需要在代码里用 storage client 去读数据,就需要我的代码运行环境能够访达 show hosts 里的 host 加 port,这需要 dns 可解析(如果是非ip),ip 可访达,以及这个 ip 下的 port 确实是 storageD listen 的,您能保证以上么?

您好,抱歉我还是不太理解,从您上面提供的样例来看,host是"storaged0",那我如何知道storage0对应的IP是多少呢。另外,在spark脚本中,Reader可以配置的地址只有withMetaAddress(),这里应该填哪个呢?

我这里的情况比较特别,是用 docker compose 拉的,这里边 storage0 实际上是 storage0所在 的容器的域名,在 nebula 所在的 容器网络里,他是可解析的(dns),而且解析出来的地址是那个容器网络的地址。

所以 nicle 不推荐有 storage client 的场景去使用 docker部署,因为需要我们额外做一些工作(比如迫使 spark 运行在 nebula 容器网络里,或者手动加dns 解析让这个地址能转到真正的 storageD 的地址)

另外,在spark脚本中,Reader可以配置的地址只有withMetaAddress(),这里应该填哪个呢?

这就是我提到的,正常 storage 的地址是被 meta 服务发现获取的,而那个地址的信息来源正式 每一个 storage 的 conf,对于客户端来说,meta 地址是不变的,但是 storage 是可能变化的(比如扩容,增加了,替换了坏掉的),所以使用的方式是 spark client 只需要知道 meta 的地址,通过 meta 去获得 storage 的 host list。

直接回答你的问题 这里应该填哪个呢?这里填的就是 字面的 Meta 的地址(而不是 storage的地址)

要想使得 spark 能访问 storage的地址,需要保证 这些 meta 里存着的 storage 的地址是外部(spark)可以访达的。

1 个赞

你始终没贴show hosts的结果。
你的storage服务是好的,是你的应用程序访问不了 show hosts 显示的storage地址。 看你前面贴的服务的status信息应该不是docker部署的,那就要看你配置的ip是不是127.0.0.1了。 所以你贴一下show hosts结果就能知道问题所在了。

我完整描述一下我的需求以及目前遇到的问题吧,老师您可否帮看看如何部署或者如何配置比较合适。
1、将数据导入nebula-graph中 – 使用docker的nebula-importer;
2、将数据从nebula-graph转移至spark中 – 加载nebula-spark-connector然后编写scala程序;
3、使用graphX或者其他模块,对spark中的数据进行分析;
目前:
1、我使用docker-compose拉取了nebula-graph,并在docker-compose.yaml中显式指定了端口映射,比如"9669:9669";
2、我使用docker部署了spark;
3、我使用nebula-spark-connector时,遇到get store client error的问题;
非常感谢老师的帮助

确定问题并解决了。。。回滚事件
1、使用spark-connector发现,跑模板代码可写不可读。可写原因是,解析的地址是 client(spark)指定的,也就是我们代码指定的,便发现可成功运行。然后,会发现不可读,因为storaged 的地址不是 client(spark)指定的,meta 读取出来的信息等价于 show hosts 的 host 列,如下图。。
读取的是127.0.0.1:9779与storage构建的连接。如果是同一服务器玩没问题,但如果跑的代码(本地)与部署的nebula服务跨服务器就访问不了了(如我)。。。
我的解决方案如下:1)修改部署的nebula 三个服务有关配置文件(–meta_server_addrs,–local_ip),IP信息,2)重启

2、此时我以为好了,再跑代码发现依然有问题。。。经排查发现,我们修改IP后,在修改IP之前玩的所有数据均会失效。故重新跑数据,再读,便可生效!!!

1 个赞

你好,请问你是docker部署的nebula吗?

已排查解决,谢谢

1 个赞

我是rpm方式部署,你看下我的经历看对你有帮助麽 :sweat_smile:

如果您 spark 和 nebula 在同一个单独机器上,有一个方便的方法,不需要修改 docker-compose 的配置,只需要让 spark 的容器网络和 nebula 相同就可以了,然后你就可以指定 metad 的名字 + 端口 就可以了,所有的名字都在这个容器网络里可解析可访问。(可以参考我容器部署运行 nebula exchange 的文章 Nebula LiveJournal,上手 LiveJournal 数据集导入 Nebula Graph 与图算法执行 - siwei.io

您手动修改映射端口的话,需要注意每一种服务类型的容器都在同一个机器上,端口不能冲突,所以你如果自定义外部映射里边端口的话,其中至少有两个不是默认的端口。
这解决了外部可访问的问题,但是还没解决 meta 里知道你修改了新的端口的问题,然后你需要修改 strorage 的配置,保证他的地址是你修改了端口映射的那个,这里要注意的是,这个地址要同时保证容器网络里边和外部(host)都可以访问,所以不如我上边提到的,直接用容器网络了哈,当然,缺点就是 spark 要求在 nebula 同一个机器。