Usare le funzioni definite dall'utente C# con lo streaming Hive e Pig in Hadoop in HDInsight

Informazioni su come usare le funzioni definite dall'utente C# con Apache Hive e Pig in HDInsight.

Importante

I passaggi descritti in questo documento funzionano con i cluster HDInsight basati su Linux e su Windows. Linux è l'unico sistema operativo usato in HDInsight versione 3.4 o successiva. Per altre informazioni, vedere Componenti e versioni di Hadoop disponibili in HDInsight.

Sia Hive sia Pig sono in grado di passare i dati alle applicazioni esterne per l'elaborazione. Questo processo è noto come streaming. Quando si usa un'applicazione .NET, i dati vengono passati all'applicazione su STDIN e l'applicazione restituisce i risultati in STDOUT. Per leggere e scrivere da STDIN e STDOUT, è possibile usare Console.ReadLine() e Console.WriteLine() da un'applicazione console.

Prerequisiti

  • Una familiarità nello scrivere e nel compilare il codice C# destinato a .NET Framework 4.5.

    • Usare qualsiasi IDE desiderato. Si consigliano Visual Studio 2015, 2017 o Visual Studio Code. Nella procedura di questo documento viene usato Visual Studio 2017.
  • Un modo per caricare i file con estensione exe nel cluster ed eseguire i processi Pig e Hive. Si consigliano gli strumenti Data Lake per Visual Studio, Azure PowerShell e l'interfaccia della riga di comando di Azure. La procedura in questo documento usa gli strumenti Data Lake per Visual Studio per caricare i file ed eseguire l'esempio di query Hive.

    Per informazioni su altri modi per eseguire query Hive e processi Pig, vedere i seguenti documenti:

  • Un cluster Hadoop in HDInsight. Per altre informazioni sulla creazione di un cluster, vedere Creare cluster Hadoop in HDInsight.

.NET su HDInsight

  • Cluster HDInsight basati su Linux che usano Mono (https://mono-project.com) per eseguire le applicazioni .NET. La versione mono 4.2.1 è inclusa nella versione 3.5 di HDInsight.

    Per altre informazioni sulla compatibilità Mono con le versioni di .NET Framework, vedere il documento relativo alla compatibilità Mono.

    Per usare una versione specifica di Mono, vedere il documento Install or update Mono (Installare o aggiornare Mono).

  • I cluster di HDInsight basato su Windows usano Microsoft .NET Common Language Runtime per eseguire le applicazioni .NET.

Per altre informazioni sulla versione del framework .NET e di Mono compresa nelle versioni di HDInsight, vedere Componenti e versioni di Hadoop disponibili in HDInsight.

Creare il progetto C#

UDF di Hive

  1. Aprire Visual Studio e creare una soluzione. Come tipo di progetto selezionare App console (.NET Framework) e assegnare al nuovo progetto il nome HiveCSharp.

    Importante

    Selezionare .NET Framework 4.5 se si usa un cluster HDInsight basato su Linux. Per altre informazioni sulla compatibilità Mono con le versioni di .NET Framework, vedere il documento relativo alla compatibilità Mono.

  2. Sostituire il contenuto del file Program.cs con il codice seguente:

    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();
            }
        }
    }
    
  3. Compilare il progetto.

UDF di Pig

  1. Aprire Visual Studio e creare una soluzione. Come tipo di progetto selezionare Applicazione console e assegnare al nuovo progetto il nome PigUDF.

  2. Sostituire il contenuto del file Program.cs con il codice seguente:

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

    Questa applicazione analizza le righe inviate da Pig e riformatta quelle che iniziano con java.lang.Exception.

  3. Salvare Program.cse quindi compilare il progetto.

Caricare nella risorsa di archiviazione

  1. In Visual Studio aprire Esplora server.

  2. Espandere Azure e quindi HDInsight.

  3. Se richiesto, immettere le credenziali della sottoscrizione di Azure, quindi fare clic su Accedi.

  4. Espandere il cluster HDInsight in cui si desidera distribuire l'applicazione. Viene elencata una voce con il testo (Account di archiviazione predefinito).

    Esplora server con account di archiviazione per il cluster

    • Se è possibile espandere questa voce, si usa un Account di archiviazione di Azure come risorsa di archiviazione predefinita per il cluster. Per visualizzare i file nel percorso di archiviazione predefinito per il cluster, espandere la voce e quindi fare doppio clic su (Contenitore predefinito).

    • Se non è possibile espandere questa voce, si usa un Azure Data Lake Store come risorsa di archiviazione predefinita per il cluster. Per visualizzare i file nel percorso di archiviazione predefinito per il cluster, fare doppio clic sulla voce (Account di archiviazione predefinito).

  5. Per caricare i file con estensione .exe, usare uno dei metodi seguenti:

    • Se si usa un Account di Archiviazione di Azure, fare clic sull'icona per il caricamento, quindi passare alla cartella bin\debug per il progetto HiveCSharp. Selezionare infine il file HiveCSharp.exe e fare clic su Ok.

      icona relativa al caricamento

    • Se si usa Azure Data Lake Store, fare doppio clic su un'area vuota nell'elenco di file e quindi selezionare Carica. Selezionare infine il file HiveCSharp.exe e fare clic su Apri.

      Una volta terminato il caricamento di HiveCSharp.exe, ripetere il processo di caricamento per il file PigUDF.exe.

Eseguire una query Hive

  1. In Visual Studio aprire Esplora server.

  2. Espandere Azure e quindi HDInsight.

  3. Fare clic con il pulsante destro del mouse sul cluster in cui è stata distribuita l'applicazione HiveCSharp, quindi selezionare Scrivi una query Hive.

  4. Per la query Hive usare il testo seguente:

    -- Uncomment the following if you are using Azure Storage
    -- add file wasb:///HiveCSharp.exe;
    -- Uncomment the following if you are using Azure Data Lake Store
    -- add file adl:///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

    Rimuovere il commento dell'istruzione add file che corrisponde al tipo di archiviazione predefinita usata per il cluster.

    Questa query seleziona i campi clientid, devicemake e devicemodel da hivesampletable e li passa all'applicazione HiveCSharp.exe. La query si aspetta che l'applicazione restituisca tre campi, che vengono archiviati come clientid, phoneLabel e phoneHash. La query prevede anche di trovare HiveCSharp.exe nella radice del contenitore di archiviazione predefinito.

  5. Fare clic su Invia per inviare il processo al cluster HDInsight. Viene visualizzata la finestra Hive Job Summary (Riepilogo processo Hive).

  6. Fare clic su Aggiorna per aggiornare il riepilogo fino all'impostazione del valore Stato processo su Completato. Per visualizzare l'output del processo, fare clic su Output processo.

Eseguire un processo Pig

  1. Per connettersi al cluster HDInsight, usare uno dei metodi seguenti:

  2. Usare uno dei comandi seguenti per avviare la riga di comando di Pig:

     pig
    
    Importante

    Se si usa un cluster basato su Windows, usare invece i comandi seguenti:

    cd %PIG_HOME%
    bin\pig
    

    Viene visualizzato un prompt grunt>.

  3. Immettere il codice seguente per eseguire un processo Pig che usa l'applicazione .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;
    

    L'istruzione DEFINE crea un alias di streamer per le applicazioni pigudf.exe e CACHE lo carica dalla risorsa di archiviazione per il cluster. In seguito, streamer viene usato con l'operatore STREAM per elaborare le singole righe contenute in LOG e restituire i dati sotto forma di serie di colonne.

    Nota

    Il nome dell'applicazione usato per lo streaming deve essere racchiuso tra caratteri ` (carattere di apice inverso) quando associato ad alias e da ' (virgoletta singola) se usato con SHIP.

  4. Dopo l'immissione dell'ultima riga il processo dovrebbe essere avviato. L'output restituito è simile al testo seguente:

     (2012-02-03 20:11:56 SampleClass5 [WARN] problem finding id 1358451042 - java.lang.Exception)
     (2012-02-03 20:11:56 SampleClass5 [DEBUG] detail for id 1976092771)
     (2012-02-03 20:11:56 SampleClass5 [TRACE] verbose detail for id 1317358561)
     (2012-02-03 20:11:56 SampleClass5 [TRACE] verbose detail for id 1737534798)
     (2012-02-03 20:11:56 SampleClass7 [DEBUG] detail for id 1475865947)
    

Passaggi successivi

In questo documento è stato illustrato come usare un'applicazione .NET Framework da Hive e Pig in HDInsight. Per altre informazioni su come usare Python con Hive e Pig, vedere Usare Python con Hive e Pig in HDInsight.

Per altre modalità d'uso di Pig e Hive e per informazioni su come usare MapReduce, vedere i documenti seguenti: