spark 写入数据报错 能插入部分数据

地址这样的格式是对的 “127.0.0.1:9559,127.0.0.1:9560”

meta的域名格式需要spark 2.6.2 以上才支持(最近才fix 了不支持域名形式的问题)

如果是 docker-compose,需要让 spark 运行在 容器网络内,最好用 容器跑 spark 指定相同的容器网络:
这是我的一个例子:

docker run --name spark-master --network nebula-docker-compose_nebula-net \
    -h spark-master -e ENABLE_INIT_DAEMON=false -d \
    -v nebula-algorithm/:/root \
    bde2020/spark-master:2.4.5-hadoop2.7

1 个赞

请问 spark 运行在容器网络 nebula-net 么?

可能是无法访问metaclient(spark 客户端读是扫 storage,用途和其他客户端不同-读写都是graphd,spark-connector 读数据需要 metaclient 和 storageclient),因为写路径只需要 graphD、graphclient,而默认不在容器网络里,默认compose的配置下,只有 一个 graphD 外部可以连接

1 个赞
  1. @wey 的观点是正确的,spark 和 nebula 需要在同一个 network 中, 这样才能通过compose文件中的服务名进行访问。
    但是关注到 @chenpeng 的描述:数据库中已经成功插入了部分测试数据,但是后续部分报错。如果配置出错的情况下是不是应该所有数据都不会插入。或许需要看下是不是还有什么其它原因导致的。

  2. 关于 “有时候还有这个错误 ERROR MetaClient: Get Space Error: Method name getSpace not found”

    • 图空间创建是异步实现的,创建完成时立刻尝试使用是可能会失败,官方文档描述需要等待 2 个心跳周期(20 秒),这个错误会不会是这个原因导致的 @chenpeng
2 个赞

:+1:t2:,这个应该是关键,不过,看起来不是 Space 找不到,而是 getSpace 方法找不到。

我怀疑是把不是 meta 的 endpoint 填到了 metaD client addess 里,因为不是 metaD,所以这个 thrift RPC function 不存在。

@chenpeng

不是的,不是运行在容器

这样不行的,因为只要读数据,spark connector 就需要访问 storaged 和 metad,而且,最棘手的问题在于,storageD 的地址是从 metaD 获取的,不是手动指定的,所以在容器内部按照 compose 默认配置,获取的 地址是 storaged0:9779 这样的,外部的 spark 没法访问

详细信息我在这个视频里有提及。 新手玩转 Nebula vol. 12: 如何在 K8s 部署的集群里连接 Nebula Spark Connector & Nebula.Algorithm_哔哩哔哩_bilibili

方案:

  1. 不使用 docker ,用 rpm/deb部署neblua
  2. 修改 compose 配置,让 storage/meta 的地址内外部同时外部可访问
  3. 把spark 跑在容器里,在一个容器网络(最容易)
1 个赞

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