Używanie funkcji zdefiniowanej przez użytkownika języka Java z usługą Apache Hive w usłudze HDInsight
Dowiedz się, jak utworzyć funkcję zdefiniowaną przez użytkownika (UDF) opartą na języku Java, która współpracuje z usługą Apache Hive. Funkcja UDF języka Java w tym przykładzie konwertuje tabelę ciągów tekstowych na małe litery.
Wymagania wstępne
Klaster Hadoop w usłudze HDInsight. Zobacz Wprowadzenie do usługi HDInsight w systemie Linux.
Narzędzie Apache Maven poprawnie zainstalowane zgodnie z apache. Maven to system kompilacji projektu dla projektów Java.
Schemat identyfikatora URI dla magazynu podstawowego klastrów. Byłoby to wasb:// dla usługi Azure Storage,
abfs://
dla usługi Azure Data Lake Storage Gen2 lub adl:// dla usługi Azure Data Lake Storage Gen1. Jeśli bezpieczny transfer jest włączony dla usługi Azure Storage, identyfikator URI towasbs://
. Zobacz również bezpieczny transfer.Edytor tekstów lub środowisko IDE języka Java
Ważne
Jeśli tworzysz pliki języka Python na kliencie systemu Windows, musisz użyć edytora, który używa LF jako zakończenia wiersza. Jeśli nie masz pewności, czy edytor używa LF lub CRLF, zobacz sekcję Rozwiązywanie problemów , aby uzyskać instrukcje dotyczące usuwania znaku CR.
Środowisko testowe
Środowisko używane w tym artykule było komputerem z systemem Windows 10. Polecenia zostały wykonane w wierszu polecenia, a różne pliki zostały edytowane za pomocą Notatnika. Zmodyfikuj odpowiednio środowisko.
W wierszu polecenia wprowadź poniższe polecenia, aby utworzyć środowisko robocze:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Tworzenie przykładowej funkcji zdefiniowanej przez użytkownika języka Java
Utwórz nowy projekt Maven, wprowadzając następujące polecenie:
mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=ExampleUDF -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
To polecenie tworzy katalog o nazwie
exampleudf
, który zawiera projekt Maven.Po utworzeniu projektu usuń
exampleudf/src/test
katalog utworzony w ramach projektu, wprowadzając następujące polecenie:cd ExampleUDF rmdir /S /Q "src/test"
Otwórz plik
pom.xml
, wprowadzając poniższe polecenie:notepad pom.xml
Następnie zastąp istniejący
<dependencies>
wpis następującym kodem XML:<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency> </dependencies>
Te wpisy określają wersję usług Hadoop i Hive dołączonych do usługi HDInsight 3.6. Informacje na temat wersji usług Hadoop i Hive dostarczanych z usługą HDInsight można znaleźć w dokumencie przechowywania wersji składników usługi HDInsight.
Dodaj sekcję
<build>
przed wierszem</project>
na końcu pliku. Ta sekcja powinna zawierać następujący kod XML:<build> <plugins> <!-- build for Java 1.8. This is required by HDInsight 3.6 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- build an uber jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <configuration> <!-- Keep us from getting a can't overwrite file error --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"> </transformer> </transformers> <!-- Keep us from getting a bad signature error --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Te wpisy definiują sposób kompilowania projektu. W szczególności wersja języka Java, z którego korzysta projekt, oraz jak utworzyć uberjar do wdrożenia w klastrze.
Zapisz plik po wprowadzeniu zmian.
Wprowadź poniższe polecenie, aby utworzyć i otworzyć nowy plik
ExampleUDF.java
:notepad src/main/java/com/microsoft/examples/ExampleUDF.java
Następnie skopiuj i wklej poniższy kod Java do nowego pliku. Następnie zamknij plik.
package com.microsoft.examples; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.*; // Description of the UDF @Description( name="ExampleUDF", value="returns a lower case version of the input string.", extended="select ExampleUDF(deviceplatform) from hivesampletable limit 10;" ) public class ExampleUDF extends UDF { // Accept a string input public String evaluate(String input) { // If the value is null, return a null if(input == null) return null; // Lowercase the input string and return it return input.toLowerCase(); } }
Ten kod implementuje funkcję zdefiniowaną przez użytkownika, która akceptuje wartość ciągu i zwraca małą wersję ciągu.
Kompilowanie i instalowanie funkcji zdefiniowanej przez użytkownika
W poniższych poleceniach zastąp sshuser
rzeczywistą nazwą użytkownika, jeśli jest inna. Zastąp mycluster
ciąg rzeczywistą nazwą klastra.
Skompiluj i spakuj funkcję zdefiniowanej przez użytkownika, wprowadzając następujące polecenie:
mvn compile package
To polecenie kompiluje i pakuje funkcję zdefiniowanej
exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar
przez użytkownika do pliku.scp
Użyj polecenia , aby skopiować plik do klastra usługi HDInsight, wprowadzając następujące polecenie:scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
Połącz się z klastrem przy użyciu protokołu SSH, wprowadzając następujące polecenie:
ssh sshuser@mycluster-ssh.azurehdinsight.net
Z poziomu otwartej sesji SSH skopiuj plik jar do magazynu usługi HDInsight.
hdfs dfs -put ExampleUDF-1.0-SNAPSHOT.jar /example/jars
Korzystanie z funkcji zdefiniowanej przez użytkownika z programu Hive
Uruchom klienta beeline z sesji SSH, wprowadzając następujące polecenie:
beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http'
To polecenie zakłada, że użyto domyślnego administratora dla konta logowania dla klastra.
Po wyświetleniu monitu
jdbc:hive2://localhost:10001/>
wprowadź następujące polecenie, aby dodać funkcję UDF do programu Hive i uwidocznić ją jako funkcję.ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar; CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
Użyj funkcji zdefiniowanej przez użytkownika, aby przekonwertować wartości pobrane z tabeli na ciągi małych liter.
SELECT tolower(state) AS ExampleUDF, state FROM hivesampletable LIMIT 10;
To zapytanie wybiera stan z tabeli, konwertuje ciąg na małe litery, a następnie wyświetla je wraz z niezmodyfikowaną nazwą. Dane wyjściowe są podobne do następującego tekstu:
+---------------+---------------+--+ | exampleudf | state | +---------------+---------------+--+ | california | California | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | colorado | Colorado | | colorado | Colorado | | colorado | Colorado | | utah | Utah | | utah | Utah | | colorado | Colorado | +---------------+---------------+--+
Rozwiązywanie problemów
Podczas uruchamiania zadania hive może wystąpić błąd podobny do następującego tekstu:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: [Error 20001]: An error occurred while reading or writing to your custom script. It may have crashed with an error.
Przyczyną tego problemu może być zakończenie wiersza w pliku języka Python. Wiele edytorów systemu Windows domyślnie używa crLF jako zakończenia wiersza, ale aplikacje systemu Linux zwykle oczekują LF.
Następujące instrukcje programu PowerShell umożliwiają usunięcie znaków CR przed przekazaniem pliku do usługi HDInsight:
# Set $original_file to the Python file path
$text = [IO.File]::ReadAllText($original_file) -replace "`r`n", "`n"
[IO.File]::WriteAllText($original_file, $text)
Następne kroki
Aby zapoznać się z innymi sposobami pracy z programem Hive, zobacz Używanie programu Apache Hive z usługą HDInsight.
Aby uzyskać więcej informacji na temat funkcji zdefiniowanych przez użytkownika programu Hive, zobacz sekcję Apache Hive Operators and User-Defined Functions (Operatory i funkcje zdefiniowane przez użytkownika) w witrynie typu wiki programu Hive pod adresem apache.org.