Статьи

Apache Phoenix: драйвер SQL для HBase

Вступление

HBase является одной из самых популярных баз данных NoSQL, она доступна во всех основных дистрибутивах Hadoop, а также является частью AWS Elastic MapReduce в качестве дополнительного приложения. Из коробки у него есть собственные операции с моделью данных, такие как Get, Put, Scan и Delete, и он не предлагает SQL-подобные возможности, в отличие, например, от языка запросов Cassandra, CQL.
Apache Phoenix — это слой SQL поверх HBase для поддержки наиболее распространенных SQL-подобных операций, таких как CREATE TABLE, SELECT, UPSERT, DELETE и т. Д. Первоначально он был разработан инженерами Salesforce.com для внутреннего использования и был открыт с открытым исходным кодом. В 2013 году он стал проектом инкубатора Apache.

Архитектура

Мы рассмотрели HBase более подробно в этой статье. Краткий обзор: архитектура HBase основана на трех ключевых компонентах: главный сервер HBase, серверы региона HBase и Zookeeper.

HBase-Architecture

Клиент должен найти RegionServers для работы с данными, хранящимися в HBase. По сути, регионы являются основными элементами для распределения таблиц по кластеру. Чтобы найти серверы регионов, клиенту сначала нужно будет поговорить с Zookeeper.

HBase-Lookup

Ключевыми элементами в модели данных HBase являются таблицы, семейства столбцов, столбцы и ключи строк. Таблицы состоят из столбцов и строк. Отдельные элементы на пересечении столбцов и строк (ячейки в термине HBase) являются версиями, основанными на отметке времени. Строки идентифицируются отсортированными ключами строк — эти ключи строк можно рассматривать как первичные ключи, и через них можно получить доступ ко всем данным в таблице.

Столбцы сгруппированы в семейства столбцов; во время создания таблицы необязательно указывать все столбцы, только семейства столбцов. Столбцы имеют префикс, полученный из семейства столбцов, и его собственный спецификатор, имя столбца выглядит следующим образом: ‘contents: html’.

Как мы уже видели, классическая модель данных HBase не разработана с учетом SQL. Под капотом находится многогранная карта. Вот где Феникс приходит на помощь; он предлагает скин SQL на HBase. Phoenix реализован как драйвер JDBC. С точки зрения архитектуры клиент Java, использующий JDBC, может быть настроен для работы с драйвером Phoenix и может подключаться к HBase с помощью SQL-подобных операторов. Мы покажем, как использовать клиент SQuirreL , популярный графический клиент SQL на основе Java, вместе с Phoenix.

Начало работы с Фениксом

Вы можете скачать Phoenix с сайта загрузки Apache . Различные версии Phoenix совместимы с различными версиями HBase, поэтому, пожалуйста, прочитайте документацию Phoenix, чтобы убедиться, что вы правильно настроили систему. В наших тестах мы использовали Phoenix 3.0.0 с HBase 0.94, дистрибутив Hadoop был Cloudera CDH4.4 с Hadoop v1. Пакет Phoenix содержит драйверы Hadoop версии 1 и 2 для клиентов, поэтому нам пришлось использовать соответствующий Hadoop- 1 файлов, подробности смотрите позже, когда говорите о клиенте SQuirreL.

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

$ cd ~/phoenix/phoenix-3.0.0-incubating/common
$ cp phoenix-3.0.0-incubating-client-minimal.jar  /usr/lib/hbase/lib
$ cp phoenix-core-3.0.0-incubating.jar /usr/lib/hbase/lib

После того, как вы скопировали файлы JAR на серверы региона, нам пришлось их перезапустить.

Phoenix предоставляет инструмент командной строки под названием sqlline — это утилита, написанная на Python. Его функциональность аналогична инструментам командной строки Oracle SQLPlus или MySQL; не слишком сложный, но делает работу для простых случаев использования.

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

$ cd ~/phoenix/phoenix-3.0.0.0-incubating/bin
$ ./psql.py localhost ../examples/web_stat.sql ../examples/web_stat.csv ../examples/web_stat_queries.sql

Это запустит оператор CREATE TABLE:

CREATE TABLE IF NOT EXISTS WEB_STAT (
     HOST CHAR(2) NOT NULL,
     DOMAIN VARCHAR NOT NULL,
     FEATURE VARCHAR NOT NULL,
     DATE DATE NOT NULL,
     USAGE.CORE BIGINT,
     USAGE.DB BIGINT,
     STATS.ACTIVE_VISITOR INTEGER
     CONSTRAINT PK PRIMARY KEY (HOST, DOMAIN, FEATURE, DATE)
);

Затем загрузите данные, хранящиеся в CSV-файле web_stat:

NA,Salesforce.com,Login,2013-01-01 01:01:01,35,42,10
EU,Salesforce.com,Reports,2013-01-02 12:02:01,25,11,2
EU,Salesforce.com,Reports,2013-01-02 14:32:01,125,131,42
NA,Apple.com,Login,2013-01-01 01:01:01,35,22,40
NA,Salesforce.com,Dashboard,2013-01-03 11:01:01,88,66,44
...

И запустите несколько примеров запросов к таблице, например:

-- Average CPU and DB usage by Domain
SELECT DOMAIN, AVG(CORE) Average_CPU_Usage, AVG(DB) Average_DB_Usage 
FROM WEB_STAT 
GROUP BY DOMAIN 
ORDER BY DOMAIN DESC;

Теперь вы можете подключиться к HBase, используя sqlline:

$ ./sqlline.py localhost
[cloudera@localhost bin]$ ./sqlline.py localhost
..
Connecting to jdbc:phoenix:localhost
Driver: org.apache.phoenix.jdbc.PhoenixDriver (version 3.0)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
..
Done
sqlline version 1.1.2
0: jdbc:phoenix:localhost> select count(*) from web_stat;
+------------+
|  COUNT(1)  |
+------------+
| 39         |
+------------+
1 row selected (0.112 seconds)
0: jdbc:phoenix:localhost> select host, sum(active_visitor) from web_stat group by host;
+------+---------------------------+
| HOST | SUM(STATS.ACTIVE_VISITOR) |
+------+---------------------------+
| EU   | 698                       |
| NA   | 1639                      |
+------+---------------------------+
2 rows selected (0.294 seconds)
0: jdbc:phoenix:localhost>

Использование SQuirreL с Фениксом

Если вы предпочитаете использовать графический клиент SQL с Phoenix, вы можете скачать, например, SQuirreL здесь.  После этого первым делом скопируйте соответствующий файл jar драйвера Phoenix в каталог lib SQuirreL:

$ cd ~/phoenix
$ cp phoenix-3.0.0-incubating/hadoop-1/phoenix-3.0.0.-incubatibg-client.jar ~/squirrel/lib

Теперь вы готовы настроить драйвер JDBC в клиенте SQuirreL, как показано на рисунке ниже:

Белка-1

Затем вы можете подключиться к Phoenix, используя соответствующую строку подключения (jdbc: phoenix: localhost в нашем тестовом сценарии):

Белка-2

После подключения вы можете начать выполнение ваших запросов SQL:
Белка-3

Phoenix на веб-сервисах Amazon — AWS Elastic MapReduce с Phoenix

Вы также можете использовать Phoenix с AWS Elastic MapReduce. При создании кластера необходимо указать версию Apach Hadoop, затем настроить HBase как дополнительное приложение и определить действие начальной загрузки для загрузки Phoenix в кластер AWS EMR. Смотрите детали ниже на картинках:

АМС-ЭМИ-3

АМС-ЭМИ-5

После запуска кластера вы можете войти на главный узел, используя ssh, и проверить свою конфигурацию Phoenix.
АМС-ЭМИ-9

Вывод

SQL является одним из самых популярных языков, используемых исследователями данных, и, вероятно, так и останется. С появлением баз данных Big Data и NoSQL объем, разнообразие и скорость данных значительно возросли, но потребность в традиционных, хорошо известных языках для их обработки не сильно изменилась. Решения SQL на Hadoop набирают обороты. Apache Phoenix — интересный проигрыватель с открытым исходным кодом, предлагающий слой SQL поверх HBase.