Een Java-UDF gebruiken met Apache Hive in HDInsight

Meer informatie over het maken van een op Java gebaseerde door de gebruiker gedefinieerde functie (UDF) die werkt met Apache Hive. De Java-UDF in dit voorbeeld converteert een tabel met teksttekenreeksen naar alleen kleine letters.

Vereisten

  • Een Hadoop-cluster in HDInsight. Zie Aan de slag met HDInsight in Linux.

  • Java Developer Kit (JDK) versie 8

  • Apache Maven correct geïnstalleerd volgens Apache. Maven is een systeem voor het bouwen van Java-projecten.

  • Het URI-schema voor de primaire opslag voor uw clusters. Dit is wasb:// voor Azure Storage, abfs:// voor Azure Data Lake Storage Gen2 of adl:// voor Azure Data Lake Storage Gen1. Als beveiligde overdracht is ingeschakeld voor Azure Storage, wordt de URI wasbs://. Zie ook beveiligde overdracht.

  • Een teksteditor of Java IDE

    Belangrijk

    Als u de Python-bestanden op een Windows-client maakt, moet u een editor gebruiken die LF als regeleinde gebruikt. Als u niet zeker weet of uw editor LF of CRLF gebruikt, raadpleegt u de sectie Probleemoplossing voor stappen voor het verwijderen van het CR-teken.

Testomgeving

De omgeving die voor dit artikel werd gebruikt, was een computer met Windows 10. De opdrachten werden uitgevoerd in een opdrachtprompt en de verschillende bestanden zijn bewerkt met Kladblok. Wijzig dienovereenkomstig voor uw omgeving.

Voer vanaf een opdrachtprompt de onderstaande opdrachten in om een werkomgeving te maken:

IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI

Een voorbeeld van een Java UDF maken

  1. Maak een nieuw Maven-project door de volgende opdracht in te voeren:

    mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=ExampleUDF -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    

    Met deze opdracht maakt u een map met de naam exampleudf, die het Maven-project bevat.

  2. Nadat het project is gemaakt, verwijdert u de exampleudf/src/test map die is gemaakt als onderdeel van het project door de volgende opdracht in te voeren:

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Open pom.xml door de onderstaande opdracht in te voeren:

    notepad pom.xml
    

    Vervang vervolgens de bestaande <dependencies> vermelding door de volgende 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>
    

    Deze vermeldingen geven de versie van Hadoop en Hive op die zijn opgenomen in HDInsight 3.6. U vindt informatie over de versies van Hadoop en Hive die bij HDInsight worden geleverd in het document over versiebeheer van HDInsight-onderdelen .

    Voeg een <build> sectie toe vóór de </project> regel aan het einde van het bestand. Deze sectie moet de volgende XML bevatten:

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

    Met deze vermeldingen wordt gedefinieerd hoe het project wordt gebouwd. Met name de versie van Java die het project gebruikt en hoe u een uberjar bouwt voor implementatie in het cluster.

    Sla het bestand op zodra de wijzigingen zijn aangebracht.

  4. Voer de onderstaande opdracht in om een nieuw bestand ExampleUDF.javate maken en te openen:

    notepad src/main/java/com/microsoft/examples/ExampleUDF.java
    

    Kopieer en plak vervolgens de onderstaande Java-code in het nieuwe bestand. Sluit vervolgens het bestand.

    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();
        }
    }
    

    Deze code implementeert een UDF die een tekenreekswaarde accepteert en retourneert een kleine versie van de tekenreeks.

De UDF bouwen en installeren

Vervang in de onderstaande opdrachten door sshuser de werkelijke gebruikersnaam, indien verschillend. Vervang door mycluster de werkelijke clusternaam.

  1. Compileer en verpak de UDF door de volgende opdracht in te voeren:

    mvn compile package
    

    Met deze opdracht wordt de UDF in het exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar bestand gebouwd en verpakt.

  2. Gebruik de scp opdracht om het bestand naar het HDInsight-cluster te kopiëren door de volgende opdracht in te voeren:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Maak verbinding met het cluster met behulp van SSH door de volgende opdracht in te voeren:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. Kopieer het JAR-bestand vanuit de geopende SSH-sessie naar de HDInsight-opslag.

    hdfs dfs -put ExampleUDF-1.0-SNAPSHOT.jar /example/jars
    

De UDF van Hive gebruiken

  1. Start de Beeline-client vanuit de SSH-sessie door de volgende opdracht in te voeren:

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

    Bij deze opdracht wordt ervan uitgegaan dat u de standaardinstelling beheerder hebt gebruikt voor het aanmeldingsaccount voor uw cluster.

  2. Zodra u bij de jdbc:hive2://localhost:10001/> prompt bent aangekomen, voert u het volgende in om de UDF toe te voegen aan Hive en deze beschikbaar te maken als een functie.

    ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar;
    CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
    
  3. Gebruik de UDF om waarden die zijn opgehaald uit een tabel te converteren naar tekenreeksen met kleine letters.

    SELECT tolower(state) AS ExampleUDF, state FROM hivesampletable LIMIT 10;
    

    Deze query selecteert de status in de tabel, converteert de tekenreeks naar kleine letters en geeft deze vervolgens weer samen met de ongewijzigde naam. De uitvoer lijkt op de volgende tekst:

    +---------------+---------------+--+
    |  exampleudf   |     state     |
    +---------------+---------------+--+
    | california    | California    |
    | pennsylvania  | Pennsylvania  |
    | pennsylvania  | Pennsylvania  |
    | pennsylvania  | Pennsylvania  |
    | colorado      | Colorado      |
    | colorado      | Colorado      |
    | colorado      | Colorado      |
    | utah          | Utah          |
    | utah          | Utah          |
    | colorado      | Colorado      |
    +---------------+---------------+--+
    

Problemen oplossen

Wanneer u de Hive-taak uitvoert, kan er een fout optreden die vergelijkbaar is met de volgende tekst:

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.

Dit probleem kan worden veroorzaakt door de regeleinden in het Python-bestand. Veel Windows-editors gebruiken crlf standaard als het einde van de regel, maar Linux-toepassingen verwachten meestal LF.

U kunt de volgende PowerShell-instructies gebruiken om de CR-tekens te verwijderen voordat u het bestand uploadt naar 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)

Volgende stappen

Zie Apache Hive gebruiken met HDInsight voor andere manieren om met Hive te werken.

Zie de sectie Apache Hive-operators en User-Defined Functions van de Hiv User-Defined e-wiki op apache.org voor meer informatie over Hive-functies.