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 - ImportError:无法从“pyspark”导入名称“SparkContext”
Pyspark:基于所有列减去/差异 pyspark 数据帧
在 PySpark 的两个不同 pyspark.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe