Использование сопроцессоров в 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.

Функции сопроцессоров observer
Функция Описание

preGet, postGet

Вызываются до и после того как клиент выполнит запрос get, соответственно

preExists, postExists

Вызываются до и после того как клиент проверит существование данных с помощью запроса get, соответственно

prePut, postPut

Вызываются до и после того как клиент запишет данные с помощью запроса put, соответственно

preDelete, postDelete

Вызываются до и после того как клиент удалит данные с помощью запроса delete, соответственно

preOpen, postOpen

Вызываются до и после того как состояние региона online передается на HBase master server, соответственно

preFlush, postFlush

Вызываются до и после того как содержимое MemStore записывается в новый HFile, соответственно

preScannerOpen, postScannerOpen

Вызываются до и после того как клиент вызовет новый сканер с помощью запроса scan, соответственно

preScannerNext, postScannerNext

Вызываются до и после того как следующая строка будет запрошена клиентом в открытом сканере, соответственно

preScannerClose, postScannerClose

Вызываются до и после того как клиент закроет сканер, соответственно

preCheckAndPut, postCheckAndPut

Вызываются до и после того как клиент вызовет функцию checkAndPut(), соответственно

preCheckAndDelete, postCheckAndDelete

Вызываются до и после того как клиент вызовет функцию checkAndDelete(), соответственно

Ниже приведен код для простого сопроцессора 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.

Статическая загрузка сопроцессора

Чтобы статически загрузить сопроцессор, выполните следующее:

  1. Поместите JAR-файл с кодом сопроцессора в директорию lib/ инсталляции HBase на всех узлах кластера, где требуется использование сопроцессора.

  2. Откройте веб-интерфейс ADCM и выберите ваш кластер ADH.

  3. Перейдите в раздел Services → HBase → Primary configuration и включите переключатель Show advanced.

  4. Откройте секцию настроек Custom hbase-site.xml и нажмите Add property.

  5. Укажите одно из следующих имен:

    • hbase.coprocessor.region.classes — для сопроцессора RegionObserver или endpoint;

    • hbase.coprocessor.wal.classes — для сопроцессора WALObserver;

    • hbase.coprocessor.master.classes — для сопроцессора MasterObserver.

  6. В качестве значения параметра укажите полное имя класса для класса реализации сопроцессора. Если таких классов несколько — их имена следует разделить запятыми.

  7. Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.

Статически загруженные сопроцессоры активны на всех регионах всех таблиц. Первый сопроцессор имеет приоритет Coprocessor.Priority.SYSTEM. Все остальные имеют целочисленные значения приоритета в порядке их объявления. Можно переопределить значение приоритета, добавив новое значение к имени класса, отделив его символом |. Пример: org.myname.hbase.coprocessor.endpoint.SumEndPoint|21.

Статическая выгрузка сопроцессора

Чтобы статически выгрузить сопроцессор, выполните следующее:

  1. Удалите параметр из секции настроек Custom hbase-site.xml, который был создан для сопроцессора.

  2. Сохраните конфигурацию, нажав Save → Create, и перезапустите сервис, нажав Actions → Reconfig and graceful restart.

  3. (Необязательно) Удалите 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. Информация о сопроцессоре должна появиться в выводе команды сразу после имени таблицы.

Динамическая выгрузка сопроцессора

Чтобы динамически выгрузить сопроцессор, перейдите в консоль HBase shell и выполните команду следующего вида:

alter '<table_name>', METHOD => 'table_att_unset', NAME => 'coprocessor$1'
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней