Аналитика больших данных со Apache Spark SQL из внешних СУБД: про JDBC-драйверы

Автор Категория ,
Аналитика больших данных со Apache Spark SQL из внешних СУБД: про JDBC-драйверы

В этой статье рассмотрим особенности подключения Apache Spark к внешним СУБД как к источникам данных для аналитики Big Data средствами SQL-модуля этого фреймворка. Читайте далее о том, что такое JDBC-драйвер, чем источник данных JDBC отличается от сервера Spark SQL JDBC, при чем здесь RPC-фреймворк и язык описания интерфейсов Thrift, а также как обойтись без него.

JDBC vs ODBC и зачем Spark SQL нужен Thrift-cервер

Apache Spark – отличный инструмент для Big Data вычислений, включая аналитику больших данных с помощью SQL-запросов. Он сам не хранит данные, а считывает их из различных источников, таких как топики Apache Kafka, распределенная файловая система Hadoop HDFS, а также реляционные базы данных и NoSQL-СУБД. Spark SQL также может действовать как механизм распределенных запросов, используя JDBC/ODBC или интерфейс командной строки. В этом режиме конечные пользователи или приложения могут напрямую взаимодействовать с фреймворком для выполнения SQL-запросов без самостоятельной разработки программного кода. Реализация сервера Thrift JDBC ODBC соответствует HiveServer2 во встроенном Apache Hive [1].

Напомним, JDBC (Java DataBase Connectivity) – это кросс-платформенный промышленный стандарт взаимодействия Java-приложений с различными СУБД. Он реализован в виде пакета java.sql в составе Java SE и основан на концепции драйверов, позволяющих получать соединение с СУБД по специально описанному URL. Драйвер может загружаться динамически во время работы программы, затем самостоятельно регистрируется и вызывается автоматически, когда программа требует URL с протоколом, за который он отвечает [2].

Можно сказать, что JDBC является API-интерфейсом для Java, определяющим возможности доступа клиента к СУБД. И, в отличие от ODBC (Open Database Connectivity) подходит только для этого языка программирования, но работает на любой операционной системе: Linux, Windows и пр. А ODBC – стандартная прикладная программная среда для связи и доступа к СУБД, созданная Microsoft и Simba Technologies в 1990 году, поддерживает любые языки программирования, но работает только на Windows как слой перевода между СУБД и приложением [3].

Чтобы получить доступ к Спарк через JDBC, необходимо дополнительно настроить сервер Thrift и Hive Metastore. Apache Thrift – это двоичный протокол связи и язык описания интерфейсов для определения и создания служб под разные языки программирования, а также фреймворк к удалённому вызову процедур (RPC) от Facebook. Эта простая библиотека не зависит от архитектуры, не использует XML-конфигурацию и обеспечивает кросс-языковую сериализацию с низкими накладными расходами по сравнению с SOAP за счет двоичного формата [4]. В Спарк cервер JDBC Thrift поддерживает отправку сообщений RPC через транспорт HTTP, если включен режим HTTP в качестве системного свойства или заданы конфигурации в файле hive-site.xml. Но интерфейс командной строки Spark SQL не может взаимодействовать с сервером Thrift JDBC, хотя CLI удобно использовать для запуска службы хранилища метаданных Hive в локальном режиме и выполнения запросов из командной строки [1].

Таким образом, разработчик Спарк-приложений сталкивается с вопросом, как работать с SQL-запросами в рамках этого фреймворка через JDBC без дополнительной настройки инфраструктуры. Для этого есть несколько альтернатив, о которых мы поговорим далее.

Источники данных и драйвер для таблиц

Spark SQL включает источник данных, который может считывать данные из других СУБД с помощью JDBC. В отличие от JdbcRDD, результаты возвращаются не в RDD, а в виде DataFrame – структуры данных с высоким уровнем абстракции и гибким API. Поэтому их можно обработать в Spark SQL или объединить с другими источниками данных. Источник данных JDBC также проще использовать из Java или Python, т.к. он не требует от пользователя предоставления ClassTag. Однако, это отличается от ранее рассмотренного сервера JDBC на основе Thrift, который позволяет другим приложениям выполнять запросы с использованием Spark SQL.

Чтобы подключиться к внешней СУБД, например, к PostgreSQL из Shell-оболочки фреймворка, следует задать включить драйвер JDBC для конкретной базы данных в путь к классам Spark, выполнив следующую команду:

./bin/spark-shell –driver-class-path postgresql-9.4.1207.jar –jars postgresql-9.4.1207.jar

Таблицы из внешней базы данных могут быть загружены как временное представление DataFrame или Spark SQL с помощью API источников данных. Указать свойства JDBC-соединения можно в конфигурационных параметрах источника данных. Пользователь и пароль обычно необходимы для подключения, обеспечивающего вход в источники данных. Также Спарк позволяет определить еще 19 свойств, от URL-соединения до Kerberos-принципала [5].

Помимо рассмотренного драйвера JDBC, описанного в официальной документации фреймворка, энтузиасты сообщества Спарк-разработчиков предлагают собственные решения. Например, автономный драйвер JDBC, доступный только для чтения, который использует Spark SQL в качестве таблиц базы данных. Таблицы, используемые в Spark SQL, автоматически регистрируются этим драйвером перед запросом. Результаты возвращаются в DataFrame и регистрируются как временное представление, чтобы быть доступными из Spark SQL. Этот JDBC-драйвер позволяет отправлять произвольные SQL-запросы в кластер Спарк или на локальную машину через JDBC со следующими схемами URL-адресов [6]:

# Local mode

jdbc:spark:local?config=<path_to_file>
# Standalone cluster

jdbc:spark://localhost:7077?config=<path_to_file>

Подробный пример использования этого JDBC-драйвера для Spark SQL описан в источнике [6], а его код доступен в Github [7].

В следующей статье мы продолжим разговор про фреймворк Спарк и рассмотрим, каким образом веб-интерфейс Hue облегчает разработку SQL-запросов, а также как это связано с REST API Livy.  

Узнайте больше подробностей про возможности Apache Spark для разработки распределенных приложений аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://spark.apache.org/docs/latest/sql-distributed-sql-engine.html
  2. https://ru.wikipedia.org/wiki/Java_Database_Connectivity
  3. https://ru.wikipedia.org/wiki/ODBC
  4. https://ru.wikipedia.org/wiki/Apache_Thrift
  5. https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html
  6. https://medium.com/@takezoe/jdbc-driver-for-apache-spark-f246e63e296c
  7. https://github.com/takezoe/spark-jdbc