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
Kunskaper om att skriva och skapa C#-kod som riktar sig till .NET Framework 4.5.
Använd vilken IDE du vill. Vi rekommenderar Visual Studio eller Visual Studio Code. Stegen i det här dokumentet använder Visual Studio 2019.
Ett sätt att ladda upp .exe filer till klustret och köra Pig- och Hive-jobb. Vi rekommenderar Data Lake Tools för Visual Studio, Azure PowerShell och Azure CLI. Stegen i det här dokumentet använder Data Lake Tools för Visual Studio för att ladda upp filerna och köra hive-exempelfrågan.
Information om andra sätt att köra Hive-frågor finns i Vad är Apache Hive och HiveQL i Azure HDInsight?.
Ett Hadoop på HDInsight-kluster. Mer information om hur du skapar ett kluster finns i Skapa HDInsight-kluster.
.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:
Starta Visual Studio.
Välj Skapa ett nytt projekt.
I fönstret Skapa ett nytt projekt väljer du mallen Konsolapp (.NET Framework) (C#-versionen). Välj sedan Nästa.
I fönstret Konfigurera ditt nya projekt anger du ett projektnamn för HiveCSharp och navigerar till eller skapar en plats för att spara det nya projektet i. Välj sedan Skapa.
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(); } } }
I menyraden väljer du Skapa>bygglösning för att skapa projektet.
Stäng lösningen.
Apache Pig UDF
Så här skapar du ett C#-projekt för en Apache Hive UDF:
Öppna Visual Studio.
I startfönstret väljer du Skapa ett nytt projekt.
I fönstret Skapa ett nytt projekt väljer du mallen Konsolapp (.NET Framework) (C#-versionen). Välj sedan Nästa.
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.
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
.I menyraden väljer du Skapa>bygglösning för att skapa projektet.
Låt lösningen vara öppen.
Ladda upp till lagring
Ladda sedan upp UDF-programmen Hive och Pig till lagring i ett HDInsight-kluster.
I Visual Studio navigerar du till Visa>serverutforskaren.
Högerklicka på Azure från Server Explorer, välj Anslut till Microsoft Azure-prenumeration och slutför inloggningsprocessen.
Expandera det HDInsight-kluster som du vill distribuera det här programmet till. En post med texten (standardlagringskonto) visas.
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).
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.
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.
I Visual Studio navigerar du till Visa>serverutforskaren.
Expandera Azure och expandera därefter HDInsight.
Högerklicka på klustret som du distribuerade HiveCSharp-programmet till och välj sedan Skriv en Hive-fråga.
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.
hivesampletable
devicemodel
devicemake
clientid
Frågan förväntar sig att programmet returnerar tre fält som lagras somclientid
,phoneLabel
ochphoneHash
. Frågan förväntar sig också att hitta HiveCSharp.exe i roten för standardlagringscontainern.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.
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.
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.Använd följande kommando för att starta kommandoraden Pig:
pig
En
grunt>
uppmaning visas.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 aliasstreamer
för för PigUDF.exe-programmet ochCACHE
läser in det från standardlagringen för klustret.streamer
Senare används med operatornSTREAM
för att bearbeta de enskilda raderna iLOG
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 medSHIP
.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)
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: