Использование сопроцессоров в HBase
Обзор
Сопроцессоры HBase — это механизм расширения (фреймворк), позволяющий выполнять распределенные вычисления с помощью запуска пользовательского кода непосредственно в месте размещения данных.
Сопроцессор observer
Сопроцессор observer (или observer) предназначен для создания хуков, позволяющих следить за табличными операциями с клиентской стороны. В числе таких операций get
, put
, scan
, delete
и другие. В HBase представлены три вида сопроцессоров observer:
-
RegionObserver — предоставляет хуки для запросов обработки данных, таких как
get
,put
,scan
,delete
и других. Экземпляр RegionObserver размещается на каждом регионе таблицы. Область действия каждого экземпляра ограничена его регионом. -
WALObserver — предоставляет хуки для операций write-ahead log (WAL). WALObserver может наблюдать или перехватывать события записи и реконструкции, выполняемые WAL. На каждом сервере регионов имеется один контекст обработки WAL с одним WALObserver.
-
MasterObserver — предоставляет хуки для операций, связанных с описанием данных, таких как
create table
,delete table
,modify table
и других. MasterObserver располагается в контексте HBase master server.
Сопроцессор observer может наблюдать за действиями, выполняемыми клиентом в регионе, и вмешиваться в них. Следующие функции доступны для сопроцессоров observer.
Функция | Описание |
---|---|
preGet, postGet |
Вызываются до и после того как клиент выполнит запрос |
preExists, postExists |
Вызываются до и после того как клиент проверит существование данных с помощью запроса |
prePut, postPut |
Вызываются до и после того как клиент запишет данные с помощью запроса |
preDelete, postDelete |
Вызываются до и после того как клиент удалит данные с помощью запроса |
preOpen, postOpen |
Вызываются до и после того как состояние региона online передается на HBase master server, соответственно |
preFlush, postFlush |
Вызываются до и после того как содержимое MemStore записывается в новый HFile, соответственно |
preScannerOpen, postScannerOpen |
Вызываются до и после того как клиент вызовет новый сканер с помощью запроса |
preScannerNext, postScannerNext |
Вызываются до и после того как следующая строка будет запрошена клиентом в открытом сканере, соответственно |
preScannerClose, postScannerClose |
Вызываются до и после того как клиент закроет сканер, соответственно |
preCheckAndPut, postCheckAndPut |
Вызываются до и после того как клиент вызовет функцию |
preCheckAndDelete, postCheckAndDelete |
Вызываются до и после того как клиент вызовет функцию |
Ниже приведен код для простого сопроцессора observer. Он проверяет информацию о пользователе для запроса get
с помощью инъекции кода в определенных хуках preGet
. Он выдаст исключение CoprocessorException, если у пользователя нет прав доступа к ресурсу, что в свою очередь приведет к отказу в запросе пользователя.
package org.apache.hadoop.hbase.coprocessor;
import org.apache.hadoop.hbase.client.Get;
public class AccessControlCoprocessor extends BaseRegionObserverCoprocessor {
public Get preGet(CoprocessorEnvironment e, Get get)
throws CoprocessorException {
if (access_not_allowed) {
throw new AccessDeniedException("User access denied");
}
return get;
}
}
Сопроцессор endpoint
Сопроцессор endpoint (или endpoint) позволяет выполнять заданный код в регионе по триггеру. Например, можно выполнять агрегирование столбцов на любом сервере регионов.
Сопроцессор endpoint позволяет задавать кастомный динамический протокол RPC для коммуникации между клиентом и сервером регионов. Например, можно создать метод, который определяет специальные параметры запроса и типы ответов. Методы RPC, предоставляемые сопроцессором endpoint, могут выполняться при вызове динамических RPC-функций на стороне клиента.
Загрузка и выгрузка сопроцессоров
Для использования сопроцессора в HBase его сначала следует загрузить. Статическая загрузка выполняется через конфигурацию HBase, а динамическая — через консоль HBase shell или Java API.
Статическая загрузка сопроцессора
Чтобы статически загрузить сопроцессор, выполните следующее:
-
Поместите JAR-файл с кодом сопроцессора в директорию lib/ инсталляции HBase на всех узлах кластера, где требуется использование сопроцессора.
-
Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.
-
Перейдите в раздел Services → HBase → Primary configuration и включите переключатель Show advanced.
-
Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.
-
Укажите одно из следующих имен:
-
hbase.coprocessor.region.classes
— для сопроцессора RegionObserver или endpoint; -
hbase.coprocessor.wal.classes
— для сопроцессора WALObserver; -
hbase.coprocessor.master.classes
— для сопроцессора MasterObserver.
-
-
В качестве значения параметра укажите полное имя класса для класса реализации сопроцессора. Если таких классов несколько — их имена следует разделить запятыми.
-
Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.
Статически загруженные сопроцессоры активны на всех регионах всех таблиц. Первый сопроцессор имеет приоритет Coprocessor.Priority.SYSTEM
. Все остальные имеют целочисленные значения приоритета в порядке их объявления. Можно переопределить значение приоритета, добавив новое значение к имени класса, отделив его символом |
. Пример: org.myname.hbase.coprocessor.endpoint.SumEndPoint|21
.
Статическая выгрузка сопроцессора
Чтобы статически выгрузить сопроцессор, выполните следующее:
-
Удалите параметр из секции настроек Custom hbase-site.xml, который был создан для сопроцессора.
-
Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.
-
(Необязательно) Удалите JAR-файл из директории lib/ инсталляции HBase.
Динамическая загрузка сопроцессора
Чтобы динамически загрузить сопроцессор, перейдите в консоль HBase shell и выполните команду следующего вида:
alter '<table_name>', METHOD => 'table_att', 'coprocessor'=>'hdfs://<namenode>:<port>/<coprocessor.jar>|<class_name>|<priority>|<args>'
где:
-
<table_name>
— имя таблицы, для которой загружается сопроцессор; -
<namenode>:<port>
— сетевой адрес узла, содержащего JAR-файл с кодом сопроцессора. Если файл расположен на этом же узле, эту часть можно опустить, обращая внимание на тройной символ/
:hdfs:///
; -
<coprocessor.jar>
— полный путь к JAR-файлу в файловой системе узла; -
<class_name>
— полное имя класса сопроцессора; -
<priority>
— целочисленное значение приоритета сопроцессора; -
<args>
— аргументы, принимаемые реализацией сопроцессора.
Пример:
alter 't1', METHOD => 'table_att', 'coprocessor'=>'hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar|org.myname.hbase.Coprocessor.RegionObserverExample|1037|arg1=1,arg2=2'
Чтобы убедиться, что сопроцессор загружен, используйте команду describe
. Информация о сопроцессоре должна появиться в выводе команды сразу после имени таблицы.