Usar funções definidas pelo usuário em C# com o Apache Hive e o Apache Pig no Apache Hadoop no HDInsight

Saiba como usar funções definidas pelo usuário (UDF) em C# com o Apache Hive e o Apache Pig no HDInsight.

Importante

As etapas neste documento funcionam com clusters HDInsight baseados em Linux. O Linux é o único sistema operativo utilizado na versão 3.4 ou superior do HDInsight. Para obter mais informações, consulte Controle de versão do componente HDInsight.

Tanto o Hive quanto o Pig podem passar dados para aplicativos externos para processamento. Este processo é conhecido como streaming. Ao usar um aplicativo .NET, os dados são passados para o aplicativo em STDIN e o aplicativo retorna os resultados em STDOUT. Para ler e escrever a partir de STDIN e STDOUT, você pode usar Console.ReadLine() e Console.WriteLine() a partir de um aplicativo de console.

Pré-requisitos

  • Uma familiaridade com a escrita e criação de código C# destinado ao .NET Framework 4.5.

    Use o IDE que quiser. Recomendamos Visual Studio ou Visual Studio Code. As etapas neste documento usam o Visual Studio 2019.

  • Uma maneira de carregar arquivos .exe para o cluster e executar trabalhos do Pig e do Hive. Recomendamos as Ferramentas Data Lake para Visual Studio, Azure PowerShell e CLI do Azure. As etapas neste documento usam as Ferramentas Data Lake para Visual Studio para carregar os arquivos e executar a consulta Hive de exemplo.

    Para obter informações sobre outras maneiras de executar consultas do Hive, consulte O que é o Apache Hive e o HiveQL no Azure HDInsight?.

  • Um cluster Hadoop no HDInsight. Para obter mais informações sobre como criar um cluster, consulte Criar clusters HDInsight.

.NET no HDInsight

Os clusters HDInsight baseados em Linux usam Mono (https://mono-project.com) para executar aplicativos .NET. O Mono versão 4.2.1 está incluído no HDInsight versão 3.6.

Para obter mais informações sobre a compatibilidade do Mono com versões do .NET Framework, consulte Compatibilidade do Mono.

Para obter mais informações sobre a versão do .NET Framework e do Mono incluída nas versões do HDInsight, consulte Versões do componente HDInsight.

Criar os projetos C#

As seções a seguir descrevem como criar um projeto C# no Visual Studio para um Apache Hive UDF e um Apache Pig UDF.

Apache Hive UDF

Para criar um projeto C# para um Apache Hive UDF:

  1. Inicie o Visual Studio.

  2. Selecione Criar um novo projeto.

  3. Na janela Criar um novo projeto, escolha o modelo Aplicativo de Console (.NET Framework) (a versão C#). Em seguida, selecione Seguinte.

  4. Na janela Configurar seu novo projeto, insira um nome de projeto do HiveCSharp e navegue até ou crie um local para salvar o novo projeto. Depois, selecione Criar.

  5. No IDE do Visual Studio, substitua o conteúdo do Program.cs com o seguinte código:

    using System;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace HiveCSharp
    {
        class Program
        {
            static void Main(string[] args)
            {
                string line;
                // Read stdin in a loop
                while ((line = Console.ReadLine()) != null)
                {
                    // Parse the string, trimming line feeds
                    // and splitting fields at tabs
                    line = line.TrimEnd('\n');
                    string[] field = line.Split('\t');
                    string phoneLabel = field[1] + ' ' + field[2];
                    // Emit new data to stdout, delimited by tabs
                    Console.WriteLine("{0}\t{1}\t{2}", field[0], phoneLabel, GetMD5Hash(phoneLabel));
                }
            }
            /// <summary>
            /// Returns an MD5 hash for the given string
            /// </summary>
            /// <param name="input">string value</param>
            /// <returns>an MD5 hash</returns>
            static string GetMD5Hash(string input)
            {
                // Step 1, calculate MD5 hash from input
                MD5 md5 = System.Security.Cryptography.MD5.Create();
                byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
                byte[] hash = md5.ComputeHash(inputBytes);
    
                // Step 2, convert byte array to hex string
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < hash.Length; i++)
                {
                    sb.Append(hash[i].ToString("x2"));
                }
                return sb.ToString();
            }
        }
    }
    
  6. Na barra de menus, selecione Build>Build Solution para criar o projeto.

  7. Feche a solução.

Apache Porco UDF

Para criar um projeto C# para um Apache Hive UDF:

  1. Abra o Visual Studio.

  2. Na janela Iniciar, selecione Criar um novo projeto.

  3. Na janela Criar um novo projeto, escolha o modelo Aplicativo de Console (.NET Framework) (a versão C#). Em seguida, selecione Seguinte.

  4. Na janela Configurar seu novo projeto, insira um nome de projeto de PigUDF e vá para ou crie um local para salvar o novo projeto. Depois, selecione Criar.

  5. No IDE do Visual Studio, substitua o conteúdo do Program.cs com o seguinte código:

    using System;
    
    namespace PigUDF
    {
        class Program
        {
            static void Main(string[] args)
            {
                string line;
                // Read stdin in a loop
                while ((line = Console.ReadLine()) != null)
                {
                    // Fix formatting on lines that begin with an exception
                    if(line.StartsWith("java.lang.Exception"))
                    {
                        // Trim the error info off the beginning and add a note to the end of the line
                        line = line.Remove(0, 21) + " - java.lang.Exception";
                    }
                    // Split the fields apart at tab characters
                    string[] field = line.Split('\t');
                    // Put fields back together for writing
                    Console.WriteLine(String.Join("\t",field));
                }
            }
        }
    }
    

    Esse código analisa as linhas enviadas do Pig e reformata as linhas que começam com java.lang.Exception.

  6. Na barra de menus, escolha Build>Build Solution para criar o projeto.

  7. Deixe a solução aberta.

Carregar para o armazenamento

Em seguida, carregue os aplicativos UDF Hive e Pig para armazenamento em um cluster HDInsight.

  1. No Visual Studio, navegue até Exibir Gerenciador de>Servidores.

  2. No Gerenciador de Servidores, clique com o botão direito do mouse em Azure, selecione Conectar à Assinatura do Microsoft Azure e conclua o processo de entrada.

  3. Expanda o cluster HDInsight no qual você deseja implantar este aplicativo. Uma entrada com o texto (Conta de armazenamento padrão) é listada.

    Default storage account, HDInsight cluster, Server Explorer.

    • Se essa entrada puder ser expandida, você estará usando uma Conta de Armazenamento do Azure como armazenamento padrão para o cluster. Para exibir os arquivos no armazenamento padrão para o cluster, expanda a entrada e clique duas vezes no (Contêiner padrão).

    • Se essa entrada não puder ser expandida, você estará usando o Armazenamento do Azure Data Lake como o armazenamento padrão para o cluster. Para exibir os arquivos no armazenamento padrão do cluster, clique duas vezes na entrada (Conta de armazenamento padrão).

  4. Para carregar os arquivos .exe, use um dos seguintes métodos:

    • Se você estiver usando uma Conta de Armazenamento do Azure, selecione o ícone Carregar Blob.

      HDInsight upload icon for new project.

      Na caixa de diálogo Carregar Novo Arquivo, em Nome do arquivo, selecione Procurar. Na caixa de diálogo Carregar Blob, vá para a pasta bin\debug do projeto HiveCSharp e escolha o arquivo HiveCSharp.exe. Finalmente, selecione Abrir e, em seguida , OK para concluir o upload.

    • Se estiver a utilizar o Armazenamento Azure Data Lake, clique com o botão direito do rato numa área vazia na listagem de ficheiros e, em seguida, selecione Carregar. Finalmente, escolha o arquivo HiveCSharp.exe e selecione Abrir.

    Quando o HiveCSharp.exe upload terminar, repita o processo de upload para o arquivo PigUDF.exe .

Executar uma consulta do Apache Hive

Agora você pode executar uma consulta do Hive que usa seu aplicativo UDF do Hive.

  1. No Visual Studio, navegue até Exibir Gerenciador de>Servidores.

  2. Expanda Azure e, em seguida, expanda HDInsight.

  3. Clique com o botão direito do mouse no cluster no qual você implantou o aplicativo HiveCSharp e selecione Gravar uma consulta do Hive.

  4. Use o seguinte texto para a consulta do Hive:

    -- Uncomment the following if you are using Azure Storage
    -- add file wasbs:///HiveCSharp.exe;
    -- Uncomment the following if you are using Azure Data Lake Storage Gen1
    -- add file adl:///HiveCSharp.exe;
    -- Uncomment the following if you are using Azure Data Lake Storage Gen2
    -- add file abfs:///HiveCSharp.exe;
    
    SELECT TRANSFORM (clientid, devicemake, devicemodel)
    USING 'HiveCSharp.exe' AS
    (clientid string, phoneLabel string, phoneHash string)
    FROM hivesampletable
    ORDER BY clientid LIMIT 50;
    

    Importante

    Descomente a add file instrução que corresponde ao tipo de armazenamento padrão usado para o cluster.

    Esta consulta seleciona os clientidcampos , devicemakee de , e devicemodel , em hivesampletableseguida, passa os campos para o aplicativo HiveCSharp.exe . A consulta espera que o aplicativo retorne três campos, que são armazenados como clientid, phoneLabele phoneHash. A consulta também espera encontrar HiveCSharp.exe na raiz do contêiner de armazenamento padrão.

  5. Alterne o padrão Interativo para Lote e selecione Enviar para enviar o trabalho ao cluster HDInsight. A janela Resumo do trabalho do Hive é aberta.

  6. Selecione Atualizar para atualizar o resumo até que o Status do Trabalho mude para Concluído. Para exibir a saída do trabalho, selecione Saída do trabalho.

Executar um trabalho do Apache Pig

Você também pode executar um trabalho Pig que usa seu aplicativo Pig UDF.

  1. Use SSH para se conectar ao cluster HDInsight. (Por exemplo, execute o comando ssh sshuser@<clustername>-ssh.azurehdinsight.net.) Para obter mais informações, consulte Usar SSH com o HDInsight.

  2. Use o seguinte comando para iniciar a linha de comando do Pig:

    pig
    

    Um grunt> prompt é exibido.

  3. Digite o seguinte para executar um trabalho Pig que usa o aplicativo .NET Framework:

    DEFINE streamer `PigUDF.exe` CACHE('/PigUDF.exe');
    LOGS = LOAD '/example/data/sample.log' as (LINE:chararray);
    LOG = FILTER LOGS by LINE is not null;
    DETAILS = STREAM LOG through streamer as (col1, col2, col3, col4, col5);
    DUMP DETAILS;
    

    A DEFINE instrução cria um alias de streamer para o aplicativo PigUDF.exe e CACHE o carrega do armazenamento padrão para o cluster. Mais tarde, streamer é usado com o STREAM operador para processar as linhas únicas contidas e LOG retornar os dados como uma série de colunas.

    Nota

    O nome do aplicativo usado para streaming deve ser cercado ` pelo caractere (backtick) quando aliado e pelo caractere (aspas ' simples) quando usado com SHIP.

  4. Depois de entrar na última linha, o trabalho deve começar. Ele retorna uma saída semelhante ao seguinte texto:

    (2019-07-15 16:43:25 SampleClass5 [WARN] problem finding id 1358451042 - java.lang.Exception)
    (2019-07-15 16:43:25 SampleClass5 [DEBUG] detail for id 1976092771)
    (2019-07-15 16:43:25 SampleClass5 [TRACE] verbose detail for id 1317358561)
    (2019-07-15 16:43:25 SampleClass5 [TRACE] verbose detail for id 1737534798)
    (2019-07-15 16:43:25 SampleClass7 [DEBUG] detail for id 1475865947)
    
  5. Use exit para sair do porco.

Próximos passos

Neste documento, você aprendeu como usar um aplicativo .NET Framework do Hive e do Pig no HDInsight. Se você quiser aprender a usar Python com Hive e Pig, consulte Usar Python com Apache Hive e Apache Pig no HDInsight.

Para obter outras maneiras de usar o Hive e aprender a usar o MapReduce, consulte os seguintes artigos: