Usar funções definidas pelo usuário (UDF) do Python com o Apache Hive e o Apache Pig no HDInsightUse Python User Defined Functions (UDF) with Apache Hive and Apache Pig in HDInsight

Aprenda a usar as funções definidas pelo usuário (UDF) do Python com o Apache Hive e o Apache Pig no Apache Hadoop no Azure HDInsight.Learn how to use Python user-defined functions (UDF) with Apache Hive and Apache Pig in Apache Hadoop on Azure HDInsight.

Python no HDInsightPython on HDInsight

O Python 2.7 é instalado por padrão no HDInsight 3.0 e posteriores.Python2.7 is installed by default on HDInsight 3.0 and later. O Apache Hive pode ser usado com essa versão do Python para processamento de fluxo.Apache Hive can be used with this version of Python for stream processing. O processamento de fluxo usa STDOUT e STDIN para enviar dados entre o Hive e o UDF.Stream processing uses STDOUT and STDIN to pass data between Hive and the UDF.

O HDInsight também inclui o Jython, que é uma implementação do Python gravada em Java.HDInsight also includes Jython, which is a Python implementation written in Java. Jython é executado diretamente na Máquina Virtual Java e não usa streaming.Jython runs directly on the Java Virtual Machine and does not use streaming. Jython é o interpretador do Python recomendado ao usar Python com Pig.Jython is the recommended Python interpreter when using Python with Pig.

Pré-requisitosPrerequisites

Observação

A conta de armazenamento usada neste artigo foi o armazenamento do Azure com a transferência segura habilitada e, portanto, wasbs é usada em todo o artigo.The storage account used in this article was Azure Storage with secure transfer enabled and thus wasbs is used throughout the article.

Configuração de armazenamentoStorage configuration

Nenhuma ação será necessária se a conta de armazenamento usada for do Storage (general purpose v1) tipo StorageV2 (general purpose v2)ou.No action is required if the storage account used is of kind Storage (general purpose v1) or StorageV2 (general purpose v2). O processo neste artigo produzirá a saída para pelo menos /tezstaging.The process in this article will produce output to at least /tezstaging. Uma configuração padrão do Hadoop conterá /tezstaging fs.azure.page.blob.dir na variável de configuração core-site.xml no para HDFSo serviço.A default hadoop configuration will contain /tezstaging in the fs.azure.page.blob.dir configuration variable in core-site.xml for service HDFS. Essa configuração fará com que a saída para o diretório seja blobs de páginas, que não têm suporte para o BlobStoragetipo de conta de armazenamento.This configuration will cause output to the directory to be page blobs, which are not supported for storage account kind BlobStorage. Para usar BlobStorage neste artigo, remova /tezstaging da variável de fs.azure.page.blob.dir configuração.To use BlobStorage for this article, remove /tezstaging from the fs.azure.page.blob.dir configuration variable. A configuração pode ser acessada na interface do usuário do amAmbari.The configuration can be accessed from the Ambari UI. Caso contrário, você receberá a mensagem de erro:Page blob is not supported for this account type.Otherwise, you will receive the error message: Page blob is not supported for this account type.

Aviso

As etapas neste documento fazem as seguintes suposições:The steps in this document make the following assumptions:

  • Você cria scripts Python em seu ambiente de desenvolvimento local.You create the Python scripts on your local development environment.
  • Você carrega os scripts no HDInsight usando o scp comando ou o script do PowerShell fornecido.You upload the scripts to HDInsight using either the scp command or the provided PowerShell script.

Se você quiser usar o Azure cloud Shell (bash) para trabalhar com o HDInsight, deverá:If you want to use the Azure Cloud Shell (bash) to work with HDInsight, then you must:

  • Criar os scripts de dentro do ambiente do Cloud Shell.Create the scripts inside the cloud shell environment.
  • Usar scp para carregar os arquivos do Cloud Shell para o HDInsight.Use scp to upload the files from the cloud shell to HDInsight.
  • Usar ssh do Cloud Shell para conectar-se ao HDInsight e executar os exemplos.Use ssh from the cloud shell to connect to HDInsight and run the examples.

UDF do Apache HiveApache Hive UDF

O Python pode ser utilizado como um UDF do Hive por meio da instrução HiveQL TRANSFORM.Python can be used as a UDF from Hive through the HiveQL TRANSFORM statement. Por exemplo, o seguinte HiveQL invoca o arquivo hiveudf.py armazenado na conta de Armazenamento do Azure padrão para o cluster.For example, the following HiveQL invokes the hiveudf.py file stored in the default Azure Storage account for the cluster.

add file wasbs:///hiveudf.py;

SELECT TRANSFORM (clientid, devicemake, devicemodel)
    USING 'python hiveudf.py' AS
    (clientid string, phoneLabel string, phoneHash string)
FROM hivesampletable
ORDER BY clientid LIMIT 50;

Aqui está o que este exemplo faz:Here's what this example does:

  1. A instrução add file no início do arquivo adiciona o arquivo hiveudf.py ao cache distribuído, portanto, está acessível por todos os nós no cluster.The add file statement at the beginning of the file adds the hiveudf.py file to the distributed cache, so it's accessible by all nodes in the cluster.
  2. A instrução SELECT TRANSFORM ... USING seleciona dados do hivesampletable.The SELECT TRANSFORM ... USING statement selects data from the hivesampletable. Ela também passa os valores clientid, devicemake e devicemodel para o script hiveudf.py.It also passes the clientid, devicemake, and devicemodel values to the hiveudf.py script.
  3. A cláusula AS descreve os campos retornados de hiveudf.py.The AS clause describes the fields returned from hiveudf.py.

Criar arquivoCreate file

Em seu ambiente de desenvolvimento, crie um arquivo de texto chamado hiveudf.py.On your development environment, create a text file named hiveudf.py. Use o código a seguir como o conteúdo do arquivo:Use the following code as the contents of the file:

#!/usr/bin/env python
import sys
import string
import hashlib

while True:
    line = sys.stdin.readline()
    if not line:
        break

    line = string.strip(line, "\n ")
    clientid, devicemake, devicemodel = string.split(line, "\t")
    phone_label = devicemake + ' ' + devicemodel
    print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()])

O script executa as ações a seguir:This script performs the following actions:

  1. Lê uma linha de dados de STDIN.Reads a line of data from STDIN.
  2. O caractere de nova linha é removido usando string.strip(line, "\n ").The trailing newline character is removed using string.strip(line, "\n ").
  3. Ao realizar processamento de fluxo, uma única linha contém todos os valores com um caractere de tabulação entre cada par de valores.When doing stream processing, a single line contains all the values with a tab character between each value. Assim, string.split(line, "\t") pode ser usado para dividir a entrada em cada guia, retornando somente os campos.So string.split(line, "\t") can be used to split the input at each tab, returning just the fields.
  4. Quando o processamento está concluído, a saída precisa ser gravada em STDOUT como uma linha única, com uma tabulação entre cada par de campos.When processing is complete, the output must be written to STDOUT as a single line, with a tab between each field. Por exemplo: print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()]).For example, print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()]).
  5. O loop while é repetido até que nenhum line seja lido.The while loop repeats until no line is read.

A saída do script é uma concatenação dos valores de entrada para devicemake e devicemodel, e um hash do valor concatenado.The script output is a concatenation of the input values for devicemake and devicemodel, and a hash of the concatenated value.

Carregar arquivo (Shell)Upload file (shell)

Nos comandos abaixo, substitua sshuser pelo nome de usuário real, se for diferente.In the commands below, replace sshuser with the actual username if different. Substituir mycluster pelo nome real do cluster.Replace mycluster with the actual cluster name. Verifique se o diretório de trabalho é onde o arquivo está localizado.Ensure your working directory is where the file is located.

  1. Use scp para copiar os arquivos para seu cluster HDInsight.Use scp to copy the files to your HDInsight cluster. Edite e insira o comando a seguir:Edit and enter the command below:

    scp hiveudf.py sshuser@mycluster-ssh.azurehdinsight.net:
    
  2. Use SSH para conectar-se ao cluster.Use SSH to connect to the cluster. Edite e insira o comando a seguir:Edit and enter the command below:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. Na sessão do SSH, adicione os arquivos do Python carregados anteriormente para o armazenamento do cluster.From the SSH session, add the python files uploaded previously to the storage for the cluster.

    hdfs dfs -put hiveudf.py /hiveudf.py
    

Usar UDF do hive (Shell)Use Hive UDF (shell)

  1. Para se conectar ao Hive, use o seguinte comando em sua sessão SSH aberta:To connect to Hive, use the following command from your open SSH session:

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

    Esse comando inicia o cliente Beeline.This command starts the Beeline client.

  2. Insira a seguinte consulta no prompt 0: jdbc:hive2://headnodehost:10001/>:Enter the following query at the 0: jdbc:hive2://headnodehost:10001/> prompt:

    add file wasbs:///hiveudf.py;
    SELECT TRANSFORM (clientid, devicemake, devicemodel)
        USING 'python hiveudf.py' AS
        (clientid string, phoneLabel string, phoneHash string)
    FROM hivesampletable
    ORDER BY clientid LIMIT 50;
    
  3. Depois de inserir a última linha, o trabalho deve ser iniciado.After entering the last line, the job should start. Quando o trabalho for concluído, ele retornará uma saída semelhante ao exemplo a seguir:Once the job completes, it returns output similar to the following example:

     100041    RIM 9650    d476f3687700442549a83fac4560c51c
     100041    RIM 9650    d476f3687700442549a83fac4560c51c
     100042    Apple iPhone 4.2.x    375ad9a0ddc4351536804f1d5d0ea9b9
     100042    Apple iPhone 4.2.x    375ad9a0ddc4351536804f1d5d0ea9b9
     100042    Apple iPhone 4.2.x    375ad9a0ddc4351536804f1d5d0ea9b9
    
  4. Para sair do beeline, digite o seguinte comando:To exit Beeline, enter the following command:

    !q
    

Carregar arquivo (PowerShell)Upload file (PowerShell)

O PowerShell também pode ser usado para executar remotamente consultas do Hive.PowerShell can also be used to remotely run Hive queries. Verifique se o diretório de trabalho hiveudf.py está localizado.Ensure your working directory is where hiveudf.py is located. Use o seguinte script do PowerShell para executar uma consulta de Hive que hiveudf.py usa o script:Use the following PowerShell script to run a Hive query that uses the hiveudf.py script:

# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# Revise file path as needed
$pathToStreamingFile = ".\hiveudf.py"

# Get cluster info
$clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
$clusterInfo = Get-AzHDInsightCluster -ClusterName $clusterName
$resourceGroup = $clusterInfo.ResourceGroup
$storageAccountName=$clusterInfo.DefaultStorageAccount.split('.')[0]
$container=$clusterInfo.DefaultStorageContainer
$storageAccountKey=(Get-AzStorageAccountKey `
   -ResourceGroupName $resourceGroup `
   -Name $storageAccountName)[0].Value

# Create an Azure Storage context
$context = New-AzStorageContext `
    -StorageAccountName $storageAccountName `
    -StorageAccountKey $storageAccountKey

# Upload local files to an Azure Storage blob
Set-AzStorageBlobContent `
    -File $pathToStreamingFile `
    -Blob "hiveudf.py" `
    -Container $container `
    -Context $context

Observação

Para obter mais informações sobre como carregar arquivos, consulte o documento Carregar dados para trabalhos do Apache Hadoop no HDInsight.For more information on uploading files, see the Upload data for Apache Hadoop jobs in HDInsight document.

Usar UDF do hiveUse Hive UDF

# Script should stop on failures
$ErrorActionPreference = "Stop"

# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# Get cluster info
$clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
$creds=Get-Credential -UserName "admin" -Message "Enter the login for the cluster"

$HiveQuery = "add file wasbs:///hiveudf.py;" +
                "SELECT TRANSFORM (clientid, devicemake, devicemodel) " +
                "USING 'python hiveudf.py' AS " +
                "(clientid string, phoneLabel string, phoneHash string) " +
                "FROM hivesampletable " +
                "ORDER BY clientid LIMIT 50;"

# Create Hive job object
$jobDefinition = New-AzHDInsightHiveJobDefinition `
    -Query $HiveQuery

# For status bar updates
$activity="Hive query"

# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting query..."

# Start defined Azure HDInsight job on specified cluster.
$job = Start-AzHDInsightJob `
    -ClusterName $clusterName `
    -JobDefinition $jobDefinition `
    -HttpCredential $creds

# Progress bar (optional)
Write-Progress -Activity $activity -Status "Waiting on query to complete..."

# Wait for completion or failure of specified job
Wait-AzHDInsightJob `
    -JobId $job.JobId `
    -ClusterName $clusterName `
    -HttpCredential $creds

# Uncomment the following to see stderr output
<#
Get-AzHDInsightJobOutput `
   -Clustername $clusterName `
   -JobId $job.JobId `
   -HttpCredential $creds `
   -DisplayOutputType StandardError
#>

# Progress bar (optional)
Write-Progress -Activity $activity -Status "Retrieving output..."

# Gets the log output
Get-AzHDInsightJobOutput `
    -Clustername $clusterName `
    -JobId $job.JobId `
    -HttpCredential $creds

A saída para o trabalho do Hive deve ser semelhante ao exemplo a seguir:The output for the Hive job should appear similar to the following example:

100041    RIM 9650    d476f3687700442549a83fac4560c51c
100041    RIM 9650    d476f3687700442549a83fac4560c51c
100042    Apple iPhone 4.2.x    375ad9a0ddc4351536804f1d5d0ea9b9
100042    Apple iPhone 4.2.x    375ad9a0ddc4351536804f1d5d0ea9b9
100042    Apple iPhone 4.2.x    375ad9a0ddc4351536804f1d5d0ea9b9

UDF do Apache PigApache Pig UDF

Um script Python pode ser utilizado como um UDF do Pig por meio da instrução GENERATE.A Python script can be used as a UDF from Pig through the GENERATE statement. Você pode executar o script usando o Jython ou o Python C.You can run the script using either Jython or C Python.

  • Jython é executado em JVM e pode ser chamado nativamente do Pig.Jython runs on the JVM, and can natively be called from Pig.
  • O Python C é um processo externo para que os dados do Pig no JVM sejam enviados para o script executado em um processo do Python.C Python is an external process, so the data from Pig on the JVM is sent out to the script running in a Python process. A saída do script Python é enviada de volta ao Pig.The output of the Python script is sent back into Pig.

Para especificar o interpretador do Python, use register ao referenciar o script do Python.To specify the Python interpreter, use register when referencing the Python script. Os exemplos a seguir registram os scripts com o Pig como myfuncs:The following examples register scripts with Pig as myfuncs:

  • Para usar o Jython: register '/path/to/pigudf.py' using jython as myfuncs;To use Jython: register '/path/to/pigudf.py' using jython as myfuncs;
  • Para usar o Python C: register '/path/to/pigudf.py' using streaming_python as myfuncs;To use C Python: register '/path/to/pigudf.py' using streaming_python as myfuncs;

Importante

Ao usar Jython, o caminho para o arquivo pig_jython pode ser um caminho local ou um caminho de WASBS://.When using Jython, the path to the pig_jython file can be either a local path or a WASBS:// path. No entanto, ao usar o Python C, você deve fazer referência a um arquivo no sistema de arquivos local do nó que está usando para enviar o trabalho de Pig.However, when using C Python, you must reference a file on the local file system of the node that you are using to submit the Pig job.

Depois do registro, o Pig Latin para o exemplo é o mesmo para ambos:Once past registration, the Pig Latin for this example is the same for both:

LOGS = LOAD 'wasbs:///example/data/sample.log' as (LINE:chararray);
LOG = FILTER LOGS by LINE is not null;
DETAILS = FOREACH LOG GENERATE myfuncs.create_structure(LINE);
DUMP DETAILS;

Aqui está o que este exemplo faz:Here's what this example does:

  1. A primeira linha carrega o arquivo de dados de exemplo, sample.log em LOGS.The first line loads the sample data file, sample.log into LOGS. Também define cada registro como chararray.It also defines each record as a chararray.
  2. A próxima linha filtra e remove quaisquer valores nulos, armazenando o resultado da operação no LOG.The next line filters out any null values, storing the result of the operation into LOG.
  3. Em seguida, itera nos registros em LOG e usa GENERATE para invocar o método create_structure contido no script de Python/Jython carregado como myfuncs.Next, it iterates over the records in LOG and uses GENERATE to invoke the create_structure method contained in the Python/Jython script loaded as myfuncs. LINE é usado para passar o registro atual para a função.LINE is used to pass the current record to the function.
  4. Por fim, as saídas são despejadas em STDOUT usando o comando DUMP.Finally, the outputs are dumped to STDOUT using the DUMP command. Esse comando exibe os resultados após a conclusão da operação.This command displays the results after the operation completes.

Criar arquivoCreate file

Em seu ambiente de desenvolvimento, crie um arquivo de texto chamado pigudf.py.On your development environment, create a text file named pigudf.py. Use o código a seguir como o conteúdo do arquivo:Use the following code as the contents of the file:

# Uncomment the following if using C Python
#from pig_util import outputSchema


@outputSchema("log: {(date:chararray, time:chararray, classname:chararray, level:chararray, detail:chararray)}")
def create_structure(input):
    if (input.startswith('java.lang.Exception')):
        input = input[21:len(input)] + ' - java.lang.Exception'
    date, time, classname, level, detail = input.split(' ', 4)
    return date, time, classname, level, detail

No exemplo Pig Latin, a entrada LINE é definida como uma matriz de caracteres porque não existe um esquema consistente para a entrada.In the Pig Latin example, the LINE input is defined as a chararray because there is no consistent schema for the input. O script Python transforma os dados em um esquema consistente para a saída.The Python script transforms the data into a consistent schema for output.

  1. A instrução @outputSchema define o formato dos dados que são retornados ao Pig.The @outputSchema statement defines the format of the data that is returned to Pig. Nesse caso, é uma mala de dados, que é um tipo de dado do Pig.In this case, it's a data bag, which is a Pig data type. A mala contém os campos a seguir, todos eles sendo matrizes de caracteres (cadeias de caracteres):The bag contains the following fields, all of which are chararray (strings):

    • date - a data em que a entrada de log foi criadadate - the date the log entry was created
    • time - o horário em que a entrada de log foi criadatime - the time the log entry was created
    • classname - o nome da classe para a qual a entrada foi criadaclassname - the class name the entry was created for
    • level - o nível do loglevel - the log level
    • detail - detalhes para a entrada de logdetail - verbose details for the log entry
  2. Em seguida, o def create_structure(input) define a função para a qual o Pig passa itens de linha.Next, the def create_structure(input) defines the function that Pig passes line items to.

  3. Os dados de exemplo, sample.log, estão em conformidade com a data, hora, nome da classe, nível e esquema detalhado.The example data, sample.log, mostly conforms to the date, time, classname, level, and detail schema. No entanto, contêm algumas linhas que começam com *java.lang.Exception*.However, it contains a few lines that begin with *java.lang.Exception*. Essas linhas devem ser modificadas para que correspondam ao esquema.These lines must be modified to match the schema. A instrução if verifica essas linhas e, então, movimenta os dados de entrada para levar a cadeia de caracteres *java.lang.Exception* para o final, colocando os dados em linha com o esquema de saída esperado.The if statement checks for those, then massages the input data to move the *java.lang.Exception* string to the end, bringing the data in-line with the expected output schema.

  4. Em seguida, o comando split é utilizado para dividir os dados nos quatro primeiros caracteres de espaço.Next, the split command is used to split the data at the first four space characters. A saída é atribuída a date, time, classname, level e detail.The output is assigned into date, time, classname, level, and detail.

  5. Por fim, os valores são devolvidos ao Pig.Finally, the values are returned to Pig.

Quando os dados são devolvidos ao Pig, eles têm um esquema consistente conforme definido na instrução @outputSchema.When the data is returned to Pig, it has a consistent schema as defined in the @outputSchema statement.

Carregar arquivo (Shell)Upload file (shell)

Nos comandos abaixo, substitua sshuser pelo nome de usuário real, se for diferente.In the commands below, replace sshuser with the actual username if different. Substituir mycluster pelo nome real do cluster.Replace mycluster with the actual cluster name. Verifique se o diretório de trabalho é onde o arquivo está localizado.Ensure your working directory is where the file is located.

  1. Use scp para copiar os arquivos para seu cluster HDInsight.Use scp to copy the files to your HDInsight cluster. Edite e insira o comando a seguir:Edit and enter the command below:

    scp pigudf.py sshuser@mycluster-ssh.azurehdinsight.net:
    
  2. Use SSH para conectar-se ao cluster.Use SSH to connect to the cluster. Edite e insira o comando a seguir:Edit and enter the command below:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. Na sessão do SSH, adicione os arquivos do Python carregados anteriormente para o armazenamento do cluster.From the SSH session, add the python files uploaded previously to the storage for the cluster.

    hdfs dfs -put pigudf.py /pigudf.py
    

Usar UDF Pig (Shell)Use Pig UDF (shell)

  1. Para se conectar ao Pig, use o seguinte comando em sua sessão SSH aberta:To connect to pig, use the following command from your open SSH session:

    pig
    
  2. No prompt grunt>, insira as seguintes instruções:Enter the following statements at the grunt> prompt:

    Register wasbs:///pigudf.py using jython as myfuncs;
    LOGS = LOAD 'wasb:///example/data/sample.log' as (LINE:chararray);
    LOG = FILTER LOGS by LINE is not null;
    DETAILS = foreach LOG generate myfuncs.create_structure(LINE);
    DUMP DETAILS;
    
  3. Depois de inserir a linha a seguir, o trabalho será iniciado.After entering the following line, the job should start. Quando o trabalho for concluído, ele retornará uma saída semelhante aos dados a seguir:Once the job completes, it returns output similar to the following data:

     ((2012-02-03,20:11:56,SampleClass5,[TRACE],verbose detail for id 990982084))
     ((2012-02-03,20:11:56,SampleClass7,[TRACE],verbose detail for id 1560323914))
     ((2012-02-03,20:11:56,SampleClass8,[DEBUG],detail for id 2083681507))
     ((2012-02-03,20:11:56,SampleClass3,[TRACE],verbose detail for id 1718828806))
     ((2012-02-03,20:11:56,SampleClass3,[INFO],everything normal for id 530537821))
    
  4. Use quit para sair do shell do Grunt e use o seguinte para editar o arquivo pigudf.py no sistema de arquivos local:Use quit to exit the Grunt shell, and then use the following to edit the pigudf.py file on the local file system:

    nano pigudf.py
    
  5. No editor, remova a seguinte linha removendo o caractere # do início da linha:Once in the editor, uncomment the following line by removing the # character from the beginning of the line:

    #from pig_util import outputSchema
    

    Essa linha modifica o script Python para trabalhar com Python C em vez de Jython.This line modifies the Python script to work with C Python instead of Jython. Depois que a alteração for feita, use Ctrl+X para sair do editor.Once the change has been made, use Ctrl+X to exit the editor. Selecione Y e Enter para salvar as alterações.Select Y, and then Enter to save the changes.

  6. Use o comando pig para iniciar o shell novamente.Use the pig command to start the shell again. No prompt grunt> , use o que segue para executar o script de Python usando o interpretador de Python C.Once you are at the grunt> prompt, use the following to run the Python script using the C Python interpreter.

    Register 'pigudf.py' using streaming_python as myfuncs;
    LOGS = LOAD 'wasbs:///example/data/sample.log' as (LINE:chararray);
    LOG = FILTER LOGS by LINE is not null;
    DETAILS = foreach LOG generate myfuncs.create_structure(LINE);
    DUMP DETAILS;
    

    Quando o trabalho for concluído, você verá a mesma saída de quando executou o script usando Jython.Once this job completes, you should see the same output as when you previously ran the script using Jython.

Carregar arquivo (PowerShell)Upload file (PowerShell)

O PowerShell também pode ser usado para executar remotamente consultas do Hive.PowerShell can also be used to remotely run Hive queries. Verifique se o diretório de trabalho pigudf.py está localizado.Ensure your working directory is where pigudf.py is located. Use o seguinte script do PowerShell para executar uma consulta de Hive que pigudf.py usa o script:Use the following PowerShell script to run a Hive query that uses the pigudf.py script:

# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# Revise file path as needed
$pathToJythonFile = ".\pigudf.py"


# Get cluster info
$clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
$clusterInfo = Get-AzHDInsightCluster -ClusterName $clusterName
$resourceGroup = $clusterInfo.ResourceGroup
$storageAccountName=$clusterInfo.DefaultStorageAccount.split('.')[0]
$container=$clusterInfo.DefaultStorageContainer
$storageAccountKey=(Get-AzStorageAccountKey `
   -ResourceGroupName $resourceGroup `
   -Name $storageAccountName)[0].Value

# Create an Azure Storage context
$context = New-AzStorageContext `
    -StorageAccountName $storageAccountName `
    -StorageAccountKey $storageAccountKey

# Upload local files to an Azure Storage blob
Set-AzStorageBlobContent `
    -File $pathToJythonFile `
    -Blob "pigudf.py" `
    -Container $container `
    -Context $context

Usar UDF Pig (PowerShell)Use Pig UDF (PowerShell)

Observação

Ao enviar um trabalho remotamente usando o PowerShell, não é possível usar o Python C como interpretador.When remotely submitting a job using PowerShell, it is not possible to use C Python as the interpreter.

O PowerShell também pode ser usado para executar trabalhos do Pig Latin.PowerShell can also be used to run Pig Latin jobs. Para executar um trabalho Pig Latin que usa o pigudf.py script, use o seguinte script do PowerShell:To run a Pig Latin job that uses the pigudf.py script, use the following PowerShell script:

# Script should stop on failures
$ErrorActionPreference = "Stop"

# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# Get cluster info
$clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
$creds=Get-Credential -UserName "admin" -Message "Enter the login for the cluster"


$PigQuery = "Register wasbs:///pigudf.py using jython as myfuncs;" +
            "LOGS = LOAD 'wasbs:///example/data/sample.log' as (LINE:chararray);" +
            "LOG = FILTER LOGS by LINE is not null;" +
            "DETAILS = foreach LOG generate myfuncs.create_structure(LINE);" +
            "DUMP DETAILS;"

# Create Pig job object
$jobDefinition = New-AzHDInsightPigJobDefinition -Query $PigQuery

# For status bar updates
$activity="Pig job"

# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting job..."

# Start defined Azure HDInsight job on specified cluster.
$job = Start-AzHDInsightJob `
    -ClusterName $clusterName `
    -JobDefinition $jobDefinition `
    -HttpCredential $creds

# Progress bar (optional)
Write-Progress -Activity $activity -Status "Waiting for the Pig job to complete..."

# Wait for completion or failure of specified job
Wait-AzHDInsightJob `
    -Job $job.JobId `
    -ClusterName $clusterName `
    -HttpCredential $creds

# Uncomment the following to see stderr output
<#
Get-AzHDInsightJobOutput `
    -Clustername $clusterName `
    -JobId $job.JobId `
    -HttpCredential $creds `
    -DisplayOutputType StandardError
#>

# Progress bar (optional)
Write-Progress -Activity $activity "Retrieving output..."

# Gets the log output
Get-AzHDInsightJobOutput `
    -Clustername $clusterName `
    -JobId $job.JobId `
    -HttpCredential $creds

A saída para o trabalho Pig deve ser parecida com os seguintes dados:The output for the Pig job should appear similar to the following data:

((2012-02-03,20:11:56,SampleClass5,[TRACE],verbose detail for id 990982084))
((2012-02-03,20:11:56,SampleClass7,[TRACE],verbose detail for id 1560323914))
((2012-02-03,20:11:56,SampleClass8,[DEBUG],detail for id 2083681507))
((2012-02-03,20:11:56,SampleClass3,[TRACE],verbose detail for id 1718828806))
((2012-02-03,20:11:56,SampleClass3,[INFO],everything normal for id 530537821))

Solucionar problemasTroubleshooting

Erros durante a execução de trabalhosErrors when running jobs

Ao executar o trabalho do hive, você poderá encontrar um erro semelhante ao texto a seguir:When running the hive job, you may encounter an error similar to the following text:

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 do Python.This problem may be caused by the line endings in the Python file. Muitos editores Windows usam CRLF como padrão como a terminação de linha, mas aplicativos Linux geralmente esperam LF.Many Windows editors default to using CRLF as the line ending, but Linux applications usually expect LF.

Você pode seguir as seguintes instruções do PowerShell para remover os caracteres CR antes de carregar o arquivo no HDInsight:You can use the following PowerShell statements to remove the CR characters before uploading the file to HDInsight:

Write-Progress -Activity $activity -Status "Waiting for the Pig job to complete..."

# Wait for completion or failure of specified job

Scripts do PowerShellPowerShell scripts

Ambos os scripts de exemplo do PowerShell usados para executar os exemplos contêm uma linha comentada que exibe a saída de erro do trabalho.Both of the example PowerShell scripts used to run the examples contain a commented line that displays error output for the job. Se você não estiver vendo a saída esperada para o trabalho, remova o comentário da linha a seguir e veja se as informações de erro indicam um problema.If you are not seeing the expected output for the job, uncomment the following line and see if the error information indicates a problem.

$activity="Pig job"

# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting job..."

As informações de erro (STDERR) e o resultado do trabalho (STDOUT) também são registrados em seu armazenamento do HDInsight.The error information (STDERR) and the result of the job (STDOUT) are also logged to your HDInsight storage.

Para este trabalho…For this job... Veja estes arquivos no contêiner blobLook at these files in the blob container
HiveHive /HivePython/stderr/HivePython/stderr

/HivePython/stdout/HivePython/stdout

PigPig /PigPython/stderr/PigPython/stderr

/PigPython/stdout/PigPython/stdout

Próximas etapasNext steps

Se você precisar carregar módulos do Python que não são fornecidos por padrão, consulte Como implantar um módulo para o HDInsight do Azure.If you need to load Python modules that aren't provided by default, see How to deploy a module to Azure HDInsight.

Para obter outras formas de usar o Pig e o Hive e para saber como usar o MapReduce, consulte os documentos a seguir:For other ways to use Pig, Hive, and to learn about using MapReduce, see the following documents: