Apache Phoenix

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 22:40, 12 марта 2018.
Apache Phoenix
Phoenix-bird-trans.png
Разработчики: Apache Software Foundation
Постоянный выпуск: 4.11.0
Состояние разработки: Active
Написана на: Java
Операционная система: Cross-platform
Тип ПО: SQL database
Лицензия: Apache License 2.0
Веб-сайт phoenix.apache.org

Apache Phoenix - это механизм параллельной реляционной базы данных с открытым исходным кодом, поддерживающий OLTP для Hadoop с использованием Apache HBase в качестве резервного хранилища. Phoenix предоставляет драйвер JDBC, который скрывает тонкости хранилища noSQL, позволяя пользователям создавать, удалять и изменять SQL-таблицы, представления, индексы и последовательности; вставлять и удалять строки отдельно и навалом; и данные запроса через SQL. Phoenix компилирует запросы и другие инструкции в собственные API-интерфейсы noSQL, а не использует MapReduce, позволяя создавать приложения с низкой задержкой поверх хранилищ noSQL

История

Phoenix первоначально был внутренним проектом компании salesforce.com из-за необходимости поддержания более высокого уровня языка SQL. Сначала он был открыт на GitHub и стал высокоуровневым проектом Apache 22 мая 2014 года. Apache Phoenix включен в дистрибутив Hortonworks для HDP 2.1 и выше, доступен как часть лабораторий Cloudera и является частью экосистемы Hadoop.

Миссия

Стать надежной платформой данных для OLTP и оперативной аналитики для Hadoop с помощью четко определенных стандартных API-интерфейсов.

Поддержка SQL

Apache Phoenix выполняет ваш SQL-запрос, компилирует его в серию сканирования HBase и организует запуск этих сканирований для создания регулярных наборов результатов JDBC. Прямое использование API HBase, а также сопроцессоров и пользовательских фильтров приводит к производительности порядка миллисекунд для небольших запросов или секунд для десятков миллионов строк.

Рис.1 Архитектура Apache Phoenix

Поддерживаются все стандартные конструкторы SQL-запросов, включая SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY и т. Д. Он также поддерживает полный набор команд DML, а также создание таблиц и внесение изменений в версию с помощью наших команд DDL.

В настоящее время не поддерживается:

  • Реляционные операторы. Пересечение, Минус.
  • Различные встроенные функции. Их легко добавить - прочитайте этот блог для пошаговых инструкций.

Соединение

JDBC используется для соединения с кластером HBase следующим образом:

Connection conn = DriverManager.getConnection("jdbc:phoenix:server1,server2:3333",props);

где реквизиты являются необязательными свойствами, которые могут включать свойства конфигурации Phoenix и HBase, а строка соединения состоит из:

jdbc:phoenix [ :<zookeeper quorum> [ :<port number> [ :<root node> [ :<principal> [ :<keytab file> ] ] ] ] ] 

Для любых пропущенных частей соответствующее значение свойства hbase.zookeeper.quorum, hbase.zookeeper.property.clientPort и zookeeper.znode.parent будет использоваться из файла конфигурации hbase-site.xml. Дополнительный файл main и keytab может использоваться для подключения к защищенному кластером Kerberos. Если указан только основной, то это имя пользователя, с каждым отдельным пользователем, имеющим собственное выделенное соединение HBase (HConnection). Это обеспечивает возможность наличия нескольких разных соединений с разными конфигурационными свойствами на одной и той же JVM.

Например, следующая строка подключения может использоваться для более длинных запросов, где longRunningProps задает свойства конфигурации Phoenix и HBase с более длительными таймаутами:

Connection conn = DriverManager.getConnection(“jdbc:phoenix:my_server:longRunning”, longRunningProps);

в то время как следующая строка подключения может использоваться для более коротких запросов:

Connection conn = DriverManager.getConnection("jdbc:phoenix:my_server:shortRunning", shortRunningProps);

Транзакции

Чтобы включить полную транзакцию ACID, бета-функцию, доступную в версии 4.7.0, необходимо установить для свойства phoenix.transactions.enabled значение true. В этом случае также понадобится запустить диспетчер транзакций, включенный в дистрибутив. После включения таблица может быть объявлена ​​как транзакционная. Заблокированные транзакционные таблицы будет иметь поведение «все или ничего» - либо все данные будут зафиксированы (включая любые обновления для вторичных индексов), либо ни один из них не будет (и будет выбрано исключение). Поддерживаются как кросс-таблицы, так и транзакции с несколькими строками. Кроме того, транзакционные таблицы будут видеть свои собственные незафиксированные данные при запросе. Оптимистичная модель параллелизма используется для обнаружения конфликтов на уровне строк с семантикой first commit wins. Более поздняя фиксация создаст исключение, указывающее, что конфликт был обнаружен. Транзакция запускается неявно, когда на транзакционную таблицу ссылаются в инструкции, после чего будет не видно обновлений из других соединений, пока не произойдет фиксация или откат.

Не транзакционные таблицы не имеют гарантий выше и выше гарантии HBase атомарности уровня строки. Кроме того, не транзакционные таблицы не будут видеть их обновления до тех пор, пока не произойдет фиксация. Команды DML Apache Phoenix, UPSERT VALUES, UPSERT SELECT и DELETE будут ожидать изменения в таблице HBase на стороне клиента. Изменения отправляются на сервер при совершении транзакции и отбрасываются при откате транзакции. Если для подключения включена автоматическая фиксация, Phoenix по возможности выполнит всю команду DML через сопроцессор на стороне сервера, поэтому производительность улучшится.

Метки времени

Чаще всего приложение позволяет HBase управлять метками времени. Однако в некоторых случаях приложение должно управлять самими метками времени. В этом случае свойство CurrentSCN может указываться во время соединения для управления отметками времени для любого DDL, DML или запроса. Эта возможность может использоваться для запуска запросов моментальных снимков к предыдущим значениям строк, поскольку Phoenix использует значение этого свойства соединения как максимальную временную метку сканирования.

Временные метки не могут контролироваться для транзакционных таблиц. Вместо этого диспетчер транзакций назначает временные метки, которые становятся метками ячейки ячейки HBase после фиксации. Временные метки по-прежнему соответствуют времени настенных часов, однако они умножаются на 1 000 000, чтобы обеспечить достаточную детализацию для уникальности по всему кластеру.

Схема

Apache Phoenix поддерживает создание таблиц и внесение изменений в версии с помощью DDL-команд. Метаданные таблицы хранятся в таблице HBase и версируются, так что запросы моментальных снимков по сравнению с предыдущими версиями будут автоматически использовать правильную схему.

Таблица Phoenix создается командой CREATE TABLE и может быть:

  1. Построенной с нуля, и в этом случае семейства таблиц и столбцов HBase будут созданы автоматически.
  2. Сопоставлены с существующей таблицей HBase, создавая либо ТАБЛИЦУ read-write, либо VIEW для чтения, с предостережением о том, что двоичное представление ключа строки и значений ключа должно совпадать с двоичным представлением типов данных Phoenix (см. подробно о двоичном представлении).
    • Для таблицы чтения и записи семейства столбцов будут созданы автоматически, если они еще не существуют. Пустое значение ключа будет добавлено в первое семейство столбцов каждой существующей строки, чтобы минимизировать размер проекции для запросов.
    • Для просмотра только для чтения все семейства столбцов должны уже существовать. Единственное изменение, внесенное в таблицу HBase, будет добавлением сопроцессоров Phoenix, используемых для обработки запросов. Основным вариантом использования VIEW является перенос существующих данных в таблицу Phoenix, так как изменение данных не допускается при просмотре VIEW и производительности запросов, скорее всего, будет меньше, чем при использовании TABLE.

Все схемы версий (с сохранением до 1000 версий). Запросы моментальных снимков по более старым данным собирают и используют правильную схему в зависимости от времени, в которое вы подключились (на основе свойства CurrentSCN).

Изменения

Таблица Phoenix может быть изменена с помощью команды ALTER TABLE. Когда запускается оператор SQL, который ссылается на таблицу, Phoenix по умолчанию проверяет с сервером, чтобы он имел самые современные метаданные таблицы и статистику. Этот RPC может не понадобиться, если вы заранее знаете, что структура таблицы никогда не изменится. Свойство UPDATE_CACHE_FREQUENCY было добавлено в Phoenix 4.7, чтобы пользователь мог объявить, как часто сервер будет проверяться на обновления метаданных (например, добавление или удаление столбца таблицы или обновления статистики таблицы). Возможные значения: ВСЕГДА (по умолчанию), НИКОГДА и миллисекунды числовые значения. Значение ALWAYS приведет к тому, что клиент будет проверять с сервером каждый раз, когда выполняется оператор, который ссылается на таблицу (или один раз на фиксацию для оператора UPSERT VALUES). Значение миллисекунды указывает, как долго клиент будет удерживать кешированную версию метаданных, прежде чем проверять сервер на наличие обновлений.

Например, следующая команда DDL создала бы таблицу FOO и объявила, что клиент должен проверять обновления для таблицы или ее статистики каждые 15 минут:

CREATE TABLE FOO (k BIGINT PRIMARY KEY, v VARCHAR) UPDATE_CACHE_FREQUENCY = 900000;

Представления

Phoenix поддерживает обновляемые представления поверх таблиц с уникальной функцией, использующей уникальные возможности HBase для возможности добавления столбцов к ним. Все представления все имеют одну и ту же базовую физическую таблицу HBase и могут даже индексироваться независимо.

Мультиарендность

Phoenix также поддерживает многопользовательскую поддержку. Точно так же, как с представлениями, представление с несколькими арендаторами может добавлять столбцы, которые определены исключительно для этого пользователя.

Схема в режиме чтения

Другая связанная с схемой функция позволяет динамически определять столбцы во время запроса. Это полезно в ситуациях, когда вы заранее не знаете все столбцы во время создания. Более подробную информацию об этой функции вы найдете здесь.

Сопоставление с существующей таблицей HBase

Apache Phoenix поддерживает сопоставление с существующей таблицей HBase через инструкции CREATE TABLE и CREATE VIEW DDL. В обоих случаях метаданные HBase остаются как есть, за исключением того, что с CREATE TABLE активирована опция KEEP_DELETED_CELLS, позволяющая корректно работать с запросами флэшбэка. Для CREATE TABLE будут созданы любые метаданные HBase (таблицы, семейства столбцов), которые еще не существуют. Обратите внимание, что имена таблиц и столбцов имеют чувствительность к регистру, а Феникс - верхние части всех имен. Чтобы сделать регистр с именем, чувствительным к регистру DDL, окружите его двойными кавычками, как показано ниже:

 CREATE VIEW “MyTable” (“a”.ID VARCHAR PRIMARY KEY)

Для CREATE TABLE для каждой строки также добавляется пустое значение ключа, поэтому запросы ведут себя как ожидалось (без необходимости проецирования всех столбцов во время сканирования). Для CREATE VIEW это не будет сделано, и метаданные HBase не будут созданы. Вместо этого существующие метаданные HBase должны соответствовать метаданным, указанным в инструкции DDL, или ОШИБКА 505 (42000): таблица будет прочитана только для чтения.

Другое предостережение состоит в том, что способ, которым байты были сериализованы в HBase, должен соответствовать тому, как байты, как ожидается, будут сериализованы Phoenix. Для типов VARCHAR, CHAR и UNSIGNED_ * Phoenix использует служебные методы HBase Bytes для выполнения сериализации. Тип CHAR ожидает только однобайтовые символы, а типы UNSIGNED ожидают значения, которые больше или равны нулю.

Наши составные ключи строк формируются путем простого объединения значений вместе с символом нулевого байта, используемым в качестве разделителя после типа переменной длины. Для получения дополнительной информации о нашей системе типов см. Тип данных.

Модифицирование (соль)

Таблица также может быть заявлена ​​как соленая для предотвращения горячего пятна области HBase. Вам просто нужно объявить, сколько соленых ведер у вас есть, и Phoenix будет прозрачно управлять соляной для вас. Здесь вы найдете более подробную информацию об этой функции, а также хорошее сравнение пропускной способности записи между соленными и несоленными таблицами. [Источник 1].

API-интерфейсы

Каталог таблиц, их столбцы, первичные ключи и типы можно получить с помощью интерфейсов метаданных java.sql: DatabaseMetaData, ParameterMetaData и ResultSetMetaData. Для извлечения схем, таблиц и столбцов через интерфейс DatabaseMetaData шаблон схемы, шаблон таблицы и шаблон столбца указаны как в выражении LIKE (т.е. % И _ - это маски с символами). Аргумент каталога таблицы в API метаданных используется для фильтрации на основе идентификатора арендатора для таблиц с несколькими арендаторами. [Источник 2].

Смотреть также

Источники

  1. Apache Phoenix // Официальная страница Apache Phoenix [2017—2017]. Дата обращения: 12.03.2018. Режим доступа: http://phoenix.apache.org/
  2. Apache Phoenix blog // Официальный блог Apache Phoenix [2017—2017]. Дата обращения: 12.03.2018. Режим доступа: http://blogs.apache.org/phoenix/