Невозможно запустить UDF на сервере улья - PullRequest
8 голосов
/ 23 февраля 2012

У меня работает куст в режиме экономичного сервера.У меня есть UDF в файле JAR, который я пытаюсь использовать, запустив

add jar <path to jar>
create temporary function func_name as 'com.test.udf.UDF_CLASS'

Однако, когда я запускаю команду создания временной функции, я получаю ошибку

Запросвернул ненулевой код: 9, причина: FAILED: ошибка выполнения, код возврата 1 из org.apache.hadoop.hive.ql.exec.FunctionTask

Я проверил, что имя и путьбанка и того, что пользователь, выполняющий сервер улья, имеет все необходимые разрешения для доступа к банке.Что странно, если я запускаю куст в режиме CLI и выполняю те же самые команды, тогда все работает.Любые идеи о том, почему CLI Hive может вести себя не так, как сервер Hive Thrift?

Ответы [ 3 ]

9 голосов
/ 12 октября 2012

Поработав с этим некоторое время, я заставил его работать, поместив файл .class в структуру каталогов, соответствующую его пакету, и добавив его в .jar оттуда.Для справки я включил весь процесс, включая компиляцию и вставку в куст.

  1. Я использовал пример UDF здесь
  2. Скомпилируйте его: javac -classpath $CLASSPATH Lower.java, Примечание: CLASSPATH был определен так: CLASSPATH=$(ls $HIVE_HOME/lib/hive-serde-*.jar):$(ls $HIVE_HOME/lib/hive-exec-*.jar):$(ls $HADOOP_HOME/hadoop-core-*.jar), как описано здесь .
  3. Скопируйте файл .class в папку com / example /hive / udf /
  4. Добавил его в jar с помощью этой команды: jar -cf lower.jar com/example/hive/udf/Lower.class
  5. Убедитесь, что пакет выглядит правильно: jar -tf lower.jar.Вы должны увидеть следующую строку: com/example/hive/udf/Lower.class.
  6. Импортируйте банку в улей.add jar lower.jar; create temporary function my_lower as 'com.example.hive.udf.Lower';
3 голосов
/ 24 февраля 2012

Исправлена ​​проблема с помощью следующих шагов:

1) Поместите каждую банку UDF в / usr / lib / hive / auxlib

2) Укажите путь к каждой банке в hive-site.xml для свойства hive.aux.jars.path (например, file: ///usr/lib/hive/auxlib/jar1.jar,file: ///usr/lib/hive/auxlib/jar2.jar)

3) Создайте сценарий для выполнения экономичного запроса на сервер улья, чтобы запустить временную функцию func_name как com.test.udf.ClassName для каждой пользовательской функции после запуска сервера улья

Редактировать: Для Hive 0.9, что бы я ни делал, Hiveserver не смог найти jar-файлы в каталоге auxlib.Чтобы заставить это работать на Hiveserver 0.9, мне нужно было просто выбросить jar в каталог, указанный в classpath Hive.

0 голосов
/ 24 февраля 2012

Вы также можете сделать это, передав параметр --auxpath команде hive hive --auxpath /path-to-/hive-examples.jar

или

, установив HIVE_AUX_JARS_PATHпеременная окружающая среда.

...