Pyspark:java.lang.ClassNotFoundException:找不到数据源:com.microsoft.sqlserver.jdbc.spark(SQL 数据池)

Posted

技术标签:

【中文标题】Pyspark:java.lang.ClassNotFoundException:找不到数据源:com.microsoft.sqlserver.jdbc.spark(SQL 数据池)【英文标题】:Pyspark: java.lang.ClassNotFoundException: Failed to find data source: com.microsoft.sqlserver.jdbc.spark (SQL Data Pool) 【发布时间】:2020-08-24 22:57:28 【问题描述】:

我正在尝试将流数据从 Kafka 加载到 SQL Server 大数据集群数据池中。我正在使用 Spark 2.4.5(Bitnami 2.4.5 火花图像)。

如果我想将数据加载到常规表中,我使用这句话,它很顺利:

logs_df.write.format('jdbc').mode('append').option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver').option \
        ('url', 'jdbc:sqlserver://XXX.XXX.XXX.XXXX:31433;databaseName=sales;').option('user', user).option \
        ('password', password).option('dbtable', 'SYSLOG_TEST_TABLE').save()

但是将数据加载到 SQL 数据池中的同一句话给了我这个错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o93.save.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 4.0 failed 1 times, most recent failure: Lost task 0.0 in stage 4.0 (TID 3, localhost, executor driver): java.sql.BatchUpdateException: External Data Pool Table DML statement cannot be used inside a user transaction.

我发现将数据加载到 SQL 数据池的方式是使用 'com.microsoft.sqlserver.jdbc.spark' 格式,如下所示:

logs_df.write.format('com.microsoft.sqlserver.jdbc.spark').mode('append').option('url', url).option('dbtable', datapool_table).option('user', user).option('password', password).option('dataPoolDataSource',datasource_name).save()

但它给了我这个错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o93.save.
: java.lang.ClassNotFoundException: Failed to find data source: com.microsoft.sqlserver.jdbc.spark. Please find packages at http://spark.apache.org/third-party-projects.html

我正在使用 spark-submit 运行脚本,如下所示:

docker exec spark245_spark_1 /opt/bitnami/spark/bin/spark-submit --driver-class-path /opt/bitnami/spark/jars/mssql-jdbc-8.2.2.jre8.jar --jars /opt/bitnami/spark/jars/mssql-jdbc-8.2.2.jre8.jar --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.5 /storage/scripts/some_script.py

还有其他我应该包含的包或我缺少的一些特殊导入吗?

提前致谢

已编辑:我在 scala 中尝试过,结果相同

【问题讨论】:

【参考方案1】:

您需要先使用 SBT 将存储库构建到 jar 文件中。然后将其包含到您的 Spark 集群中。

我知道会有很多人在构建这个jar文件时遇到麻烦(包括几个小时前的我自己),所以我会一步一步地指导你如何构建这个jar文件:

    去https://www.scala-sbt.org/download.html下载SBT,然后安装。

    转到https://github.com/microsoft/sql-spark-connector 并下载 zip 文件。

    打开刚刚下载的存储库文件夹,在空白处右键单击“在此处打开PowerShell窗口”。 https://i.stack.imgur.com/Fq7NX.png

    在 Shell 窗口中,键入“sbt”,然后按 Enter。它可能需要您下载 Java 开发工具包。如果是这样,请转到https://www.oracle.com/java/technologies/javase-downloads.html 下载并安装它。安装后您可能需要关闭并重新打开 shell 窗口。

如果一切顺利,您可能会看到以下屏幕: https://i.stack.imgur.com/fMxVr.png

    完成上述步骤后,输入“package”。 shell 可能会向您显示类似的内容,并且您可能需要很长时间才能完成这项工作。 https://i.stack.imgur.com/hr2hw.png

    构建完成后,进入“target”文件夹,然后进入“scala-2.11”文件夹获取jar文件。 https://i.stack.imgur.com/Aziqy.png

    获得 jar 文件后,将其包含到 Spark 集群中。

或者,如果您不想执行上述麻烦的程序....

2021 年 5 月 26 日更新:该连接器现已在 Maven 中可用,因此您可以直接前往那里完成剩下的工作。

https://mvnrepository.com/artifact/com.microsoft.azure/spark-mssql-connector

如果您需要更多信息,请发表评论。我会尽力帮忙的。

【讨论】:

我在 Maven 列表中找到了 1.2 版,在 Databricks 中安装良好,并解决了问题。谢谢。【参考方案2】:

根据文档:“要将连接器包含在您的项目中,请下载此存储库并使用 SBT 构建 jar。”

所以你需要使用存储库中的build.sbt 构建连接器JAR 文件,然后将JAR 文件放入spark:your_path\spark\jars

为此,请在此处下载 SBT:https://www.scala-sbt.org/download.html。在保存 build.sbt 的目录中打开 SBT,然后运行 ​​sbt package。应在同一目录下创建target 文件夹,JAR 文件位于target\scala-2.11

【讨论】:

以上是关于Pyspark:java.lang.ClassNotFoundException:找不到数据源:com.microsoft.sqlserver.jdbc.spark(SQL 数据池)的主要内容,如果未能解决你的问题,请参考以下文章

pyspark.sql.functions.col 和 pyspark.sql.functions.lit 之间的 PySpark 区别

Pyspark 安装错误:没有名为“pyspark”的模块

Pyspark:将 sql 查询转换为 pyspark?

Pyspark - ImportError:无法从“pyspark”导入名称“SparkContext”

Pyspark:基于所有列减去/差异 pyspark 数据帧

在 PySpark 的两个不同 pyspark.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe