微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pyspark:java.lang.ClassNotFoundException:无法找到数据源:com.microsoft.sqlserver.jdbc.sparkSQL数据池

如何解决Pyspark:java.lang.ClassNotFoundException:无法找到数据源:com.microsoft.sqlserver.jdbc.sparkSQL数据池

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

如果我想将数据加载到常规表中,则使用此语句,它运行得很好:

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中尝试了相同的结果

解决方法

根据文档:“要将连接器包含在您的项目中,请下载此存储库并使用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

,

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

我知道会有很多人在构建此jar文件时遇到麻烦(包括几个小时前的我自己),所以我将指导您逐步构建jar文件:

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

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

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

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

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

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

  2. 构建完成后,转到“目标”文件夹,然后转到“ scala-2.11”文件夹以获取jar文件。 https://i.stack.imgur.com/Aziqy.png

  3. 获取jar文件后,将其包括在Spark集群中。

或者,如果您不想执行上述麻烦的步骤,并且对其他人怀有强烈的信念,则可以在这里下载我已经构建的jar文件。 https://github.com/psyblade12/Psyblade-List/blob/master/spark-mssql-connector_2.11-1.0.0.jar

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。