Megosztás a következőn keresztül:


Java UDF használata az Apache Hive-tal a HDInsightban

Megtudhatja, hogyan hozhat létre egy Java-alapú, felhasználó által definiált függvényt (UDF), amely együttműködik az Apache Hive-tal. Ebben a példában a Java UDF szöveges sztringeket tartalmazó táblázatot alakít át kisbetűs karakterekké.

Előfeltételek

  • Hadoop-fürt a HDInsighton. Lásd: A HDInsight használatának első lépései Linux rendszeren.

  • Java Developer Kit (JDK) 8-es verzió

  • Az Apache Maven megfelelően van telepítve az Apache szerint. A Maven egy Java-projektekhez készült projektépítési rendszer.

  • A fürtök elsődleges tárolójának URI-sémája . Ez az Azure Storage esetében wasb://, abfs:// Azure Data Lake Storage Gen2 vagy adl:// Azure Data Lake Storage Gen1 esetén. Ha az Azure Storage esetében engedélyezve van a biztonságos átvitel, az URI a következő lesz wasbs://: . Lásd még: biztonságos átvitel.

  • Szövegszerkesztő vagy Java IDE

    Fontos

    Ha Windows-ügyfélen hozza létre a Python-fájlokat, akkor egy LF-t használó szerkesztőt kell használnia sorvégződésként. Ha nem biztos abban, hogy a szerkesztő LF-t vagy CRLF-t használ-e, a CR-karakter eltávolításának lépéseit a Hibaelhárítás szakaszban találja.

Tesztkörnyezet

A cikkhez használt környezet egy Windows 10 futtató számítógép volt. A parancsok egy parancssorban lettek végrehajtva, és a különböző fájlok a Jegyzettömbben lettek szerkesztve. Ennek megfelelően módosítsa a környezetet.

A parancssorból írja be az alábbi parancsokat egy munkakörnyezet létrehozásához:

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

Java UDF-példa létrehozása

  1. Hozzon létre egy új Maven-projektet a következő paranccsal:

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

    Ez a parancs létrehoz egy nevű exampleudfkönyvtárat, amely tartalmazza a Maven-projektet.

  2. A projekt létrehozása után törölje a exampleudf/src/test projekt részeként létrehozott könyvtárat a következő paranccsal:

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Nyissa meg pom.xml az alábbi parancs beírásával:

    notepad pom.xml
    

    Ezután cserélje le a meglévő <dependencies> bejegyzést a következő XML-fájlra:

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

    Ezek a bejegyzések a HDInsight 3.6 részét képező Hadoop és Hive verzióját határozzák meg. A HDInsight-összetevő verziószámozási dokumentumában megtalálja a Hadoop és a Hive HDInsighttal biztosított verzióival kapcsolatos információkat.

    Adjon hozzá egy szakaszt <build> a </project> fájl végén lévő sor elé. Ennek a szakasznak a következő XML-t kell tartalmaznia:

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

    Ezek a bejegyzések határozzák meg a projekt létrehozásának módját. Pontosabban a Java azon verziója, amelyet a projekt használ, és hogyan lehet uberjart létrehozni a fürtben való üzembe helyezéshez.

    Mentse a fájlt a módosítások után.

  4. Új fájl létrehozásához és megnyitásához írja be az alábbi parancsot ExampleUDF.java:

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

    Ezután másolja és illessze be az alábbi Java-kódot az új fájlba. Ezután zárja be a fájlt.

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

    Ez a kód egy olyan UDF-t implementál, amely elfogad egy sztringértéket, és visszaadja a sztring kisbetűs verzióját.

Az UDF létrehozása és telepítése

Az alábbi parancsokban cserélje le a elemet sshuser a tényleges felhasználónévre, ha eltérő. Cserélje le mycluster a elemet a tényleges fürtnévre.

  1. Fordítsa le és csomagolja be az UDF-et a következő paranccsal:

    mvn compile package
    

    Ez a parancs létrehozza és becsomagolja az UDF-et a exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar fájlba.

  2. scp Az paranccsal másolja a fájlt a HDInsight-fürtbe a következő paranccsal:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Csatlakozzon a fürthöz SSH használatával a következő paranccsal:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. A megnyitott SSH-munkamenetből másolja a jar-fájlt a HDInsight-tárolóba.

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

A Hive UDF-jének használata

  1. Indítsa el a Beeline-ügyfelet az SSH-munkamenetből a következő parancs megadásával:

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

    Ez a parancs feltételezi, hogy a fürt bejelentkezési fiókjához a rendszergazda alapértelmezett beállítását használta.

  2. Ha megérkezik a jdbc:hive2://localhost:10001/> parancssorba, adja meg a következőt az UDF Hive-hoz való hozzáadásához és függvényként való megjelenítéséhez.

    ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar;
    CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
    
  3. Az UDF használatával a táblából lekért értékeket kisbetűs sztringekké alakíthatja.

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

    Ez a lekérdezés kiválasztja a táblából az állapotot, kisbetűssé alakítja a sztringet, majd megjeleníti azokat a módosítatlan névvel együtt. A kimenet az alábbi szöveghez hasonlóan jelenik meg:

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

Hibaelhárítás

A hive-feladat futtatásakor az alábbi szöveghez hasonló hibaüzenet jelenhet meg:

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.

Ezt a problémát a Python-fájl sorvégződései okozhatják. Számos Windows-szerkesztő alapértelmezés szerint a CRLF-et használja sorvégződésként, de a Linux-alkalmazások általában LF-t várnak.

A következő PowerShell-utasításokkal eltávolíthatja a CR-karaktereket, mielőtt feltöltené a fájlt a HDInsightba:

# Set $original_file to the Python file path
$text = [IO.File]::ReadAllText($original_file) -replace "`r`n", "`n"
[IO.File]::WriteAllText($original_file, $text)

Következő lépések

A Hive használatának egyéb módjaiért lásd: Az Apache Hive használata a HDInsighttal.

A Hive User-Defined Functionsről a Hive-wiki Apache Hive-operátorok és User-Defined Functions című szakaszában talál további információt a apache.org.