Använda användardefinierade C#-funktioner med Apache Hive och Apache Pig på Apache Hadoop i HDInsight

Lär dig hur du använder användardefinierade C#-funktioner (UDF) med Apache Hive och Apache Pig i HDInsight.

Viktigt!

Stegen i det här dokumentet fungerar med Linux-baserade HDInsight-kluster. Linux är det enda operativsystemet som används med HDInsight version 3.4 och senare. Mer information finns i VERSION AV HDInsight-komponenter.

Både Hive och Pig kan skicka data till externa program för bearbetning. Den här processen kallas för strömning. När du använder ett .NET-program skickas data till programmet på STDIN och programmet returnerar resultatet på STDOUT. Om du vill läsa och skriva från STDIN och STDOUT kan du använda Console.ReadLine() och Console.WriteLine() från ett konsolprogram.

Förutsättningar

.NET på HDInsight

Linux-baserade HDInsight-kluster använder Mono (https://mono-project.com) för att köra .NET-program. Mono version 4.2.1 ingår i HDInsight version 3.6.

Mer information om monokompatibilitet med .NET Framework-versioner finns i Monokompatibilitet.

Mer information om versionen av .NET Framework och Mono som ingår i HDInsight-versioner finns i HDInsight-komponentversioner.

Skapa C#-projekten

I följande avsnitt beskrivs hur du skapar ett C#-projekt i Visual Studio för en Apache Hive UDF och en Apache Pig UDF.

Apache Hive UDF

Så här skapar du ett C#-projekt för en Apache Hive UDF:

  1. Starta Visual Studio.

  2. Välj Skapa ett nytt projekt.

  3. I fönstret Skapa ett nytt projekt väljer du mallen Konsolapp (.NET Framework) (C#-versionen). Välj sedan Nästa.

  4. I fönstret Konfigurera ditt nya projekt anger du ett projektnamnför HiveCSharp och navigerar till eller skapar en plats för att spara det nya projektet i. Välj sedan Skapa.

  5. I Visual Studio IDE ersätter du innehållet i Program.cs med följande kod:

    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. I menyraden väljer du Skapa>bygglösning för att skapa projektet.

  7. Stäng lösningen.

Apache Pig UDF

Så här skapar du ett C#-projekt för en Apache Hive UDF:

  1. Öppna Visual Studio.

  2. I startfönstret väljer du Skapa ett nytt projekt.

  3. I fönstret Skapa ett nytt projekt väljer du mallen Konsolapp (.NET Framework) (C#-versionen). Välj sedan Nästa.

  4. I fönstret Konfigurera ditt nya projekt anger du ett projektnamn för PigUDF och går till eller skapar en plats för att spara det nya projektet i. Välj sedan Skapa.

  5. I Visual Studio IDE ersätter du innehållet i Program.cs med följande kod:

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

    Den här koden parsar raderna som skickas från Pig och formaterar om rader som börjar med java.lang.Exception.

  6. I menyraden väljer du Skapa>bygglösning för att skapa projektet.

  7. Låt lösningen vara öppen.

Ladda upp till lagring

Ladda sedan upp UDF-programmen Hive och Pig till lagring i ett HDInsight-kluster.

  1. I Visual Studio navigerar du till Visa>serverutforskaren.

  2. Högerklicka Azure från Server Explorer, välj Anslut till Microsoft Azure-prenumeration och slutför inloggningsprocessen.

  3. Expandera det HDInsight-kluster som du vill distribuera det här programmet till. En post med texten (standardlagringskonto) visas.

    Default storage account, HDInsight cluster, Server Explorer.

    • Om den här posten kan utökas använder du ett Azure Storage-konto som standardlagring för klustret. Om du vill visa filerna på standardlagringen för klustret expanderar du posten och dubbelklickar sedan på (standardcontainern).

    • Om den här posten inte kan expanderas använder du Azure Data Lake Storage som standardlagring för klustret. Om du vill visa filerna på standardlagringen för klustret dubbelklickar du på posten (standardlagringskonto).

  4. Om du vill ladda upp .exe filer använder du någon av följande metoder:

    • Om du använder ett Azure Storage-konto väljer du ikonen Ladda upp blob.

      HDInsight upload icon for new project.

      I dialogrutan Ladda upp ny fil går du till Filnamn och väljer Bläddra. I dialogrutan Ladda upp blob går du till mappen bin\debug för HiveCSharp-projektet och väljer sedan filen HiveCSharp.exe. Välj slutligen Öppna och sedan OK för att slutföra uppladdningen.

    • Om du använder Azure Data Lake Storage högerklickar du på ett tomt område i fillistan och väljer sedan Ladda upp. Välj slutligen filen HiveCSharp.exe och välj Öppna.

    När HiveCSharp.exe uppladdningen är klar upprepar du uppladdningsprocessen för PigUDF.exe-filen.

Köra en Apache Hive-fråga

Nu kan du köra en Hive-fråga som använder ditt Hive UDF-program.

  1. I Visual Studio navigerar du till Visa>serverutforskaren.

  2. Expandera Azure och expandera därefter HDInsight.

  3. Högerklicka på klustret som du distribuerade HiveCSharp-programmet till och välj sedan Skriv en Hive-fråga.

  4. Använd följande text för Hive-frågan:

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

    Viktigt!

    Avkommentera instruktionen add file som matchar den typ av standardlagring som används för klustret.

    Den här frågan väljer fälten , och från och skickar sedan fälten till HiveCSharp.exe-programmet.hivesampletabledevicemodeldevicemakeclientid Frågan förväntar sig att programmet returnerar tre fält som lagras som clientid, phoneLabeloch phoneHash. Frågan förväntar sig också att hitta HiveCSharp.exe i roten för standardlagringscontainern.

  5. Växla standardinställningen Interaktiv till Batch och välj sedan Skicka för att skicka jobbet till HDInsight-klustret. Fönstret Sammanfattning av Hive-jobb öppnas.

  6. Välj Uppdatera för att uppdatera sammanfattningen tills jobbstatusen ändras till Slutförd. Om du vill visa jobbutdata väljer du Jobbutdata.

Köra ett Apache Pig-jobb

Du kan också köra ett Pig-jobb som använder ditt Pig UDF-program.

  1. Använd SSH för att ansluta till ditt HDInsight-kluster. (Kör till exempel kommandot ssh sshuser@<clustername>-ssh.azurehdinsight.net.) Mer information finns i Använda SSH medHDInsight.

  2. Använd följande kommando för att starta kommandoraden Pig:

    pig
    

    En grunt> uppmaning visas.

  3. Ange följande för att köra ett Pig-jobb som använder .NET Framework-programmet:

    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;
    

    Instruktionen DEFINE skapar ett alias streamer för för PigUDF.exe-programmet och CACHE läser in det från standardlagringen för klustret. streamer Senare används med operatorn STREAM för att bearbeta de enskilda raderna i LOG och returnera data som en serie kolumner.

    Kommentar

    Programnamnet som används för direktuppspelning måste omges av ` (backtick)-tecknet vid alias och av ' tecknet (enda citattecken) när det används med SHIP.

  4. När du har angett den sista raden ska jobbet starta. Den returnerar utdata som liknar följande text:

    (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. Använd exit för att avsluta grisen.

Nästa steg

I det här dokumentet har du lärt dig hur du använder ett .NET Framework-program från Hive och Pig i HDInsight. Om du vill lära dig hur du använder Python med Hive och Pig kan du läsa Använda Python med Apache Hive och Apache Pig i HDInsight.

Andra sätt att använda Hive och mer information om hur du använder MapReduce finns i följande artiklar: