Aracılığıyla paylaş


HDInsight'ta Apache Hive ile Java UDF kullanma

Apache Hive ile çalışan Java tabanlı kullanıcı tanımlı işlev (UDF) oluşturmayı öğrenin. Bu örnekteki Java UDF, metin dizeleri tablosunu tamamen küçük harf karakterlere dönüştürür.

Önkoşullar

  • HDInsight üzerinde bir Hadoop kümesi. Bkz. Linux üzerinde HDInsight kullanmaya başlama.

  • Java Developer Kit (JDK) sürüm 8

  • Apache Maven, Apache'ye göre düzgün bir şekilde yüklendi . Maven, Java projeleri için bir proje derleme sistemidir.

  • Kümelerinizin birincil depolama alanı için URI şeması . Bu, Azure Depolama için wasb://, Azure Data Lake Storage 2. Nesil için abfs:// veya Azure Data Lake Storage 1. Nesil için adl:// olacaktır. Azure Depolama için güvenli aktarım etkinleştirildiyse, URI olacaktır wasbs://. Ayrıca bkz. güvenli aktarım.

  • Metin düzenleyicisi veya Java IDE

    Önemli

    Python dosyalarını bir Windows istemcisinde oluşturursanız, satır sonu olarak LF kullanan bir düzenleyici kullanmanız gerekir. Düzenleyicinizin LF veya CRLF kullanıp kullanmadığından emin değilseniz CR karakterini kaldırma adımları için Sorun Giderme bölümüne bakın.

Test ortamı

Bu makale için kullanılan ortam, Windows 10 çalıştıran bir bilgisayardı. Komutlar bir komut isteminde yürütüldü ve çeşitli dosyalar Not Defteri ile düzenlendi. Ortamınız için uygun şekilde değiştirin.

Bir komut isteminden aşağıdaki komutları girerek bir çalışma ortamı oluşturun:

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

Örnek java UDF oluşturma

  1. Aşağıdaki komutu girerek yeni bir Maven projesi oluşturun:

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

    Bu komut, Maven projesini içeren adlı exampleudfbir dizin oluşturur.

  2. Proje oluşturulduktan sonra, aşağıdaki komutu girerek projenin bir parçası olarak oluşturulan dizini silin exampleudf/src/test :

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Aşağıdaki komutu girerek açın pom.xml :

    notepad pom.xml
    

    Ardından var olan <dependencies> girdiyi aşağıdaki XML ile değiştirin:

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

    Bu girdiler, HDInsight 3.6'ya dahil edilen Hadoop ve Hive sürümünü belirtir. HDInsight bileşeni sürüm oluşturma belgesinde HDInsight ile sağlanan Hadoop ve Hive sürümleri hakkında bilgi bulabilirsiniz.

    Dosyanın sonundaki satırın </project> önüne bir <build> bölüm ekleyin. Bu bölüm aşağıdaki XML'yi içermelidir:

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

    Bu girdiler projenin nasıl derılacağını tanımlar. Özellikle, projenin kullandığı Java sürümü ve kümeye dağıtım için bir uberjar oluşturma.

    Değişiklikler yapıldıktan sonra dosyayı kaydedin.

  4. Yeni bir dosya ExampleUDF.javaoluşturmak ve açmak için aşağıdaki komutu girin:

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

    Ardından aşağıdaki Java kodunu kopyalayıp yeni dosyaya yapıştırın. Ardından dosyayı kapatın.

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

    Bu kod, bir dize değeri kabul eden ve dizenin küçük harfli bir sürümünü döndüren bir UDF uygular.

UDF'yi derleme ve yükleme

Aşağıdaki komutlarda değerini farklıysa gerçek kullanıcı adıyla değiştirin sshuser . değerini gerçek küme adıyla değiştirin mycluster .

  1. Aşağıdaki komutu girerek UDF'yi derleyin ve paketleyin:

    mvn compile package
    

    Bu komut UDF'yi oluşturur ve dosyaya exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar paketler.

  2. scp Aşağıdaki komutu girerek dosyayı HDInsight kümesine kopyalamak için komutunu kullanın:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Aşağıdaki komutu girerek SSH kullanarak kümeye bağlanın:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. Açık SSH oturumundan jar dosyasını HDInsight depolama alanına kopyalayın.

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

Hive'dan UDF kullanma

  1. Aşağıdaki komutu girerek Beeline istemcisini SSH oturumundan başlatın:

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

    Bu komut, kümenizin oturum açma hesabı için varsayılan yöneticiyi kullandığınızı varsayar.

  2. İstemi aldıktan sonra, UDF'yi jdbc:hive2://localhost:10001/> Hive'a eklemek ve bir işlev olarak kullanıma açmak için aşağıdakileri girin.

    ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar;
    CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
    
  3. Tablodan alınan değerleri küçük harf dizelerine dönüştürmek için UDF'yi kullanın.

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

    Bu sorgu tablodan durumu seçer, dizeyi küçük harfe dönüştürür ve değiştirilmemiş adla birlikte görüntüler. Çıktı aşağıdaki metne benzer şekilde görünür:

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

Sorun giderme

Hive işini çalıştırırken aşağıdaki metne benzer bir hatayla karşılaşabilirsiniz:

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.

Bu sorun Python dosyasındaki satır sonlarından kaynaklanıyor olabilir. Birçok Windows düzenleyicisi satır sonu olarak CRLF'yi varsayılan olarak kullanır, ancak Linux uygulamaları genellikle LF bekler.

Dosyayı HDInsight'a yüklemeden önce CR karakterlerini kaldırmak için aşağıdaki PowerShell deyimlerini kullanabilirsiniz:

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

Sonraki adımlar

Hive ile çalışmanın diğer yolları için bkz. HDInsight ile Apache Hive kullanma.

Hive User-Defined İşlevleri hakkında daha fazla bilgi için apache.org'daki Hive wiki'sinin Apache Hive İşleçleri ve User-Defined İşlevleri bölümüne bakın.