pyspark 与 MariaDB 的连接失败并出现 ClassNotFoundException

Posted

技术标签:

【中文标题】pyspark 与 MariaDB 的连接失败并出现 ClassNotFoundException【英文标题】:pyspark connection to MariaDB fails with ClassNotFoundException 【发布时间】:2021-12-30 08:26:07 【问题描述】:

我正在尝试使用 pyspark 从 MariaDB 检索数据。

我使用配置创建了 spark_session 以包含 jdbc jar 文件,但无法解决问题。当前创建会话的代码如下所示。


path = "hdfs://nameservice1/user/PATH/TO/JDBC/mariadb-java-client-2.7.1.jar"
# or path = "/home/PATH/TO/JDBC/mariadb-java-client-2.7.1.jar"

spark = SparkSession.config("spark.jars", path)\
        .config("spark.driver.extraClassPath", path)\
        .config("spark.executor.extraClassPath", path)\
        .enableHiveSupport()
        .getOrCreate()

请注意,我已经尝试了所有我知道的配置案例 (检查权限,更改 hdfs 或本地目录,添加或删除配置...)

然后,加载数据的代码是。

sql = "SOME_SQL_TO_RETRIEVE_DATA"

spark = spark.read.format('jdbc').option('dbtable', sql)
        .option('url', 'jdbc:mariadb://host:port/db')\
        .option("user", SOME_USER)
        .option("password", SOME_PASSWORD)
        .option("driver", 'org.mariadb.jdbc.Driver')
        .load()

但是 java.lang.ClassNotFoundException: org.mariadb.jdbc.Driver 失败

当我使用spark-submit 尝试此操作时,我看到了日志消息。

... INFO SparkContext: Added Jar /PATH/TO/JDBC/mariadb-java-client-2.7.1.jar at spark://SOME_PATH/jars/mariadb-java-client-2.7.1.jar with timestamp SOME_TIMESTAMP

怎么了?

【问题讨论】:

【参考方案1】:

对于遇到同样问题的人。

我想通了。 Spark Document 这么说

注意: 在客户端模式下,这个配置不能通过 SparkConf 直接在你的应用程序中设置,因为此时驱动程序 JVM 已经启动。相反,请通过 --driver-class-path 命令行选项或在您的默认属性文件中进行设置。

因此,我在spark-submit 上添加了this document 之后的参数,而不是在python 代码上设置配置。

spark-submit other arguments ... \ 
--driver-class-path PATH/TO/JDBC/my-jdbc.jar \
--jars PATH/TO/JDBC/my-jdbc.jar \
MY_PYTHON_SCRIPT.py

【讨论】:

以上是关于pyspark 与 MariaDB 的连接失败并出现 ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

从 PySpark 3.1.2 连接 Oracle DB - Py4JJavaError 失败

使用 PySpark 从 MariaDB 读取查询 [重复]

pymssql:在数据库连接中设置字符集选项会导致连接失败

Pyspark Phoenix 集成在 oozie 工作流程中失败

Pyspark,执行者在执行连接时失去连接

MariaDB 与 Sequelize 的连接