Pyspark: java.lang.ClassNotFoundException: не удалось найти источник данных: com.microsoft.sqlserver.jdbc.spark (пул данных SQL)

#pyspark #apache-spark-sql #spark-streaming #mssql-jdbc

#pyspark #apache-spark-sql #потоковая передача данных #mssql-jdbc

Вопрос:

Я пытаюсь загрузить потоковые данные из Kafka в пулы данных кластеров больших данных SQL Server. Я использую Spark 2.4.5 (Bitnami 2.4.5 spark image).

Если я хочу загрузить данные в обычные таблицы, я использую это предложение, и все идет хорошо:

 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:

Сначала вам нужно встроить репозиторий в файл jar с помощью SBT. Затем включите его в свой кластер spark.

Я знаю, что у многих людей возникнут проблемы с созданием этого файла jar (включая меня самого несколько часов назад), поэтому я покажу вам, как создать файл jar, шаг за шагом:

  1. Перейдите к https://www.scala-sbt.org/download.html чтобы загрузить SBT, затем установите его.

  2. Перейдите к https://github.com/microsoft/sql-spark-connector и загрузите zip-файл.

  3. Откройте папку репозитория, который вы только что загрузили, щелкните правой кнопкой мыши на пустом месте и выберите «Открыть PowerShell windows здесь» . https://i.stack.imgur.com/Fq7NX.png

  4. В командной строке windows введите «sbt» и нажмите enter. Возможно, вам потребуется загрузить Java Development Kit. Если да, перейдите к https://www.oracle.com/java/technologies/javase-downloads.html чтобы загрузить и установить его. Возможно, вам потребуется закрыть и снова открыть Windows-оболочку после установки.

Если все пойдет правильно, вы можете увидеть этот экран: https://i.stack.imgur.com/fMxVr.png

  1. После выполнения вышеуказанного шага введите «пакет». Оболочка может показать вам что-то вроде этого, и вам может потребоваться много времени, чтобы завершить работу. https://i.stack.imgur.com/hr2hw.png

  2. После завершения сборки перейдите в папку «target», затем в папку «scala-2.11», чтобы получить файл jar. https://i.stack.imgur.com/Aziqy.png

  3. После того, как вы получили файл jar, включите его в кластер Spark.

ИЛИ, если вы не хотите выполнять описанные выше хлопотные процедуры….

ОБНОВЛЕНИЕ ОТ 26 мая 2021 г.: соединитель теперь доступен в Maven, так что вы можете просто перейти туда и сделать все остальное.

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

Если вам нужна дополнительная информация, просто прокомментируйте. Я сделаю все возможное, чтобы помочь.

Комментарии:

1. Я нашел версию 1.2 в списке Maven, нормально установил в Databricks и решил проблему. Спасибо.

Ответ №2:

Согласно документации: «Чтобы включить соединитель в свои проекты, загрузите этот репозиторий и создайте jar с использованием SBT».

Итак, вам нужно создать файл JAR соединителя, используя build.sbt в репозитории, затем поместить файл JAR в spark: your_pathsparkjars

Для этого загрузите SBT здесь:https://www.scala-sbt.org/download.html . Откройте SBT в каталоге, где вы сохранили, build.sbt затем запустите sbt package . target В том же каталоге должна быть создана папка, в которой находится файл JAR targetscala-2.11