2016-07-23 2 views
0

Я должен добавить следующую UDF в улье:Невозможно добавить UDF в улей

package com.hadoopbook.hive; 

import org.apache.commons.lang.StringUtils; 
import org.apache.hadoop.hive.ql.exec.UDF; 
import org.apache.hadoop.io.Text; 

public class Strip extends UDF { 
    private Text result = new Text(); 

    public Text evaluate(Text str) { 
    if (str == null) { 
     return null; 
    } 
    result.set(StringUtils.strip(str.toString())); 
    return result; 
    } 

    public Text evaluate(Text str, String stripChars) { 
    if (str == null) { 
     return null; 
    } 
    result.set(StringUtils.strip(str.toString(), stripChars)); 
    return result; 
    } 
} 

Это пример из книги "Hadoop: The Definitive Guide"

  1. Я создал .class файл выше Java-файл с помощью следующей команды:

    [email protected]:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ javac Strip.java 
    
  2. Затем я создал файл банки у петь следующую команду:

    [email protected]:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ jar cvf Strip.jar Strip Strip.class 
    Strip : no such file or directory 
    added manifest 
    adding: Strip.class(in = 915) (out= 457)(deflated 50%) 
    
  3. Я добавил geenrated файл банку в каталог HDFS с:

    [email protected]:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ hadoop dfs -copyFromLocal /home/hduser/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive/Strip.jar /user/hduser/input 
    
  4. Я попытался создать UDF usign следующую команду:

    hive> create function strip as 'com.hadoopbook.hive.Strip' using jar 'hdfs://localhost/user/hduser/input/Strip.jar'; 
    

Но я получил ошибку:

преобразование местного HDFS: //localhost/user/hduser/input/Strip.jar Добавлены [/tmp/hduser_resources/Strip.jar] на пути класса Дополнительных ресурсы: [HDFS: // локальных/пользователя /hduser/input/Strip.jar] Не удалось зарегистрировать default.strip с помощью класса com.hadoopbook.hive.Strip FAILED: Выполнение Ошибка, код возврата 1 из org.apache.hadoop.hive.ql.exec.FunctionTask

  1. Я также попытался создать временную функцию. Так я первый добавил файл банку в улей с помощью:

    hive> add jar hdfs://localhost/user/hduser/input/Strip.jar; 
    converting to local hdfs://localhost/user/hduser/input/Strip.jar 
    Added [/tmp/hduser_resources/Strip.jar] to class path 
    Added resources: [hdfs://localhost/user/hduser/input/Strip.jar] 
    
  2. Затем я попытался добавить временную функцию:

    hive> create temporary function strip as 'com.hadoopbook.hive.Strip'; 
    

Но я получил следующее сообщение об ошибке:

FAILED: Класс com.hadoopbook.hive.Strip не найден FAILED: Выполнение Ошибка, код возврата 1 из org.apache.hadoop.hive.ql.exec.FunctionTask

Файл jar был успешно создан и добавлен в hive.Still показывается, что класс не найден. Может ли кто-нибудь рассказать, что с ним не так?

+0

почему ваша команда баночка имеет 'Strip'? 'jar cvf Strip.jar Strip Strip.class'. можете ли вы попытаться создать свою банку как 'jar cvf Strip.jar Strip.class' и повторно запустить? Я построил банку, используя вашу программу из eclipse, и она отлично работала. –

+0

Спасибо.Создание jar из eclipse. Но создание с помощью jar cvf Strip.jar Strip.class еще не работает. Это странно. –

+0

yes - см. Мой ответ ниже о том, как создать банку, используя правильную линию командной строки. - любезно принять это как ответ (сделайте правильный знак зеленый ниже), если ваши сомнения ясны. –

ответ

0

Да, используя IDE, например, затмение легко, а затем сделать банку из CLI.

Создание баночку файла из командной строки, вы должны выполнить следующие действия:

сначала сделать проект DIRS в рамках проекта дир ch17-hive:

  • бен - будет хранить .class файлы (Strip.class)
  • Lib - будет хранить требуется внешние банки
  • traget - будет хранить банки, которые вы будете создавать

    [ch17-hive]$ mkdir bin lib traget 
    [ch17-hive]$ ls 
    bin lib src target 
    

копирования требуется внешние банки к ch170hive/lib директории:

[ch17-hive]$ cp /usr/lib/hive/lib/hive-exec.jar lib/. 
[ch17-hive]$ cp /usr/lib/hadoop/hadoop-common.jar lib/. 

компилировать Java из директории, из которой ваш класс com.hadoopbook.hive.Strip проживает, в вашем случае его ch17-hive/src/main/java:

[java]$ pwd 
/home/cloudera/ch17-hive/src/main/java 
[java]$ javac -d ../../../bin -classpath ../../../lib/hive-exec.jar:../../../lib/hadoop-common.jar com/hadoopbook/hive/Strip.java 

Создать манифест файл a s:

[ch17-hive]$ cat MENIFEST.MF 
Main-Class: com.hadoopbook.hive.Strip 
Class-Path: lib/hadoop-common.jar lib/hive-exec.jar 

Создание банка в

[ch17-hive]$ jar cvfm target/strip.jar MENIFEST.MF -C bin .added manifest 
adding: com/(in = 0) (out= 0)(stored 0%) 
adding: com/hadoopbook/(in = 0) (out= 0)(stored 0%) 
adding: com/hadoopbook/hive/(in = 0) (out= 0)(stored 0%) 
adding: com/hadoopbook/hive/Strip.class(in = 915) (out= 456)(deflated 50%) 

Теперь вы проецировать структуры должны выглядеть следующим образом:

[ch17-hive]$ ls * 
MENIFEST.MF 

bin: 
com 

lib: 
hadoop-common.jar hive-exec.jar 

src: 
main 

target: 
strip.jar 

копию созданного баночку HDFS:

hadoop fs -put /home/cloudera/ch17-hive/target/strip.jar /user/cloudera/. 

используют его в энцефалопатией:

hive> create function strip_new as 'com.hadoopbook.hive.Strip' using jar 'hdfs:/user/cloudera/strip.jar'; 
converting to local hdfs:/user/cloudera/strip.jar 
Added [/tmp/05a13d23-8051-431f-a354-793abac66160_resources/strip.jar] to class path 
Added resources: [hdfs:/user/cloudera/strip.jar] 
OK 
Time taken: 0.071 seconds 
hive> 
Смежные вопросы