Použití UDF v Javě s Apache Hivem ve službě HDInsight
Zjistěte, jak vytvořit uživatelem definovanou funkci (UDF) založenou na Javě, která funguje s Apache Hivem. Funkce definovaná uživatelem Java v tomto příkladu převede tabulku textových řetězců na znaky malými písmeny.
Požadavky
Cluster Hadoop ve službě HDInsight. Viz Začínáme se službou HDInsight v Linuxu.
Apache Maven je správně nainstalovaný podle Apache. Maven je systém sestavení projektu pro projekty Java.
Schéma identifikátoru URI pro primární úložiště clusterů. To by bylo wasb:// pro Azure Storage,
abfs://
pro Azure Data Lake Storage Gen2 nebo adl:// pro Azure Data Lake Storage Gen1. Pokud je pro Azure Storage povolený zabezpečený přenos, identifikátor URI by bylwasbs://
. Viz také zabezpečený přenos.Textový editor nebo integrované vývojové prostředí Java
Důležité
Pokud vytváříte soubory Pythonu v klientovi Windows, musíte použít editor, který jako konec řádku používá LF. Pokud si nejste jistí, jestli váš editor používá LF nebo CRLF, přečtěte si část Řešení potíží s odebráním znaku CR.
Testovací prostředí
Prostředí použité pro tento článek bylo počítač s Windows 10. Příkazy se spustily na příkazovém řádku a různé soubory byly upraveny pomocí Poznámkového bloku. Odpovídajícím způsobem upravte své prostředí.
Na příkazovém řádku zadejte následující příkazy a vytvořte pracovní prostředí:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Vytvoření ukázkové funkce definované uživatelem v Javě
Zadáním následujícího příkazu vytvořte nový projekt Maven:
mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=ExampleUDF -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Tento příkaz vytvoří adresář s názvem
exampleudf
, který obsahuje projekt Maven.Po vytvoření projektu odstraňte
exampleudf/src/test
adresář, který byl vytvořen jako součást projektu, zadáním následujícího příkazu:cd ExampleUDF rmdir /S /Q "src/test"
Otevřete
pom.xml
zadáním následujícího příkazu:notepad pom.xml
Potom nahraďte existující
<dependencies>
položku následujícím kódem 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>
Tyto položky určují verzi Systému Hadoop a Hive, která je součástí HDInsight 3.6. Informace o verzích Hadoop a Hive, které jsou součástí HDInsight, najdete v dokumentu o správě verzí komponent HDInsight.
<build>
Přidejte oddíl před</project>
řádek na konci souboru. Tato část by měla obsahovat následující kód 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>
Tyto položky definují, jak vytvořit projekt. Konkrétně verze Javy, kterou projekt používá, a jak vytvořit uberjar pro nasazení do clusteru.
Po provedení změn soubor uložte.
Zadáním následujícího příkazu vytvořte a otevřete nový soubor
ExampleUDF.java
:notepad src/main/java/com/microsoft/examples/ExampleUDF.java
Pak zkopírujte a vložte níže uvedený kód Java do nového souboru. Potom soubor zavřete.
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(); } }
Tento kód implementuje UDF, který přijímá řetězcovou hodnotu, a vrátí malá písmena verze řetězce.
Sestavení a instalace funkce definované uživatelem
Vnásledujícíchch sshuser
Nahraďte mycluster
skutečným názvem clusteru.
Zkompilujte a zabalte UDF zadáním následujícího příkazu:
mvn compile package
Tento příkaz sestaví a zabalí uživatelem definovanou uživatelem do
exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar
souboru.scp
Pomocí příkazu zkopírujte soubor do clusteru HDInsight zadáním následujícího příkazu:scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
Připojte se ke clusteru pomocí SSH zadáním následujícího příkazu:
ssh sshuser@mycluster-ssh.azurehdinsight.net
Z otevřené relace SSH zkopírujte soubor JAR do úložiště HDInsight.
hdfs dfs -put ExampleUDF-1.0-SNAPSHOT.jar /example/jars
Použití funkce definovaná uživatelem z Hivu
Spusťte klienta Beeline z relace SSH zadáním následujícího příkazu:
beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http'
Tento příkaz předpokládá, že jste pro svůj cluster použili výchozí nastavení správce pro přihlašovací účet.
Jakmile dorazíte na
jdbc:hive2://localhost:10001/>
výzvu, zadejte následující příkaz, který přidá uživatelem definované uživatelem do Hivu a zpřístupní ho jako funkci.ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar; CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
Pomocí funkce definovaná uživatelem můžete převést hodnoty načtené z tabulky na malé řetězce.
SELECT tolower(state) AS ExampleUDF, state FROM hivesampletable LIMIT 10;
Tento dotaz vybere stav z tabulky, převede řetězec na malá písmena a pak je zobrazí společně s neupraveným názvem. Výstup se podobá následujícímu textu:
+---------------+---------------+--+ | exampleudf | state | +---------------+---------------+--+ | california | California | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | colorado | Colorado | | colorado | Colorado | | colorado | Colorado | | utah | Utah | | utah | Utah | | colorado | Colorado | +---------------+---------------+--+
Řešení problému
Při spuštění úlohy Hive se může zobrazit chyba podobná následujícímu textu:
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.
Příčinou tohoto problému může být konec řádku v souboru Pythonu. Mnoho editorů Windows jako konec řádku používá CRLF, ale linuxové aplikace obvykle očekávají LF.
Před nahráním souboru do HDInsight můžete pomocí následujících příkazů PowerShellu odebrat znaky CR:
# Set $original_file to the Python file path
$text = [IO.File]::ReadAllText($original_file) -replace "`r`n", "`n"
[IO.File]::WriteAllText($original_file, $text)
Další kroky
Další způsoby práce s Hivem najdete v tématu Použití Apache Hivu se službou HDInsight.
Další informace o uživatelem definovaných funkcích Hive najdete v části Operátory Apache Hive a uživatelem definované funkce wikiwebu Hive na apache.org.