Partilhar via


Utilizar um UDF java com o Apache Hive no HDInsight

Saiba como criar uma função definida pelo utilizador (UDF) baseada em Java que funcione com o Apache Hive. O UDF de Java neste exemplo converte uma tabela de cadeias de texto em carateres em minúsculas.

Pré-requisitos

  • Um cluster do Hadoop no HDInsight. Consulte Introdução ao HDInsight no Linux.

  • Java Developer Kit (JDK) versão 8

  • O Apache Maven foi instalado corretamente de acordo com o Apache. O Maven é um sistema de compilação de projetos para projetos Java.

  • O esquema de URI para o armazenamento primário dos clusters. Isto seria wasb:// para o Armazenamento do Azure, abfs:// para Azure Data Lake Storage Gen2 ou adl:// para o Azure Data Lake Storage Gen1. Se a transferência segura estiver ativada para o Armazenamento do Azure, o URI será wasbs://. Veja também Transferência segura.

  • Um editor de texto ou IDE Java

    Importante

    Se criar os ficheiros Python num cliente Windows, tem de utilizar um editor que utilize o LF como uma linha que termine. Se não tiver a certeza se o editor utiliza LF ou CRLF, veja a secção Resolução de problemas para obter os passos sobre como remover o caráter CR.

Ambiente de teste

O ambiente utilizado para este artigo era um computador com Windows 10. Os comandos foram executados numa linha de comandos e os vários ficheiros foram editados com o Bloco de Notas. Modifique em conformidade para o seu ambiente.

Numa linha de comandos, introduza os comandos abaixo para criar um ambiente de trabalho:

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

Criar um exemplo de UDF java

  1. Crie um novo projeto maven ao introduzir o seguinte comando:

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

    Este comando cria um diretório com o nome exampleudf, que contém o projeto Maven.

  2. Assim que o projeto tiver sido criado, elimine o exampleudf/src/test diretório que foi criado como parte do projeto ao introduzir o seguinte comando:

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Abra pom.xml ao introduzir o comando abaixo:

    notepad pom.xml
    

    Em seguida, substitua a entrada existente <dependencies> pelo seguinte 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>
    

    Estas entradas especificam a versão do Hadoop e do Hive incluída no HDInsight 3.6. Pode encontrar informações sobre as versões do Hadoop e do Hive fornecidas com o HDInsight a partir do documento de controlo de versões de componentes do HDInsight .

    Adicione uma <build> secção antes da </project> linha no final do ficheiro. Esta secção deve conter o seguinte XML:

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

    Estas entradas definem como criar o projeto. Especificamente, a versão do Java que o projeto utiliza e como criar um uberjar para implementação no cluster.

    Guarde o ficheiro assim que as alterações tiverem sido efetuadas.

  4. Introduza o comando abaixo para criar e abrir um novo ficheiro ExampleUDF.java:

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

    Em seguida, copie e cole o código Java abaixo no novo ficheiro. Em seguida, feche o ficheiro.

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

    Este código implementa um UDF que aceita um valor de cadeia e devolve uma versão minúscula da cadeia.

Criar e instalar o UDF

Nos comandos abaixo, substitua sshuser pelo nome de utilizador real, se diferente. Substitua pelo mycluster nome do cluster real.

  1. Compile e empacote o UDF ao introduzir o seguinte comando:

    mvn compile package
    

    Este comando cria e empacota o UDF no exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar ficheiro.

  2. Utilize o scp comando para copiar o ficheiro para o cluster do HDInsight ao introduzir o seguinte comando:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Ligue-se ao cluster através de SSH ao introduzir o seguinte comando:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. Na sessão SSH aberta, copie o ficheiro jar para o armazenamento do HDInsight.

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

Utilizar a UDF do Hive

  1. Inicie o cliente Beeline a partir da sessão SSH ao introduzir o seguinte comando:

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

    Este comando pressupõe que utilizou a predefinição de administrador para a conta de início de sessão do cluster.

  2. Assim que chegar à jdbc:hive2://localhost:10001/> linha de comandos, introduza o seguinte para adicionar o UDF ao Hive e expô-lo como uma função.

    ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar;
    CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
    
  3. Utilize o UDF para converter valores obtidos de uma tabela em cadeias minúsculas.

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

    Esta consulta seleciona o estado da tabela, converte a cadeia em minúsculas e, em seguida, apresenta-as juntamente com o nome não modificado. O resultado é semelhante ao seguinte texto:

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

Resolução de problemas

Ao executar a tarefa do ramo de registo, poderá deparar-se com um erro semelhante ao seguinte texto:

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.

Este problema pode ser causado pelas terminações de linha no ficheiro Python. Muitos editores do Windows utilizam CRLF como a linha que termina, mas as aplicações linux normalmente esperam LF.

Pode utilizar as seguintes instruções do PowerShell para remover os carateres CR antes de carregar o ficheiro para o 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)

Passos seguintes

Para outras formas de trabalhar com o Hive, veja Utilizar o Apache Hive com o HDInsight.

Para obter mais informações sobre as Funções de User-Defined do Hive, veja a secção Operadores do Apache Hive e Funções de User-Defined do wiki do Hive em apache.org.