pyspark链接图数据库报错

  • nebula 版本:3.1.1
  • 部署方式:分布式
  • 安装方式: Docker
  • 是否为线上版本: N

我想链接数据库读取一下信息
报错信息 是我写的代码不对吗

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Traceback (most recent call last):
  File "D:/PycharmProjects/pythonProject2/main.py", line 20, in <module>
    "metaAddress", "192.168.1.230:9559").load()
  File "E:\anaconda\envs\successful\lib\site-packages\pyspark\sql\readwriter.py", line 172, in load
    return self._df(self._jreader.load())
  File "E:\anaconda\envs\successful\lib\site-packages\py4j\java_gateway.py", line 1257, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "E:\anaconda\envs\successful\lib\site-packages\pyspark\sql\utils.py", line 63, in deco
    return f(*a, **kw)
  File "E:\anaconda\envs\successful\lib\site-packages\py4j\protocol.py", line 328, in get_return_value
    format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling o45.load.
: java.lang.ClassNotFoundException: Failed to find data source: com.vesoft.nebula.connector.NebulaDataSource. Please find packages at http://spark.apache.org/third-party-projects.html
	at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:657)
	at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:194)
	at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:167)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
	at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
	at py4j.Gateway.invoke(Gateway.java:282)
	at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
	at py4j.commands.CallCommand.execute(CallCommand.java:79)
	at py4j.GatewayConnection.run(GatewayConnection.java:238)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.vesoft.nebula.connector.NebulaDataSource.DefaultSource
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$20$$anonfun$apply$12.apply(DataSource.scala:634)
	at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$20$$anonfun$apply$12.apply(DataSource.scala:634)
	at scala.util.Try$.apply(Try.scala:192)
	at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$20.apply(DataSource.scala:634)
	at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$20.apply(DataSource.scala:634)
	at scala.util.Try.orElse(Try.scala:84)
	at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:634)
	... 13 more

找不到 connector 的类,你的 pyspark 有正确引用需要的包么?

https://github.com/wey-gu/nebula-up/blob/d605e58762bf3316c1b5029272a759b272c2a9e0/spark/Dockerfile#L16

这个是我引用包

pyspark是我从spark-2.4.3-bin-hadoop2.7\spark-2.4.3-bin-hadoop2.7\python\pyspark下直接复制到环境

我去查我环境下的包查不到是这个原因吗?

要把 jar 包弄进去吧?

在服务器执行还是弄到本地
之前我下载过这个包

应该是服务器,你可以搜索一下 pyspark 的基本知识哈,怎么引入 jar 包

快点开发一下图算法的api包吧 :star_struck:

1 个赞
from pyspark.sql import SparkSession
from pyspark.sql import SparkSession, Row
import networkx as nx
from graphframes import GraphFrame
from pyspark.sql import functions as f
from pyspark.sql.types import IntegerType,StringType


spark = SparkSession.builder \
    .config("spark.dynamicAllocation.enabled","false") \
    .config("spark.executor.memory","8g") \
    .config("spark.executor.memoryOverhead","12288") \
    .config("spark.executor.instances","3") \
    .config("spark.jars",r"D:\PycharmProjects\pythonProject2\path_to\nebula-spark-connector-2.5.0.jar") \
    .appName("test1") \
    .getOrCreate()
# print(spark)

# from pyspark.sql import SparkSession
#
# spark = SparkSession.builder.config(
#     "spark.jars",
#     r"D:\PycharmProjects\pythonProject2\path_to\nebula-spark-connector-2.5.0.jar").appName(
#         "nebula-connector").getOrCreate()

# read vertex
df = spark.read.format(
  "com.vesoft.nebula.connector.NebulaDataSource").option(
    "type", "vertex").option(
    "spaceName", "basketballplayer").option(
    "label", "player").option(
    "returnCols", "name,age").option(
    "metaAddress", "192.168.1.230:32951").option(
    "partitionNumber", 1).load()
df.show(n=2)

我这个在不断的刷新以下内容是我分布式的原因吗?


你的nebula是docker部署的,spark集群拿到的storage地址是容器内的,无法访问。你把spark程序也跑在容器内就好了, 有很多类似的帖子,你可以看看

请教一下这个图中的metad0 我应该去哪找呢?

替换成我服务器的地址之后报错 是远程不能反问吗,服务器问题还是我写的代码有毛病

因为 spark 扫数据通过 stoarge client 去做,storage client 是从 meta 获得 storage host list。
这个 metad0,还有从它那里 storage host list(storaged0,stroaged1 这样的) 是集群内部的 storage 地址,docker 部署的话,外部无法访问。

参考

结论:

  • 本地开发,spark 跑在容器内部
  • 生产中,用非容器部署,并且配置 Meta,storage 的地址为 spark(外部)可访问的

如果我把storage 和metad 容器目录下 etc/的config文件 中ip 改成 0.0.0.0也是不可以吗 你认为这个方法可行吗?

服务用自己的 host + port 标识、区分自己,既是地址,也是服务id,给0.0.0.0 不太行哈

对了,python 算法库开始写了

1 个赞

所以说如果storage 和metad的ip改成0.0.0.0本地也连不通容器吗?

您设计的这个服务也是放到服务器上才能链接的通的吗

每一个服务的 local_ip 只要启动过之后,就不能改了,如果你的集群希望 metad/storaged 在集群外部被访问,要在第一次安装启动之前就给配置一个外部能访问的地址,但是不能给0.0.0.0,因为 其他节点要从这个地址访问它,0.0.0.0 不可寻址

我如果想要pyspark读取图数据的话 在第一次启动之前是不是只需要改


etc下的config文件

docker 部署的 nebula 就是单机测试用的,不是生产上的有外部 spark 的情况,推荐用容器内的spark 调试,我在nebula-up 里封装了这个。

pyspark 本身还是把你的 py 代码放到 spark 上执行

参考我这个库的 readme 有运行方式

我重新用您的一件安装命令在服务器拉取了环境,我是应该修改metad/storaged ,etc下面的config文件吗?,把local_ip修改成服务器地址可以吗?
我的是在一台服务器上部署的但是为什么有三个graph/metad/storaged容器 我链接不是服务器的原因是不是因为我是一台服务器部署的呢?