Java UDF használata az Apache Hive-lel a HDInsightban
Megtudhatja, hogyan hozhat létre egy Java-alapú, felhasználó által definiált függvényt (UDF), amely az Apache Hive-lel működik. Ebben a példában a Java UDF teljes kisbetűs karakterekké konvertálja a szöveges sztringeket tartalmazó táblázatot.
Előfeltételek
Hadoop-fürt a HDInsighton. Tekintse meg a HDInsight linuxos használatának első lépéseit.
Az Apache Maven megfelelően van telepítve az Apache szerint. A Maven egy Java-projektek projektépítési rendszere.
A fürtök elsődleges tárolójának URI-sémája . Ez wasb:// lenne az Azure Storage-hoz,
abfs://
az Azure Data Lake Storage Gen2-hez vagy adl:// az Azure Data Lake Storage Gen1-hez. Ha engedélyezve van a biztonságos átvitel az Azure Storage-ban, az URI leszwasbs://
. 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-et használó szerkesztőt kell használnia sorvégződésként. Ha nem biztos abban, hogy a szerkesztő LF vagy CRLF függvényt 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 rendszerű számítógép volt. A parancsok parancssorban lettek végrehajtva, és a különböző fájlokat a Jegyzettömbben szerkesztették. 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
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 könyvtárat
exampleudf
, amely tartalmazza a Maven-projektet.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ő parancs beírásával:cd ExampleUDF rmdir /S /Q "src/test"
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-os verziójának Hadoop és Hive verzióját határozzák meg. A HDInsight-összetevő verziószámozási dokumentumából a Hadoop és a Hive HDInsight által biztosított verzióival kapcsolatos információk találhatók.
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óját, amelyet a projekt használ, és hogyan hozhat létre uberjar-t a fürtben való üzembe helyezéshez.
Mentse a fájlt a módosítások után.
Új fájl
ExampleUDF.java
létrehozásához és megnyitásához írja be az alábbi parancsot: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 elfogadja a sztring értékét, é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 sshuser
a tényleges felhasználónevet, ha eltér. Cserélje le mycluster
a tényleges fürtnévre.
Fordítsa le és csomagolja be az UDF-et a következő paranccsal:
mvn compile package
Ez a parancs létrehozza és csomagolja az UDF-et a
exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar
fájlba.scp
A parancs használatával 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:
Csatlakozzon a fürthöz az SSH használatával a következő parancs megadásával:
ssh sshuser@mycluster-ssh.azurehdinsight.net
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
Az UDF használata a Hive-ből
Indítsa el a Beeline-ügyfelet az SSH-munkamenetből a következő paranccsal:
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.
Miután megérkezik a
jdbc:hive2://localhost:10001/>
kérdéshez, adja meg a következőket, hogy hozzáadja az UDF-et a Hive-hez, és közzétehesse függvényként.ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar; CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
A 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 az állapotot a táblából, a sztringet kisbetűssé alakítja, majd megjeleníti őket a nem módosított 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. Sok 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ások használatával 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: Az Apache Hive használata a HDInsighttal.
A Hive felhasználó által definiált függvényeivel kapcsolatos további információkért lásd a Hive wiki Apache Hive-operátorok és felhasználó által definiált függvények szakaszát a apache.org.