Подключение к внешнему узлу SQL Server из Spark SQL, работающего на Kubernetes

Вопрос или проблема

У меня есть приложение 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.

Оцените материал
Добавить комментарий

Капча загружается...