Partilhar via


Usar um Java UDF com Apache Hive no HDInsight

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

Pré-requisitos

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

  • Java Developer Kit (JDK) versão 8

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

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

  • Um editor de texto ou Java IDE

    Importante

    Se você criar os arquivos Python em um cliente Windows, você deve usar um editor que usa LF como uma terminação de linha. Se você não tiver certeza se seu editor usa LF ou CRLF, consulte a seção Solução de problemas para obter etapas sobre como remover o caractere CR.

Ambiente de teste

O ambiente usado para este artigo foi um computador executando o Windows 10. Os comandos foram executados em um prompt de comando, e os vários arquivos foram editados com o bloco de notas. Modifique de acordo com o seu ambiente.

Em um prompt de comando, digite os comandos abaixo para criar um ambiente de trabalho:

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

Criar um exemplo de Java UDF

  1. Crie um novo projeto Maven inserindo o seguinte comando:

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

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

  2. Depois que o projeto tiver sido criado, exclua o exampleudf/src/test diretório que foi criado como parte do projeto inserindo o seguinte comando:

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Abra pom.xml digitando 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>
    

    Essas entradas especificam a versão do Hadoop e do Hive incluída no HDInsight 3.6. Você pode encontrar informações sobre as versões do Hadoop e do Hive fornecidas com o HDInsight no documento de controle de versão do componente HDInsight.

    Adicione uma <build> seção antes da </project> linha no final do arquivo. Esta seçã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>
    

    Essas entradas definem como construir o projeto. Especificamente, a versão do Java que o projeto usa e como construir um uberjar para implementação no cluster.

    Salve o arquivo depois que as alterações forem feitas.

  4. Digite o comando abaixo para criar e abrir um novo arquivo ExampleUDF.java:

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

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

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

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

Compilar e instalar o UDF

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

  1. Compile e empacote o UDF digitando o seguinte comando:

    mvn compile package
    

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

  2. Use o scp comando para copiar o arquivo para o cluster HDInsight inserindo o seguinte comando:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Conecte-se ao cluster usando SSH digitando o seguinte comando:

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

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

Use o UDF do Hive

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

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

    Este comando pressupõe que você usou o padrão de admin para a conta de login do cluster.

  2. Quando chegar ao jdbc:hive2://localhost:10001/> prompt, digite 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. Use o UDF para converter valores recuperados de uma tabela em cadeias de caracteres minúsculas.

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

    Essa consulta seleciona o estado da tabela, converte a cadeia de caracteres em minúsculas e as exibe junto com o nome não modificado. A saída é 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 o trabalho de hive, você pode se deparar 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.

Esse problema pode ser causado pelas terminações de linha no arquivo Python. Muitos editores do Windows usam CRLF como terminação de linha, mas os aplicativos Linux geralmente esperam LF.

Você pode usar as seguintes instruções do PowerShell para remover os caracteres CR antes de carregar o arquivo no 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)

Próximos passos

Para obter outras maneiras de trabalhar com o Hive, consulte Usar o Apache Hive com o HDInsight.

Para obter mais informações sobre as funções definidas pelo usuário do Hive, consulte a seção Operadores do Apache Hive e funções definidas pelo usuário do wiki do Hive em apache.org.