UDF в Apache Hive: создание, регистрация и эксплуатация

Автор Категория , ,
UDF в Apache Hive: создание, регистрация и эксплуатация

Сегодня в рамках обучения дата-аналитиков и разработчиков распределенных приложений, рассмотрим, что такое пользовательские функции в Apache Hive, как их создать и использовать. А также в чем проблема вызова UDF-функции, зарегистрированной в Hive, из Impala и при чем здесь Sentry.

Простые и сложные UDF в Apache Hive

Пользовательские функции в Hive (UDF, User Defined Functions) – это настраиваемые функции, которые можно разработать самостоятельно и запустить в кластере Hadoop для эффективных и сложных вычислений, невозможных с обычным SQL. В Hive функции UDF бывают двух типов: простые (simple) и сложные (complex). Простые легче реализовать, но они менее гибкие и эффективные по сравнению со сложными.  Пример простой UDF-функции может выглядеть так:

class SimpleUDFExample extends UDF
{
public Text evaluate(Text input)
{
return new Text("Hello " + input.toString());
}
}

Универсальные сложные UDF дают следующие преимущества:

  • могут обрабатывать универсальные типы данных;
  • работают оптимально, с отложенным вычислением аргументов без рефлексивного вызова;
  • поддерживают вложенные параметры, например, список списков.

Сложные UDF в Hive представляют собой расширение класса GenericUDF:

public interface GenericUDF {
public Object evaluate(DeferredObject[] args) throws HiveException;
public String getDisplayString(String[] args);
public ObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException;
}

В комплексных UDF-функциях все объекты передаются с использованием типа объекта. А выходные значения могут относиться к элементарному типу данных, являться списком, сопоставлением или структурой. При первом вызове UDF, Hive вычисляет фактические типы параметров функции и вызывает инспектор объектов:

public ObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException;

Метод получает один инспектор объектов для каждого аргумента запроса и возвращает его для всякого типа данных. Затем Hive использует возвращенный ObjectInspector, чтобы узнать, что возвращает UDF, и продолжить анализ запроса. После этого строки передаются в UDF, который должен использовать ObjectInspectors, полученные при инициализации в методе initialize(), для чтения отложенных объектов. UDF обычно хранит инспекторы объектов, полученные и созданные при инициализации в переменных.

Как использовать созданную функцию

Итак, можно расширить типовые возможности SQL с помощью UDF-функций на основе Java и вызвать их из запроса Hive. При этом сначала в проекте Java, совместимом с Hadoop и Hive, следует написать и скомпилировать код UDF, а затем экспортировать его в JAR. Как уже было отмечено выше, рекомендуется использовать для этого API org.apache.hadoop.hive.ql.udf.generic.GenericUDF. Логика UDF определяется в новом классе, который возвращает тип данных выбранного столбца в таблице.

Далее созданную UDF нужно зарегистрировать и сохранить JAR в своем кластере. Есть несколько методов настройки и регистрации с поддержкой Sentry – системы обеспечения детальной RBAC-авторизации для данных и метаданных, хранящихся в кластере Hadoop. Например, метод каталога Hive требует перезапустить HiveServer2 после регистрации. В любом случае, разработчику необходим доступ к HDFS в кластере, а также работающий HiveServer и/или Hive Interactive Server. Следует выбрать такой метод настройки кластера, чтобы Hive мог найти JAR. После регистрации UDF нет необходимости перезапускать Hive перед использованием UDF в запросе.

Поскольку Hive часто используется с Impala, рассмотрим, как вызвать UDF зарегистрированный в Hive, из запроса Impala. При этом Sentry следует отключить, а при регистрации должна использоваться функция CREATE FUNCTION, которая включает условие USING либо прямую ссылку на JAR или методы каталога Hive Aux JAR. CREATE FUNCTION включает местоположение JAR, чтобы Impala смогла загрузить UDF. JAR-файл с кодом UDF, должен находиться в HDFS, чтобы все узлы Impala могли его использовать. Если не получается зарегистрировать UDF, который требуется вызвать из Impala, в Hive из-а Sentry, рекомендуется зарегистрировать UDF в Impala. При этом не следует называть UDF, зарегистрированный в Impala, также как в Hive.

При изменении содержания UDF, ее нужно перерегистрировать заново, выполнив следующие действия:

  • обновить Java-код в Java-проекте;
  • в командной строке Hive использовать команду drop для обновления UDF:

DROP FUNCTION hiveudf-1.0-SNAPSHOT.jar

  • удалить старый файл JAR из кластера;
  • загрузить обновленный JAR в кластер в расположение, которое соответствует конфигурации Hive Aux Jars Directory или конфигурации Reloadable Aux Jars;
  • если в Hive-кластере включен Sentry, следует предоставить права на файлы JAR тем ролям, которым требуется доступ к UDF;
  • при использовании Hive Aux Jars, следует повторно развернуть клиентские конфигурации и перезапустите HiveServer2.

Читайте в нашей новой статье про обработку вложенных структур данных в файлах JSON, чтобы создать таблицу в Hive Metastore и обеспечить пользователям доступ к данным с помощью обычных SQL-запросов. А о том, как преобразуются разные типы данных при выполнении SQL-запросов в Apache Hive и других СУБД, смотрите здесь.

Освоить все тонкости работы с Apache Hive для эффективной аналитики больших данных вам помогут специализированные курсы в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://medium.com/@jackgoettle23/building-a-hive-user-defined-function-f6abe92f6e56
  2. https://data-flair.training/blogs/hive-udf/
  3. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-UDFinternals
  4. https://docs.cloudera.com/documentation/enterprise/latest/topics/cm_mc_hive_udf.html