Menggunakan Java UDF dengan Apache Hive di HDInsight

Pelajari cara membuat fungsi yang ditentukan pengguna (UDF) berbasis Java yang bekerja dengan Apache Hive. Java UDF dalam contoh ini mengonversi tabel untai (karakter) teks menjadi karakter semua-huruf kecil.

Prasyarat

  • Klaster Hadoop pada HDInsight. Lihat Mulai menggunakan HDInsight di Linux.

  • Java Developer Kit (JDK) versi 8

  • Apache Maven dengan benar dipasang menurut Apache. Maven merupakan sistem build proyek untuk proyek Java.

  • Skema URI untuk penyimpanan utama kluster Anda. Ini akan menjadi wasb:// untuk Azure Storage, abfs:// untuk Azure Data Lake Storage Gen2 atau adl:// untuk Azure Data Lake Storage Gen1. Jika transfer aman diaktifkan untuk Azure Storage, URI akan menjadi wasbs://. Lihat juga, transfer aman.

  • Editor teks atau Java IDE

    Penting

    Jika Anda membuat file Python pada klien Windows, Anda harus menggunakan editor yang menggunakan LF sebagai akhir baris. Jika Anda tidak yakin apakah editor Anda menggunakan LF atau CRLF, lihat bagian Pemecahan Masalah untuk langkah-langkah menghapus karakter CR.

Lingkungan Uji

Lingkungan yang digunakan dalam artikel ini adalah komputer yang menjalankan Windows 10. Perintah dijalankan dalam perintah dan berbagai file diedit dengan Notepad. Mengubah sesuai lingkungan Anda.

Dari perintah, masukkan perintah berikut untuk membuat lingkungan kerja:

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

Membuat contoh Java UDF

  1. Buat proyek Maven baru dengan memasukkan perintah berikut:

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

    Perintah ini membuat direktori bernama exampleudf, yang berisi proyek Maven.

  2. Setelah proyek dibuat, hapus direktori exampleudf/src/test yang dibuat sebagai bagian dari proyek dengan memasukkan perintah berikut:

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Buka pom.xml dengan memasukkan perintah berikut:

    notepad pom.xml
    

    Lalu ganti entri yang sudah ada <dependencies> dengan XML berikut:

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

    Entri ini menentukan versi Hadoop dan Hive yang disertakan dengan HDInsight 3.6. Anda dapat menemukan informasi tentang versi Hadoop dan Hive yang disediakan dengan HDInsight dari dokumen penerapan versi komponen HDInsight.

    Tambahkan bagian <build> sebelum baris </project> di akhir file. Bagian ini harus berisi XML berikut:

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

    Entri ini menentukan cara menyusun proyek. Secara khusus, versi Java yang digunakan proyek dan cara membangun uberjar untuk penyebaran ke kluster.

    Simpan file setelah perubahan dilakukan.

  4. Masukkan perintah di bawah untuk membuat dan membuka file baru ExampleUDF.java:

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

    Kemudian salin dan tempel kode Java di bawah ini ke file baru. Lalu tutup file.

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

    Kode ini mengimplementasikan UDF yang menerima nilai untai (karakter), dan mengembalikan versi untai (karakter) huruf kecil.

Membangun dan memasang UDF

Dalam perintah di bawah ini, ganti sshuser dengan nama pengguna yang sebenarnya jika berbeda. Ganti mycluster dengan nama kluster Anda yang sebenarnya.

  1. Kompilasi dan ke paket UDF dengan memasukkan perintah berikut:

    mvn compile package
    

    Perintah ini membangun dan mengemas UDF ke dalam file exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar.

  2. Gunakan perintah scp untuk menyalin file ke kluster HDInsight dengan memasukkan perintah berikut:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Buka koneksi SSH ke kluster, dengan memasukkan perintah berikut:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. Dari sesi SSH terbuka, salin file jar ke penyimpanan HDInsight.

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

Gunakan UDF dari Apache Hive

  1. Mulai klien Beeline dari sesi SSH dengan memasukkan perintah berikut:

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

    Perintah ini mengasumsikan bahwa Anda menggunakan default admin untuk akun login kluster Anda.

  2. Setelah Anda tiba di prompt jdbc:hive2://localhost:10001/>, masukkan yang berikut untuk menambahkan UDF ke Apache Hive dan mengeksposnya sebagai fungsi.

    ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar;
    CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
    
  3. Gunakan UDF untuk mengonversi nilai yang diambil dari tabel ke untai (karakter) huruf kecil.

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

    Kueri ini memilih status dari tabel, mengonversi untai (karakter) menjadi huruf kecil, lalu menampilkannya bersama dengan nama yang tidak dimodifikasi. Output yang dihasilkan mirip dengan teks berikut:

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

Pemecahan Masalah

Saat menjalankan pekerjaan hive, Anda mungkin menemukan kesalahan yang mirip dengan teks berikut:

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.

Masalah ini mungkin disebabkan oleh akhir baris dalam file Python. Banyak editor Windows default untuk menggunakan CRLF sebagai akhir baris, tetapi aplikasi Linux biasanya mengharapkan LF.

Anda bisa menggunakan pernyataan PowerShell berikut untuk menghapus karakter CR sebelum mengunggah file ke 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)

Langkah berikutnya

Untuk cara lain untuk bekerja dengan Hive, lihat Menggunakan Apache Hive dengan HDInsight.

Untuk informasi lebih lanjut tentang Hive User-Defined Functions, lihat bagian Apache Hive Operator dan User-Defined Functions dari wiki Hive di apache.org.