Вопрос или проблема
У меня есть приложение Spark SQL, которое использует JDBC-соединение для подключения к SQL-серверу и чтения таблицы из дата-фрейма. Задача просто выполнялась на локальной машине с использованием Spark Connect.
В данный момент я пытаюсь переместить все в Kubernetes, я установил Kubernetes на локальный диск.
Тем не менее, когда я запускаю сервер Spark Connect на кластере Kubernetes, он не может подключиться к SQL-серверу. Это, вероятно, связано с докеризацией драйвера Spark и исполнителей на Kubernetes.
Запускаю ниже:
root@master-node:~# kubectl cluster-info
Контрольная плоскость Kubernetes работает по адресу https://172.22.0.80:6443
CoreDNS работает по адресу https://172.22.0.80:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Чтобы дополнительно отладить и диагностировать проблемы кластера, используйте 'kubectl cluster-info dump'
Я могу успешно запустить Spark Connect, используя такую команду:
./spark-3.5.1-bin-hadoop3/sbin/start-connect-server.sh --packages org.apache.spark:spark-connect_2.12:3.5.1,com.microsoft.azure:spark-mssql-connector_2.12:1.2.0 --conf spark.ui.port=4041 --driver-memory 8g --master k8s://https://172.22.0.80:6443 --conf spark.kubernetes.container.image=apache/spark-py
Запуск простого приложения на Python для подключения к вышеуказанному серверу не может прочитать данные из SQL-сервера
from pyspark.sql.functions import to_date, col, lit, to_timestamp, substring, regexp_replace, cast
from pyspark.sql import SparkSession
spark = SparkSession.builder.remote("sc://localhost").getOrCreate()
sql_db_ip = "172.22.0.60"
sql_db_port = "53817"
sql_db_user = "reports"
sql_db_password = "****"
...
url = "jdbc:sqlserver://{}:{};databaseName={};integratedSecurity=false;encrypt=false;trustServerCertificate=true;user={};password={};".format(
sql_db_ip, sql_db_port, "test", sql_db_user, sql_db_password)
stg_count = spark.read.format("jdbc") \
.option('dbtable', input_table_name) \
.options(url=url, **properties) \
.load()
stg_count.Count() # не может подключиться к узлу SQL-сервера при запуске на Kubernetes, здесь возникает ошибка
Я буду признателен за любую помощь или подсказку.
Ответ или решение
Для того чтобы подключиться к SQL Server из приложения Spark SQL, работающего в Kubernetes, необходимо учесть несколько моментов, связанных с сетевой конфигурацией и параметрами подключения. В этой статье мы подробно рассмотрим возможные проблемы, а также предложим шаги для их устранения.
1. Проверка сетевого доступа
Первое, что нужно сделать, — убедиться, что контейнеры с Spark могут достучаться до сервера SQL. Это можно проверить несколькими способами:
-
Использование командной строки: Вы можете войти в любой из подов Spark и использовать команды
ping
илиtelnet
для проверки доступности IP-адреса и порта SQL Server.kubectl exec -it <spark-pod-name> -- /bin/sh ping 172.22.0.60 telnet 172.22.0.60 53817
-
Проблемы с маршрутами: Убедитесь, что между подами вашего кластера и SQL Server нет сетевых политик, которые блокировали бы трафик. Если там используются Network Policies, проверьте их конфигурацию.
2. Настройки JDBC
Ваш код для подключения к SQL Server выглядит корректным, однако следует убедиться, что все параметры передаются верно. Ниже приведен пример правильного формата параметров:
properties = {
"user": sql_db_user,
"password": sql_db_password,
"driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver"
}
url = f"jdbc:sqlserver://{sql_db_ip}:{sql_db_port};databaseName=test;encrypt=false;trustServerCertificate=true;"
Убедитесь, что вы правильно указали драйвер и все остальные параметры.
3. Docker-образ Spark
При работе с Spark в Kubernetes важно использовать подходящий образ Docker. Убедитесь, что образ apache/spark-py
, который вы используете, включает необходимые библиотеки для работы с SQL Server. Если библиотека mssql-jdbc
отсутствует, её необходимо добавить в ваш образ.
Это можно сделать с помощью создания Dockerfile:
FROM apache/spark-py:latest
COPY mssql-jdbc.jar /opt/spark/jars/
После этого необходимо заново создать и загрузить образ.
4. Запуск Spark Application
Чтобы убедиться, что ваше приложение запускается корректно, используйте команду spark-submit
, добавив все необходимые параметры:
spark-submit \
--master k8s://https://172.22.0.80:6443 \
--deploy-mode cluster \
--conf spark.executor.instances=2 \
--conf spark.kubernetes.container.image=apache/spark-py \
--conf spark.kubernetes.namespace=default \
--class org.apache.spark.examples.SparkPi \
--conf spark.jars.packages=com.microsoft.azure:spark-mssql-connector_2.12:1.2.0 \
your_application.py
5. Логи и отладка
Если проблема не решается, обратите внимание на логи контейнеров Spark:
kubectl logs <spark-pod-name>
Ищите любые ошибки или предупреждения, которые могут дать подсказку о том, где именно возникает сбой.
Заключение
Перевод вашего приложения Spark SQL в среду Kubernetes требует тщательной настройки сетевых параметров, конфигурации Docker и правильной организации параметров подключения. Следуя представленным шагам, вы сможете устранить большинство распространенных причин сбоя подключения к SQL Server. Убедитесь, что вы также проверяете все настройки безопасности, которые могут блокировать доступ к SQL Server.