Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

Настройка коннекторов 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.

  1. Подключитесь к мастер-хосту Greengage DB как gpadmin.

  2. Выберите имя JDBC-сервера и создайте каталог $PXF_BASE/servers/<server_name>. Например, для создания конфигурации сервера с именем pg_user1_testdb выполните следующую команду:

    $ mkdir $PXF_BASE/servers/pg_user1_testdb
  3. Скопируйте файл шаблона конфигурации сервера PXF JDBC в каталог конфигурации сервера, например:

    $ cp $PXF_HOME/templates/jdbc-site.xml $PXF_BASE/servers/pg_user1_testdb/
  4. Откройте файл шаблона конфигурации сервера в текстовом редакторе и укажите требуемые для вашего окружения свойства. Например, для конфигурирования доступа к базе данных 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>
  5. Сохраните и закройте файл.

  6. Синхронизируйте конфигурацию сервера 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, например, org.postgresql.Driver

jdbc.url

URL, используемый драйвером JDBC для подключения к базе данных

URL для подключения к базе данных (зависит от базы данных), например jdbc:postgresql://<phost>:<pport>/<pdatabase>

jdbc.user

Имя пользователя базы данных

Имя пользователя для подключения к базе данных

jdbc.password

Пароль пользователя, указанного в jdbc.user

Пароль для подключения к базе данных

ПРИМЕЧАНИЕ

При конфигурировании 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>

Имя свойства (<CPROP_NAME>), передаваемого драйверу JDBC при установлении PXF соединения с внешней базой данных

Значение свойства <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

Количество строк для записи во внешнюю таблицу базы за один батч

Количество строк. Количество строк для записи по умолчанию — 100

jdbc.statement.fetchSize

Количество строк для извлечения/буферизации при чтении из внешней таблицы базы данных

Количество строк. Для баз данных MySQL количество строк по умолчанию — -2147483648. Для остальных баз данных — 1000

jdbc.statement.writeSize

Количество строк для группировки в пакет перед записью во внешнюю таблицу базы данных

Количество строк для группировки в пакет по умолчанию — 100

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

Указывает, использовать ли PreparedStatement вместо Statement при чтении данных из внешнего источника

false

Свойства уровня сессии

Чтобы установить свойства уровня сессии, добавьте свойство jdbc.session.property.<SPROP_NAME> в jdbc-site.xml. PXF устанавливает эти свойства во внешней базе данных перед выполнением запроса.

Замените <SPROP_NAME> именем свойства сессии и укажите его значение.

Свойство Описание Значение

jdbc.session.property.<SPROP_NAME>

Имя свойства (<SPROP_NAME>) для установки перед выполнением запроса

Значение свойства <SPROP_NAME>. Обратите внимание, что коннектор PXF JDBC передает имена и значения свойств уровня сессии внешней базе данных SQL в том виде, в каком они указаны в конфигурационном файле сервера jdbc-site.xml. Чтобы снизить потенциальную угрозу SQL-инъекции, коннектор отклоняет любое имя свойства или значение, содержащее символы ;, \n, \b или \0

Например, чтобы добавить свойство search_path перед выполнением запроса к базе данных PostgreSQL, добавьте следующий блок в jdbc-site.xml:

<property>
    <name>jdbc.session.property.search_path</name>
    <value>public</value>
</property>

Прочие свойства

Коннектор PXF JDBC поддерживает следующие дополнительные свойства.

Свойство Описание Значение по умолчанию

jdbc.date.wideRange

Определяет, включен ли специальный анализ дат для случаев, когда год содержит более четырех буквенно-цифровых символов. При установке значения true PXF использует расширенные классы для анализа дат и распознает годы, указывающие BC или AD

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-сервера:

  1. Подключитесь к мастер-хосту Greengage DB как gpadmin.

  2. Определите конфигурацию JDBC-сервера PXF, которую требуется обновить.

  3. Перейдите в каталог конфигурации сервера. Например, в случае сервера с именем mysqldb:

    $ cd $PXF_BASE/servers/mysqldb
  4. Отройте файл jdbc-site.xml в текстовом редакторе и добавьте либо раскомментируйте свойство имперсонации (pxf.service.user.impersonation), указав для него значение true:

    <property>
        <name>pxf.service.user.impersonation</name>
        <value>true</value>
    </property>
  5. Сохраните и закройте файл jdbc-site.xml.

  6. Синхронизируйте конфигурацию между хостами кластера 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 ...')