Настройка коннекторов PXF JDBC
С помощью коннектора PXF JDBC можно получить доступ к внешней базе данных SQL, например MySQL, Oracle, Microsoft SQL Server, DB2, PostgreSQL, Apache Hive или Apache Ignite. Для доступа ко внешней базе данных SQL с помощью коннектора PXF JDBC необходимо указать имя класса драйвера JDBC, URL базы данных и учетные данные клиента.
Если вы хотите использовать кастомный драйвер JDBC, установите JAR-файл драйвера для внешней базы данных SQL в каталог $PXF_BASE/lib на каждом хосте Greengage DB. JAR-файлы драйверов JDBC должны быть совместимы с вашей версией JRE.
В документации Greengage DB приведены практические примеры конфигурирования и использования коннектора PXF JDBC:
Конфигурирование JDBC-сервера
Для настройки коннектора PXF JDBC необходимо добавить хотя бы одну именованную конфигурацию сервера PXF для этого коннектора, как описано в статье Настройка PXF-сервера. Вы также можете настроить один или несколько статически определенных запросов для выполнения в удаленной базе данных SQL, как описано в Именованные запросы JDBC.
-
Подключитесь к мастер-хосту Greengage DB как
gpadmin. -
Выберите имя JDBC-сервера и создайте каталог $PXF_BASE/servers/<server_name>. Например, для создания конфигурации сервера с именем
pg_user1_testdbвыполните следующую команду:$ mkdir $PXF_BASE/servers/pg_user1_testdb -
Скопируйте файл шаблона конфигурации сервера PXF JDBC в каталог конфигурации сервера, например:
$ cp $PXF_HOME/templates/jdbc-site.xml $PXF_BASE/servers/pg_user1_testdb/ -
Откройте файл шаблона конфигурации сервера в текстовом редакторе и укажите требуемые для вашего окружения свойства. Например, для конфигурирования доступа к базе данных PostgreSQL
testdb, запущенной на сервере PostgreSQL на хостеpgserverhostдля пользователяuser1, укажите следующие свойства:<?xml version="1.0" encoding="UTF-8"?> <configuration> <property> <name>jdbc.driver</name> <value>org.postgresql.Driver</value> </property> <property> <name>jdbc.url</name> <value>jdbc:postgresql://pgserverhost:5432/testdb</value> </property> <property> <name>jdbc.user</name> <value>user1</value> </property> <property> <name>jdbc.password</name> <value>changeme</value> </property> </configuration> -
Сохраните и закройте файл.
-
Синхронизируйте конфигурацию сервера PXF JDBC между хостами кластера Greengage DB:
$ pxf cluster sync
Конфигурационный файл JDBC-сервера
PXF предоставляет шаблон конфигурационного файла для коннектора JDBC. Шаблон находится в каталоге $PXF_HOME/templates/jdbc-site.xml и определяет свойства, которые можно настроить для установления соединения с внешней базой данных SQL. Шаблон также включает необязательные свойства, которые можно указать до выполнения запроса или вставки при подключении к внешней базе данных.
Конфигурацию сервера JDBC можно переопределить с помощью пользовательских параметров в выражении LOCATION команды CREATE EXTERNAL TABLE.
Следующие свойства в шаблоне файла jdbc-site.xml являются обязательными.
| Свойство | Описание | Значение |
|---|---|---|
jdbc.driver |
Имя класса драйвера JDBC |
Имя Java-класса драйвера JDBC, например, |
jdbc.url |
URL, используемый драйвером JDBC для подключения к базе данных |
URL для подключения к базе данных (зависит от базы данных), например |
jdbc.user |
Имя пользователя базы данных |
Имя пользователя для подключения к базе данных |
jdbc.password |
Пароль пользователя, указанного в |
Пароль для подключения к базе данных |
При конфигурировании PXF JDBC-сервера учетные данные пользователя указываются в конфигурационном файле в незашифрованном виде.
В качестве альтернативы вы можете использовать команду pxf encrypt для шифрования пароля, указав полученную зашифрованную строку в качестве значения jdbc.password, например:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
...
<property>
<name>jdbc.password</name>
<value>aes256:7BhhI+10ut+sdf34kj5D/a98d754a8add7cf8ba40540752a0c3af227c6023</value>
</property>
</configuration>
Указанный пароль будет автоматически расшифрован при подключении к JDBC-серверу.
Свойства уровня соединения
Чтобы установить дополнительные свойства уровня соединения JDBC, добавьте свойства jdbc.connection.property.<CPROP_NAME> в jdbc-site.xml.
PXF передает эти свойства драйверу JDBC при установлении соединения с внешней базой данных SQL.
Замените <CPROP_NAME> именем свойства соединения и укажите его значение.
Убедитесь, что драйвер JDBC для внешней базы данных SQL поддерживает каждое указанное свойство уровня соединения.
| Свойство | Описание | Значение |
|---|---|---|
jdbc.connection.property.<CPROP_NAME> |
Имя свойства ( |
Значение свойства |
Например, чтобы установить свойство подключения createDatabaseIfNotExist для соединения JDBC с базой данных PostgreSQL, добавьте следующий блок в jdbc-site.xml:
<property>
<name>jdbc.connection.property.createDatabaseIfNotExist</name>
<value>true</value>
</property>
Свойство изоляции транзакции соединения
Стандарт SQL определяет четыре уровня изоляции транзакций. Уровень, указанный для конкретного подключения к внешней базе данных SQL, определяет, как и когда изменения, сделанные одной транзакцией в этом подключении, становятся видимыми для другой.
Коннектор PXF JDBC предоставляет необязательный параметр конфигурации сервера с именем jdbc.connection.transactionIsolation, который позволяет указать уровень изоляции транзакций.
PXF устанавливает уровень изоляции сразу после подключения к внешней базе данных SQL.
Различные базы данных SQL поддерживают разные уровни изоляции транзакций.
Убедитесь, что внешняя база данных поддерживает указанный в настройках уровень изоляции.
Коннектор JDBC поддерживает следующие значения свойства jdbc.connection.transactionIsolation.
| Уровень SQL | Значение свойства PXF |
|---|---|
READ UNCOMMITTED |
READ_UNCOMMITTED |
READ COMMITTED |
READ_COMMITTED |
REPEATABLE READ |
REPEATABLE_READ |
SERIALIZABLE |
SERIALIZABLE |
Например, чтобы установить уровень изоляции READ UNCOMMITTED, добавьте следующий блок в jdbc-site.xml:
<property>
<name>jdbc.connection.transactionIsolation</name>
<value>READ_UNCOMMITTED</value>
</property>
Свойства уровня выражения
Коннектор PXF JDBC выполняет запрос или команду INSERT над таблицей внешней базы данных SQL в рамках выражения.
Коннектор предоставляет свойства, которые позволяют настроить определенные аспекты выражения до выполнения команды во внешней базе данных.
Убедитесь, что JDBC-драйвер внешней базы данных поддерживает каждое указанное в настройках свойство уровня выражения.
Для всех свойств выражения, не сконфигурированных явно, применяются значения по умолчанию.
Коннектор поддерживает следующие свойства уровня выражения.
| Свойство | Описание | Значение |
|---|---|---|
jdbc.statement.batchSize |
Количество строк для записи во внешнюю таблицу базы за один батч |
Количество строк.
Количество строк для записи по умолчанию — |
jdbc.statement.fetchSize |
Количество строк для извлечения/буферизации при чтении из внешней таблицы базы данных |
Количество строк.
Для баз данных MySQL количество строк по умолчанию — |
jdbc.statement.writeSize |
Количество строк для группировки в пакет перед записью во внешнюю таблицу базы данных |
Количество строк для группировки в пакет по умолчанию — |
jdbc.statement.queryTimeout |
Время ожидания (в секундах), в течение которого драйвер JDBC ждет выполнения запроса. Это время применяется как к запросам для операций чтения, так и для операций записи |
Время ожидания в секундах. По умолчанию время ожидания не ограничено |
Например, чтобы установить количество строк для извлечения при чтении из базы данных равным 5000, добавьте следующий блок в jdbc-site.xml:
<property>
<name>jdbc.statement.fetchSize</name>
<value>5000</value>
</property>
Подготовленные выражения
По умолчанию коннектор PXF JDBC считывает данные из внешнего источника данных, используя Statement JDBC.
Свойство PXF jdbc.read.prepared-statement определяет, должен ли коннектор использовать подготовленные выражения (PreparedStatement).
Если используемый драйвер JDBC требует использования PreparedStatement, присвойте свойству значение true.
| Свойство | Описание | Значение по умолчанию |
|---|---|---|
jdbc.read.prepared-statement |
Указывает, использовать ли |
false |
Свойства уровня сессии
Чтобы установить свойства уровня сессии, добавьте свойство jdbc.session.property.<SPROP_NAME> в jdbc-site.xml.
PXF устанавливает эти свойства во внешней базе данных перед выполнением запроса.
Замените <SPROP_NAME> именем свойства сессии и укажите его значение.
| Свойство | Описание | Значение |
|---|---|---|
jdbc.session.property.<SPROP_NAME> |
Имя свойства ( |
Значение свойства |
Например, чтобы добавить свойство search_path перед выполнением запроса к базе данных PostgreSQL, добавьте следующий блок в jdbc-site.xml:
<property>
<name>jdbc.session.property.search_path</name>
<value>public</value>
</property>
Прочие свойства
Коннектор PXF JDBC поддерживает следующие дополнительные свойства.
| Свойство | Описание | Значение по умолчанию |
|---|---|---|
jdbc.date.wideRange |
Определяет, включен ли специальный анализ дат для случаев, когда год содержит более четырех буквенно-цифровых символов.
При установке значения |
false |
Пул подключений JDBC
Коннектор PXF JDBC использует пул подключений JDBC, реализованный с помощью HikariCP.
При запросе или записи данных во внешнюю таблицу коннектор создает пул подключений для связанной конфигурации сервера при первом возникновении уникальной комбинации настроек jdbc.url, jdbc.user, jdbc.password, свойств подключения и свойств пула.
Коннектор повторно использует подключения в пуле с учетом определенных настроек соединения и тайм-аута.
Для данной конфигурации сервера может существовать один или несколько пулов подключений, и доступ пользователей к различным внешним таблицам, указывающим на одну и ту же конфигурацию сервера, может совместно использовать пул подключений.
Если в конфигурации JDBC-сервера включена имперсонация пользователя, JDBC-коннектор создает отдельный пул для каждого пользователя Greengage DB, обращающегося к любой внешней таблице с помощью этой конфигурации сервера.
Пул подключений для конфигурации JDBC-сервера управляется свойством jdbc.pool.enabled.
По умолчанию пул подключений активирован.
Чтобы деактивировать его, присвойте свойству значение false:
<property>
<name>jdbc.pool.enabled</name>
<value>false</value>
</property>
Если пул подключений для конфигурации сервера деактивирован, соединения JDBC для этого сервера не переиспользуются. PXF создает подключение к удаленной базе данных для каждого раздела запроса и закрывает соединение после завершения запроса этого раздела.
PXF предоставляет свойства пула подключений, которые можно настроить в конфигурации сервера JDBC.
Эти свойства имеют префикс jdbc.pool.property и применяются к каждой JVM PXF.
Коннектор JDBC автоматически устанавливает следующие свойства пула подключений и значения по умолчанию.
| Свойство | Описание | Значение по умолчанию |
|---|---|---|
jdbc.pool.property.maximumPoolSize |
Максимальное количество подключений к бэкенду базы данных |
15 |
jdbc.pool.property.connectionTimeout |
Максимальное время ожидания подключения из пула, в миллисекундах |
30000 |
jdbc.pool.property.idleTimeout |
Максимальное время в миллисекундах, после которого неактивное соединение считается простаивающим |
30000 |
jdbc.pool.property.minimumIdle |
Минимальное количество поддерживаемых простаивающих подключений в пуле |
0 |
Вы можете установить другие свойства пула подключений конфигурации сервера, специфичные для HikariCP, указав свойство jdbc.pool.property.<HIKARICP_PROP_NAME> и желаемое значение в файле jdbc-site.xml.
Обратите внимание, что при запросе соединения у JDBC DriverManager коннектор JDBC передает любое свойство, указанное с префиксом jdbc.connection.property.
Настройка максимального размера пула подключений
Чтобы не превысить максимальное количество подключений, разрешенное целевой базой данных, и в то же время обеспечить равномерный обмен JDBC-соединениями между JVM PXF, определите максимальное значение maximumPoolSize на основе размера кластера Greengage DB следующим образом:
максимальное количество подключений к удаленной БД / количество сегмент-хостов
Например, если в кластере Greengage DB 16 сегмент-хостов, а целевая база данных позволяет 160 одновременных подключений, maximumPoolSize рассчитывается следующим образом:
160 / 16 = 10
На практике для maximumPoolSize можно установить более низкое значение, поскольку количество одновременных подключений на запрос JDBC зависит от количества просканированных запросом разделов.
Если запрос не сканирует ни одного раздела, запрос обслуживается одной JVM PXF.
Если запрос сканирует 12 разделов, PXF устанавливает 12 одновременных JDBC-подключений к удаленной базе данных.
В идеале эти соединения равномерно распределяются между JVM PXF, но это не гарантируется.
Имперсонация пользователя JDBC
Для определения учетной записи пользователя, подключающегося к внешнему хранилищу данных, коннектор PXF JDBC использует настройку jdbc.user или информацию из jdbc.url.
Когда имперсонация пользователя PXF JDBC отключена (по умолчанию), поведение коннектора JDBC зависит от внешнего хранилища данных.
Например, при использовании коннектора JDBC для доступа к Hive учитываются настройки определенных свойств аутентификации и эмуляции Hive для определения пользователя.
При этом может потребоваться настроить свойство jdbc.user или добавить свойства в jdbc.url в файле jdbc-site.xml.
При активации имперсонации пользователя PXF JDBC коннектор PXF JDBC получает доступ к внешнему хранилищу данных от имени конечного пользователя Greengage DB, который обращается к внешней таблице PXF.
PXF переопределяет именем пользователя Greengage DB значение свойства jdbc.user, указанного в jdbc-site.xml или <greengage_db_user_name>-user.xml, либо в DDL-команде внешней таблицы.
Для того чтобы имперсонация пользователей работала при аутентификации подключаемых пользователей во внешнем хранилище данных с помощью пароля, необходимо указывать настройку jdbc.password для каждого имперсонируемого пользователя в файле переопределения свойств пользователя <greengage_db_user_name>-user.xml.
Подробнее о конфигурации пользователя на сервере см. Настройка пользователя PXF.
Имперсонация пользователей PXF JDBC управляется свойством pxf.service.user.impersonation в конфигурационном файле jdbc-site.xml.
Чтобы включить или отключить имперсонацию в конфигурации JDBC-сервера:
-
Подключитесь к мастер-хосту Greengage DB как
gpadmin. -
Определите конфигурацию JDBC-сервера PXF, которую требуется обновить.
-
Перейдите в каталог конфигурации сервера. Например, в случае сервера с именем
mysqldb:$ cd $PXF_BASE/servers/mysqldb -
Отройте файл jdbc-site.xml в текстовом редакторе и добавьте либо раскомментируйте свойство имперсонации (
pxf.service.user.impersonation), указав для него значениеtrue:<property> <name>pxf.service.user.impersonation</name> <value>true</value> </property> -
Сохраните и закройте файл jdbc-site.xml.
-
Синхронизируйте конфигурацию между хостами кластера Greengage DB:
$ pxf cluster sync
Авторизация сессии
Некоторые базы данных SQL, например PostgreSQL или DB2, позволяют привилегированному пользователю изменить текущего пользователя базы данных, который выполняет команды во время сессии. Эту функцию можно использовать, например, если вы подключаетесь к удаленной базе данных в качестве прокси-пользователя и хотите переключить авторизацию сессии после подключения.
В поддерживаемых базах данных вы можете настроить свойство сессии для переключения текущего пользователя.
Например, в DB2 для переключения текущего пользователя используется команда SET SESSION_USER <username>.
Если переменная session_user DB2 указана с помощью свойства уровня сессии PXF (jdbc.session.property.<SPROP_NAME>) в файле jdbc-site.xml, PXF выполнит эту команду за вас.
Например, чтобы сменить текущего пользователя DB2 на пользователя с именем bill, измените файл jdbc-site.xml следующим образом:
<property>
<name>jdbc.session.property.session_user</name>
<value>bill</value>
</property>
После подключения к базе данных PXF неявно выполняет следующую команду для присвоения переменной сессии DB2 session_user сконфигурированного значения (bill):
SET SESSION_USER = bill
PXF поддерживает синтетическое значение свойства, ${pxf.session.user}, которое обозначает имя пользователя Greengage DB.
Это значение можно использовать при настройке свойства, требующего значения, которое меняется в зависимости от пользователя Greengage DB, выполняющего сессию.
Вы можете использовать ${pxf.session.user}, если аутентификация в удаленной базе данных SQL осуществляется с помощью Kerberos, основной компонент Kerberos principal идентифицирует имя пользователя Greengage DB и вы хотите выполнять запросы в удаленной базе данных, используя это имя пользователя.
Например, если вы получаете доступ к DB2, в файле jdbc-site.xml укажите значения securityMechanism и KerberosServerPrincipal Kerberos, а затем установите переменную session_user следующим образом:
<property>
<name>jdbc.session.property.session_user</name>
<value>${pxf.session.user}</value>
</property>
В такой конфигурации PXF устанавливает в качестве значения переменной session_user DB2 имя текущего пользователя Greengage DB, и все последующие операции над таблицей DB2 осуществляются от имени этого пользователя.
Авторизация сессии для пула подключений
Когда PXF выполняет авторизацию сессии от вашего имени, а пул JDBC включен (по умолчанию), вы можете установить свойство jdbc.pool.qualifier.
Это свойство предписывает PXF включать значение свойства в критерии, используемые для создания и повторного использования пулов подключений.
На практике этому свойству присваивается не фиксированное значение, а значение, которое меняется в зависимости от пользователя/сессии/транзакции и т.д.
При установке значения ${pxf.session.user} PXF включает имя пользователя Greengage DB в критерии, используемые для создания и повторного использования пулов подключений.
По умолчанию квалификатор не установлен.
Чтобы использовать эту функцию, добавьте или раскомментируйте следующий блок свойств в jdbc-site.xml, чтобы запросить у PXF включение имени пользователя Greengage DB в критерии создания/повторного использования пула подключений:
<property>
<name>jdbc.pool.qualifier</name>
<value>${pxf.session.user}</value>
</property>
Механизм распределения фрагментов
Для обработки распределения фрагментов между сегментами при чтении партиционированной таблицы в PXF JDBC вы можете использовать несколько политик, которые указываются как пользовательская опция FRAGMENT_DISTRIBUTION_POLICY в выражении LOCATION команды CREATE EXTERNAL TABLE, например:
LOCATION (
'pxf://orders?PROFILE=Jdbc&Server=pg&FRAGMENT_DISTRIBUTION_POLICY=ACTIVE-SEGMENT&ACTIVE_SEGMENT_COUNT=2'
)
Доступны следующие политики:
-
ROUND-ROBIN— (по умолчанию) фрагменты последовательно назначаются сегментам Greengage DB в циклическом (round-robin) порядке. -
ACTIVE-SEGMENT— фрагменты назначаются числу сегментов, указанному с помощью опцииACTIVE_SEGMENT_COUNT, ограничивая таким образом параллелизм. -
IMPROVED-ROUND-ROBIN— политика работает по следующему принципу:-
Если количество фрагментов меньше количества сегментов, фрагменты равномерно распределяются между сегментами.
-
Если количество фрагментов в N раз превышает общее число сегментов, все фрагменты распределяются между всеми сегментами N раз.
-
Если количество фрагментов превышает общее число сегментов, фрагменты распределяются между сегментами N раз (где N — отношение числа фрагментов к числу сегментов), а оставшиеся фрагменты равномерно распределяются между сегментами.
-
-
RANDOM— фрагменты распределяются между сегментами случайным образом.
Именованные запросы JDBC
Именованный запрос PXF — это статический запрос, настраиваемый пользователем, который PXF выполняет в удаленной базе данных SQL.
Именованный запрос PXF JDBC определяется в текстовом файле.
Затем вы можете сослаться на этот запрос в определении внешней таблицы Greengage DB.
PXF выполняет запрос при каждом вызове команды SELECT для внешней таблицы Greengage DB.
Чтобы создать именованный запрос, добавьте выражение запроса в текстовый файл со следующим форматом имени: <query_name>.sql. Вы можете определить один или несколько именованных запросов для конфигурации сервера JDBC, при этом каждый запрос должен находиться в отдельном текстовом файле.
Текстовый файл с запросом должен располагаться в каталоге той конфигурации сервера JDBC, к которой будет осуществляться доступ. Для того чтобы сделать запрос доступным для более чем одной конфигурации сервера JDBC, скопируйте соответствующий текстовый файл в каталог конфигурации для каждого сервера JDBC.
В текстовом файле запроса должен содержаться один запрос, который планируется выполнять в удаленной базе данных SQL.
Запрос должен быть составлен в соответствии с синтаксисом, поддерживаемым базой данных.
Например, если в базе данных MySQL есть таблица customers и таблица orders, вы можете включить следующее SQL-выражение в текстовый файл запроса:
SELECT c.name, c.city, sum(o.amount) AS total, o.month
FROM customers c JOIN orders o ON c.id = o.customer_id
WHERE c.state = 'CO'
GROUP BY c.name, c.city, o.month
Опционально в конце SQL-запроса можно добавить завершающую точку с запятой (;).
Чтобы сослаться на именованный запрос, укажите имя файла запроса без расширения.
Например, если запрос определен в файле с именем report.sql, то имя этого запроса — report.
При создании внешней таблицы вместо имени удаленной таблицы в базе данных SQL указывается имя запроса: query:<query_name>.
Например, если запрос определен в файле $PXF_BASE/servers/mydb/report.sql, выражение LOCATION команды CREATE EXTERNAL TABLE будет выглядеть следующим образом:
LOCATION ('pxf://query:report?PROFILE=jdbc&SERVER=mydb ...')