UDF kann nicht auf dem Hive-Server ausgeführt werden

8

Ich bin im Spar-Server-Modus. Ich habe eine UDF in einer JAR-Datei, die ich benutze, indem ich

benutze %Vor%

Beim Ausführen des Befehls create temporary function erhalte ich jedoch einen Fehler

  

Abfrage hat Code ungleich Null zurückgegeben: 9, Ursache: FAILED: Ausführungsfehler,   Geben Sie Code 1 von org.apache.hadoop.hive.ql.exec.FunctionTask

zurück

Ich habe überprüft, dass der Name & amp; Pfad des Jars und dass der Benutzer, der den Hive-Server ausführt, über alle richtigen Berechtigungen verfügt, um auf das JAR zuzugreifen. Was komisch ist, ist, wenn ich im CLI-Modus den Hive starte und genau die gleichen Befehle ausführe, dann funktioniert alles. Irgendwelche Ideen, warum sich Hive CLI anders verhalten als der Hive-Sparsamkeits-Server?

    
jwegan 23.02.2012, 05:21
quelle

3 Antworten

3

Das Problem wurde mit den folgenden Schritten behoben:

1) Platzieren Sie jedes UDF-JAR in / usr / lib / hive / auxlib

2) Geben Sie den Pfad zu jedem jar in der Datei hive-site.xml für die Eigenschaft hive.aux.jars.path an (Beispiel: file: ///usr/lib/hive/auxlib/jar1.jar,file: / //usr/lib/hive/auxlib/jar2.jar)

3) Erstellen Sie ein Skript, um eine Sammelanforderung an den Hive-Server zu senden, um die temporäre Funktion func_name als 'com.test.udf.ClassName' für jede UDF zu starten, nachdem der Hive-Server gestartet wurde

Edit: Für Hive 0.9, egal was ich getan habe, Hiveserver konnte keine jars im auxlib-Verzeichnis finden. Um dies auf Hiveserver 0.9 zu ermöglichen, musste ich das jar einfach in dem Verzeichnis ablegen, das durch den Klassenpfad von Hive angegeben wurde.

    
jwegan 24.02.2012, 02:47
quelle
8

Nachdem ich eine Weile damit gespielt habe, habe ich es zum Laufen gebracht, indem ich die .class-Datei in eine Verzeichnisstruktur eingefügt habe, die mit ihrem Paket übereinstimmt, und sie von dort in die .jar-Datei hinzufüge. Als Referenz habe ich den gesamten Prozess einschließlich des Kompilierens und Einfügens in den Hive eingeschlossen.

  1. Ich habe das UDF-Beispiel hier verwendet
  2. Kompilieren Sie es: javac -classpath $CLASSPATH Lower.java . Hinweis: Der CLASSPATH wurde wie folgt definiert: CLASSPATH=$(ls $HIVE_HOME/lib/hive-serde-*.jar):$(ls $HIVE_HOME/lib/hive-exec-*.jar):$(ls $HADOOP_HOME/hadoop-core-*.jar) , wie beschrieben hier .
  3. Kopieren Sie die .class-Datei in einen Ordner com / example / hive / udf /
  4. Zu einem jar mit diesem Befehl hinzugefügt: jar -cf lower.jar com/example/hive/udf/Lower.class
  5. Überprüfen Sie, ob das Paket richtig aussieht: jar -tf lower.jar . Sie sollten eine Zeile wie diese sehen: com/example/hive/udf/Lower.class .
  6. Importieren Sie das Glas in den Bienenstock. %Code%
Tyler 11.10.2012 22:31
quelle
0

Sie können auch die Option --auxpath an den Befehl hive übergeben Bienenstock --auxpath /path-to-/hive-examples.jar

oder

durch Festlegen der Umgebungsvariable HIVE_AUX_JARS_PATH.

    
Bhavesh Shah 24.02.2012 05:50
quelle