Sdílet prostřednictvím


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.

  • Java Developer Kit (JDK) verze 8

  • 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 byl wasbs://. 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ě

  1. 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.

  2. 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"
    
  3. 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.

  4. 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.

  1. 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.

  2. 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:
    
  3. Připojte se ke clusteru pomocí SSH zadáním následujícího příkazu:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. 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

  1. 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.

  2. 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';
    
  3. 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.