Använd C# med MapReduce streaming på Apache Hadoop i HDInsightUse C# with MapReduce streaming on Apache Hadoop in HDInsight

Lär dig hur du C# använder för att skapa en MapReduce-lösning i HDInsight.Learn how to use C# to create a MapReduce solution on HDInsight.

Viktigt

Linux är det enda operativsystemet som används med HDInsight version 3.4 och senare.Linux is the only operating system used on HDInsight version 3.4 or greater. Mer information finns i Apache Hadoop-komponenter i HDInsight.For more information, see Apache Hadoop components on HDInsight.

Apache Hadoop strömning är ett verktyg som gör att du kan köra MapReduce-jobb med ett skript eller en körbar fil.Apache Hadoop streaming is a utility that allows you to run MapReduce jobs using a script or executable. I det här exemplet används .NET för att implementera mapper och minskaren för en ord räknings lösning.In this example, .NET is used to implement the mapper and reducer for a word count solution.

.NET på HDInsight.NET on HDInsight

Linux-baserade HDInsight- kluster använder mono (https://mono-project.com) för att köra .NET-program.Linux-based HDInsight clusters use Mono (https://mono-project.com) to run .NET applications. Mono version 4.2.1 ingår i HDInsight version 3,6.Mono version 4.2.1 is included with HDInsight version 3.6. Mer information om den version av mono som ingår i HDInsight finns i Apache Hadoop-komponenter som är tillgängliga med olika HDInsight-versioner.For more information on the version of Mono included with HDInsight, see Apache Hadoop components available with different HDInsight versions.

Mer information om mono-kompatibilitet med .NET Framework-versioner finns i mono-kompatibilitet.For more information on Mono compatibility with .NET Framework versions, see Mono compatibility.

Så här fungerar Hadoop streamingHow Hadoop streaming works

Den grundläggande processen som används för strömning i det här dokumentet är följande:The basic process used for streaming in this document is as follows:

  1. Hadoop skickar data till Mapper (mapper. exe i det här exemplet) på STDIN.Hadoop passes data to the mapper (mapper.exe in this example) on STDIN.
  2. Mapper bearbetar data och avgränsar TABB-avgränsade nyckel/värde-par till STDOUT.The mapper processes the data, and emits tab-delimited key/value pairs to STDOUT.
  3. Utdata läses av Hadoop och skickas sedan till minsknings tjänsten (reducerar. exe i det här exemplet) på STDIN.The output is read by Hadoop, and then passed to the reducer (reducer.exe in this example) on STDIN.
  4. Minsknings tjänsten läser in TABB-avgränsade nyckel/värde-par, bearbetar data och genererar sedan resultatet som TABB-avgränsade nyckel/värde-par i STDOUT.The reducer reads the tab-delimited key/value pairs, processes the data, and then emits the result as tab-delimited key/value pairs on STDOUT.
  5. Utdata läses av Hadoop och skrivs till utdata-katalogen.The output is read by Hadoop and written to the output directory.

Mer information om strömning finns i Hadoop-direktuppspelning.For more information on streaming, see Hadoop Streaming.

KravPrerequisites

  • Visual Studio.Visual Studio.

  • En välbekanthet med att skriva C# och skapa kod som är riktad mot .NET Framework 4,5.A familiarity with writing and building C# code that targets .NET Framework 4.5.

  • Ett sätt att ladda upp exe-filer till klustret.A way to upload .exe files to the cluster. Stegen i det här dokumentet använder Data Lake verktyg för Visual Studio för att överföra filerna till primär lagring för klustret.The steps in this document use the Data Lake Tools for Visual Studio to upload the files to primary storage for the cluster.

  • Azure PowerShell eller en SSH-klient (Secure Shell).Azure PowerShell or a Secure Shell (SSH) client.

  • Ett Hadoop på HDInsight-kluster.A Hadoop on HDInsight cluster. Mer information om hur du skapar ett kluster finns i skapa ett HDInsight-kluster.For more information on creating a cluster, see Create an HDInsight cluster.

Skapa mapperCreate the mapper

Skapa ett nytt .NET Framework konsol program med namnet Mapperi Visual Studio.In Visual Studio, create a new .NET Framework console application named mapper. Använd följande kod för programmet:Use the following code for the application:

using System;
using System.Text.RegularExpressions;

namespace mapper
{
    class Program
    {
        static void Main(string[] args)
        {
            string line;
            //Hadoop passes data to the mapper on STDIN
            while((line = Console.ReadLine()) != null)
            {
                // We only want words, so strip out punctuation, numbers, etc.
                var onlyText = Regex.Replace(line, @"\.|;|:|,|[0-9]|'", "");
                // Split at whitespace.
                var words = Regex.Matches(onlyText, @"[\w]+");
                // Loop over the words
                foreach(var word in words)
                {
                    //Emit tab-delimited key/value pairs.
                    //In this case, a word and a count of 1.
                    Console.WriteLine("{0}\t1",word);
                }
            }
        }
    }
}

När du har skapat programmet skapar du det för att skapa /bin/debug/mapper.exe -filen i projekt katalogen.After you create the application, build it to produce the /bin/Debug/mapper.exe file in the project directory.

Skapa reducerarenCreate the reducer

I Visual Studio skapar du ett nytt .NET Framework konsol program med namnet reducere.In Visual Studio, create a new .NET Framework console application named reducer. Använd följande kod för programmet:Use the following code for the application:

using System;
using System.Collections.Generic;

namespace reducer
{
    class Program
    {
        static void Main(string[] args)
        {
            //Dictionary for holding a count of words
            Dictionary<string, int> words = new Dictionary<string, int>();

            string line;
            //Read from STDIN
            while ((line = Console.ReadLine()) != null)
            {
                // Data from Hadoop is tab-delimited key/value pairs
                var sArr = line.Split('\t');
                // Get the word
                string word = sArr[0];
                // Get the count
                int count = Convert.ToInt32(sArr[1]);

                //Do we already have a count for the word?
                if(words.ContainsKey(word))
                {
                    //If so, increment the count
                    words[word] += count;
                } else
                {
                    //Add the key to the collection
                    words.Add(word, count);
                }
            }
            //Finally, emit each word and count
            foreach (var word in words)
            {
                //Emit tab-delimited key/value pairs.
                //In this case, a word and a count of 1.
                Console.WriteLine("{0}\t{1}", word.Key, word.Value);
            }
        }
    }
}

När du har skapat programmet skapar du det för att skapa /bin/debug/Reducer.exe -filen i projekt katalogen.After you create the application, build it to produce the /bin/Debug/reducer.exe file in the project directory.

Ladda upp till lagringUpload to storage

Därefter måste du ladda upp mapparna och minska programmen till HDInsight-lagringen.Next, you need to upload the mapper and reducer applications to HDInsight storage.

  1. I Visual Studio väljer du visa > Server Explorer.In Visual Studio, choose View > Server Explorer.

  2. Expandera Azure och expandera därefter HDInsight.Expand Azure, and then expand HDInsight.

  3. Om du uppmanas till det anger du dina autentiseringsuppgifter för Azure-prenumerationen och väljer sedan Loggain.If prompted, enter your Azure subscription credentials, and then select Sign In.

  4. Expandera det HDInsight-kluster som du vill distribuera programmet till.Expand the HDInsight cluster that you wish to deploy this application to. En post med texten (standard lagrings kontot) visas.An entry with the text (Default Storage Account) is listed.

    Lagrings konto, HDInsight-kluster, Server Explorer, Visual Studio

    • Om posten (standard lagrings konto) kan expanderas använder du ett Azure Storage konto som standard lagring för klustret.If the (Default Storage Account) entry can be expanded, you're using an Azure Storage Account as default storage for the cluster. Om du vill visa filerna på standard lagrings utrymmet för klustret, expanderar du posten och dubbelklickar sedan på (standard behållare) .To view the files on the default storage for the cluster, expand the entry and then double-click (Default Container).

    • Om posten (standard lagrings konto) inte kan utökas använder du Azure Data Lake Storage som standard lagring för klustret.If the (Default Storage Account) entry can't be expanded, you're using Azure Data Lake Storage as the default storage for the cluster. Om du vill visa filerna på standard lagrings utrymmet för klustret dubbelklickar du på posten (standard lagrings konto) .To view the files on the default storage for the cluster, double-click the (Default Storage Account) entry.

  5. Använd någon av följande metoder för att ladda upp exe-filerna:To upload the .exe files, use one of the following methods:

    • Om du använder ett Azure Storage kontoväljer du ikonen Ladda upp BLOB .If you're using an Azure Storage Account, select the Upload Blob icon.

      HDInsight upload-ikon för Mapper, Visual Studio

      Välj Bläddraunder fil namni dialog rutan Ladda upp ny fil .In the Upload New File dialog box, under File name, select Browse. I dialog rutan Ladda upp BLOB går du till mappen bin\debug för Mapper -projektet och väljer sedan filen mapper. exe .In the Upload Blob dialog box, go to the bin\debug folder for the mapper project, and then choose the mapper.exe file. Klicka slutligen på Öppna och sedan på OK för att slutföra överföringen.Finally, select Open and then OK to complete the upload.

    • För Azure Data Lake Storagehögerklickar du på ett tomt utrymme i fil listan och väljer sedan Ladda upp.For Azure Data Lake Storage, right-click an empty area in the file listing, and then select Upload. Välj slutligen filen mapper. exe och välj sedan Öppna.Finally, select the mapper.exe file and then select Open.

    När filen mapper. exe har laddats upp upprepar du överförings processen för filen Reducer. exe .Once the mapper.exe upload has finished, repeat the upload process for the reducer.exe file.

Köra ett jobb: använda en SSH-sessionRun a job: Using an SSH session

Följande procedur beskriver hur du kör ett MapReduce-jobb med en SSH-session:The following procedure describes how to run a MapReduce job using an SSH session:

  1. Använd SSH för att ansluta till HDInsight-klustret.Use SSH to connect to the HDInsight cluster. (Du kan till exempel köra kommandot ssh sshuser@<clustername>-ssh.azurehdinsight.net.) Mer information finns i använda SSH med HDInsight.(For example, run the command ssh sshuser@<clustername>-ssh.azurehdinsight.net.) For more information, see Use SSH with HDInsight.

  2. Använd något av följande kommandon för att starta MapReduce-jobbet:Use one of the following commands to start the MapReduce job:

    • Om standard lagringen är Azure Storage:If the default storage is Azure Storage:

      yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-streaming.jar \
          -files wasb:///mapper.exe,wasb:///reducer.exe \
          -mapper mapper.exe \
          -reducer reducer.exe \
          -input /example/data/gutenberg/davinci.txt \
          -output /example/wordcountout
      
    • Om standard lagringen är data Lake Storage gen1:If the default storage is Data Lake Storage Gen1:

      yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-streaming.jar \
          -files adl:///mapper.exe,adl:///reducer.exe \
          -mapper mapper.exe \
          -reducer reducer.exe \
          -input /example/data/gutenberg/davinci.txt \
          -output /example/wordcountout
      
    • Om standard lagringen är data Lake Storage Gen2:If the default storage is Data Lake Storage Gen2:

      yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-streaming.jar \
          -files abfs:///mapper.exe,abfs:///reducer.exe \
          -mapper mapper.exe \
          -reducer reducer.exe \
          -input /example/data/gutenberg/davinci.txt \
          -output /example/wordcountout
      

    I följande lista beskrivs vad varje parameter och alternativ representerar:The following list describes what each parameter and option represents:

    • Hadoop-streaming. jar: anger den jar-fil som innehåller funktionen för strömning av MapReduce.hadoop-streaming.jar: Specifies the jar file that contains the streaming MapReduce functionality.
    • -files: anger mapparna mapper. exe och Reducer. exe för det här jobbet.-files: Specifies the mapper.exe and reducer.exe files for this job. Den wasb:///, adl:///eller abfs:/// protokoll deklarationen innan varje fil är sökvägen till roten för standard lagrings utrymmet för klustret.The wasb:///, adl:///, or abfs:/// protocol declaration before each file is the path to the root of default storage for the cluster.
    • -mapper: anger den fil som implementerar mapper.-mapper: Specifies the file that implements the mapper.
    • -reducer: anger den fil som implementerar minskningen.-reducer: Specifies the file that implements the reducer.
    • -input: anger indata.-input: Specifies the input data.
    • -output: anger utdatakatalogen.-output: Specifies the output directory.
  3. När MapReduce-jobbet har slutförts använder du följande kommando för att visa resultaten:Once the MapReduce job completes, use the following command to view the results:

    hdfs dfs -text /example/wordcountout/part-00000
    

    Följande text är ett exempel på de data som returneras av det här kommandot:The following text is an example of the data returned by this command:

    you     1128
    young   38
    younger 1
    youngest        1
    your    338
    yours   4
    yourself        34
    yourselves      3
    youth   17
    

Köra ett jobb: använda PowerShellRun a job: Using PowerShell

Använd följande PowerShell-skript för att köra ett MapReduce-jobb och hämta resultaten.Use the following PowerShell script to run a MapReduce job and download the results.

# Login to your Azure subscription
$context = Get-AzContext
if ($context -eq $null) 
{
    Connect-AzAccount
}
$context

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

# Path for job output
$outputPath="/example/wordcountoutput"

# Progress indicator
$activity="C# MapReduce example"
Write-Progress -Activity $activity -Status "Getting cluster information..."
#Get HDInsight info so we can get the resource group, storage, etc.
$clusterInfo = Get-AzHDInsightCluster -ClusterName $clusterName
$resourceGroup = $clusterInfo.ResourceGroup
$storageActArr=$clusterInfo.DefaultStorageAccount.split('.')
$storageAccountName=$storageActArr[0]
$storageType=$storageActArr[1]

# Progress indicator
#Define the MapReduce job
# Note: using "/mapper.exe" and "/reducer.exe" looks in the root
#       of default storage.
$jobDef=New-AzHDInsightStreamingMapReduceJobDefinition `
    -Files "/mapper.exe","/reducer.exe" `
    -Mapper "mapper.exe" `
    -Reducer "reducer.exe" `
    -InputPath "/example/data/gutenberg/davinci.txt" `
    -OutputPath $outputPath

# Start the job
Write-Progress -Activity $activity -Status "Starting MapReduce job..."
$job=Start-AzHDInsightJob `
    -ClusterName $clusterName `
    -JobDefinition $jobDef `
    -HttpCredential $creds

#Wait for the job to complete
Write-Progress -Activity $activity -Status "Waiting for the job to complete..."
Wait-AzHDInsightJob `
    -ClusterName $clusterName `
    -JobId $job.JobId `
    -HttpCredential $creds

Write-Progress -Activity $activity -Completed

# Download the output 
if($storageType -eq 'azuredatalakestore') {
    # Azure Data Lake Store
    # Fie path is the root of the HDInsight storage + $outputPath
    $filePath=$clusterInfo.DefaultStorageRootPath + $outputPath + "/part-00000"
    Export-AzDataLakeStoreItem `
        -Account $storageAccountName `
        -Path $filePath `
        -Destination output.txt
} else {
    # Az.Storage account
    # Get the container
    $container=$clusterInfo.DefaultStorageContainer
    #NOTE: This assumes that the storage account is in the same resource
    #      group as HDInsight. If it is not, change the
    #      --ResourceGroupName parameter to the group that contains storage.
    $storageAccountKey=(Get-AzStorageAccountKey `
        -Name $storageAccountName `
    -ResourceGroupName $resourceGroup)[0].Value

    #Create a storage context
    $context = New-AzStorageContext `
        -StorageAccountName $storageAccountName `
        -StorageAccountKey $storageAccountKey
    # Download the file
    Get-AzStorageBlobContent `
        -Blob 'example/wordcountoutput/part-00000' `
        -Container $container `
        -Destination output.txt `
        -Context $context
}

I det här skriptet uppmanas du att ange konto namnet och lösen ordet för klustrets inloggning, tillsammans med HDInsight-klustrets namn.This script prompts you for the cluster login account name and password, along with the HDInsight cluster name. När jobbet har slutförts hämtas utdata till en fil med namnet output. txt.Once the job completes, the output is downloaded to a file named output.txt. Följande text är ett exempel på data i output.txt-filen:The following text is an example of the data in the output.txt file:

you     1128
young   38
younger 1
youngest        1
your    338
yours   4
yourself        34
yourselves      3
youth   17

Nästa stegNext steps

Mer information om hur du använder MapReduce med HDInsight finns i använda MapReduce i Apache Hadoop på HDInsight.For more information on using MapReduce with HDInsight, see Use MapReduce in Apache Hadoop on HDInsight.

Information om hur du C# använder med Hive och gris finns i använda C# en användardefinierad funktion med Apache Hive och Apache gris.For information on using C# with Hive and Pig, see Use a C# user-defined function with Apache Hive and Apache Pig.

Information om hur du C# använder med storm på HDInsight finns i C# utveckla topologier för Apache storm i HDInsight.For information on using C# with Storm on HDInsight, see Develop C# topologies for Apache Storm on HDInsight.