#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, шаг за шагом:
-
Перейдите к https://www.scala-sbt.org/download.html чтобы загрузить SBT, затем установите его.
-
Перейдите к https://github.com/microsoft/sql-spark-connector и загрузите zip-файл.
-
Откройте папку репозитория, который вы только что загрузили, щелкните правой кнопкой мыши на пустом месте и выберите «Открыть PowerShell windows здесь» . https://i.stack.imgur.com/Fq7NX.png
-
В командной строке windows введите «sbt» и нажмите enter. Возможно, вам потребуется загрузить Java Development Kit. Если да, перейдите к https://www.oracle.com/java/technologies/javase-downloads.html чтобы загрузить и установить его. Возможно, вам потребуется закрыть и снова открыть Windows-оболочку после установки.
Если все пойдет правильно, вы можете увидеть этот экран: https://i.stack.imgur.com/fMxVr.png
-
После выполнения вышеуказанного шага введите «пакет». Оболочка может показать вам что-то вроде этого, и вам может потребоваться много времени, чтобы завершить работу. https://i.stack.imgur.com/hr2hw.png
-
После завершения сборки перейдите в папку «target», затем в папку «scala-2.11», чтобы получить файл jar. https://i.stack.imgur.com/Aziqy.png
-
После того, как вы получили файл 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