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

Pyspark:java.lang.ClassNotFoundException:未能找到数据源:com.microsoft.sqlserver.jdbc.spark(SQL数据池),pyspark,apache-spark-sql,spark-streaming,mssql-jdbc,Pyspark,Apache Spark Sql,Spark Streaming,Mssql Jdbc,我正在尝试将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', 'jdb

我正在尝试将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.
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
我发现将数据加载到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.
: 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.
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\u path\spark\jars


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

您需要首先使用SBT将存储库构建到JAR文件中。然后将其包含到您的spark cluster中

我知道会有很多人在构建这个jar文件时遇到困难(包括几个小时前的我),因此我将逐步指导您如何构建jar文件:

  • 转到下载SBT,然后安装它

  • 转到并下载zip文件

  • > p>打开刚刚下载的存储库文件夹,右键单击空白区域,然后单击“打开PopeStk Windows”。

  • 在Shell窗口中,键入“sbt”,然后按enter键。它可能需要您下载Java开发工具包。如果是,请转到下载并安装。安装后,您可能需要关闭并重新打开外壳窗口

  • 如果一切顺利,您可能会看到以下屏幕:

  • 完成上述步骤后,键入“package”。 shell可能会向您显示类似的内容,并且您可能需要很长时间才能完成这项工作。

  • 构建完成后,转到“target”文件夹,然后转到“scala-2.11”文件夹以获取jar文件。

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

  • 或者,如果您不想执行上述麻烦的步骤

    2021年5月26日更新:该连接器现在在Maven中可用,因此您可以直接去那里完成其余的工作

    如果您需要更多信息,只需评论即可。我会尽力帮忙的