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. UDF v Javě v tomto příkladu převede tabulku textových řetězců na všechna malá písmena.

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 sestavování projektů 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 bude wasbs://. Viz také zabezpečený přenos.

  • Textový editor nebo java integrované vývojové prostředí (IDE)

    Důležité

    Pokud vytváříte soubory Pythonu na 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íží, kde najdete postup odebrání znaku CR.

Testovací prostředí

Prostředím použitým v tomto článku byl počítač, na kterém běží Windows 10. Příkazy se spustily na příkazovém řádku a různé soubory byly upraveny pomocí Poznámkového bloku. Upravte odpovídajícím způsobem pro vaše prostředí.

Z příkazového řá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ázky UDF 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ář 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
    

    Pak 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 Hadoopu a Hive, která je součástí HDInsight 3.6. Informace o verzích Hadoop a Hive poskytovaných se službou 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í způsob sestavení projektu. Konkrétně verze Javy, kterou projekt používá, a postup vytvoření uberjaru 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 níže uvedený kód Java a vložte ho do nového souboru. Pak 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 vrací verzi řetězce s malými písmeny.

Sestavení a instalace uživatelem definovaného uživatelem

V následujících příkazech nahraďte sshuser skutečným uživatelským jménem, pokud se liší. 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í ADF a zabalí ho do exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar souboru.

  2. Pomocí příkazu scp 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í UDF z Hivu

  1. Zadáním následujícího příkazu spusťte klienta Beeline z relace SSH:

    beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http'
    

    Tento příkaz předpokládá, že jste pro přihlašovací účet clusteru použili výchozí hodnotu admin .

  2. Jakmile se zobrazí jdbc:hive2://localhost:10001/> výzva, zadejte následující příkaz, který přidá uživatelem definované uživatelem do Hivu a zveřejní 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 UDF můžete převést hodnoty načtené z tabulky na řetězce s velkými písmeny.

    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í spolu s neupraveným názvem. Výstup se bude podobat 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í potíží

Při spuštění úlohy Hive můžete narazit na chybu podobnou 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 mohou být konce řádků v souboru Pythonu. Mnoho editorů windows ve výchozím nastavení 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 funkcích Hive User-Defined najdete v části Apache Hive Operators and User-Defined Functions na wikiwebu Hive na apache.org.