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.
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
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.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"
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.
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.
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.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:
Conecte-se ao cluster usando SSH digitando o seguinte comando:
ssh sshuser@mycluster-ssh.azurehdinsight.net
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
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.
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';
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.