Utiliser C# avec streaming MapReduce sur Apache Hadoop dans HDInsightUse C# with MapReduce streaming on Apache Hadoop in HDInsight

Découvrez comment utiliser C# pour créer une solution MapReduce dans HDInsight.Learn how to use C# to create a MapReduce solution on HDInsight.

Diffusion en continu Apache Hadoop est un utilitaire qui vous permet d’exécuter des tâches MapReduce à l’aide d’un script ou d’un exécutable.Apache Hadoop streaming is a utility that allows you to run MapReduce jobs using a script or executable. Dans cet exemple, .NET est utilisé pour implémenter le mappeur et le raccord de réduction pour une solution de comptage de mots.In this example, .NET is used to implement the mapper and reducer for a word count solution.

.NET sur HDInsight.NET on HDInsight

Les clusters HDInsight utilisent Mono (https://mono-project.com) pour exécuter les applications .NET.HDInsight clusters use Mono (https://mono-project.com) to run .NET applications. La version 4.2.1 de Mono est incluse dans la version 3.6 de HDInsight.Mono version 4.2.1 is included with HDInsight version 3.6. Pour plus d’informations sur la version de Mono incluse dans HDInsight, consultez Composants Apache Hadoop disponibles avec différentes versions de HDInsight.For more information on the version of Mono included with HDInsight, see Apache Hadoop components available with different HDInsight versions.

Pour plus d’informations sur la compatibilité Mono avec les versions de .NET Framework, consultez Compatibilité Mono.For more information on Mono compatibility with .NET Framework versions, see Mono compatibility.

Fonctionnement de la diffusion en continu HadoopHow Hadoop streaming works

Le processus de base utilisé pour la diffusion en continu dans ce document est la suivante :The basic process used for streaming in this document is as follows:

  1. Hadoop transmet des données vers le mappeur (mapper.exe dans cet exemple) sur STDIN.Hadoop passes data to the mapper (mapper.exe in this example) on STDIN.
  2. Le mappeur traite les données et émet des paires clé/valeur séparées par des tabulations sur STDOUT.The mapper processes the data, and emits tab-delimited key/value pairs to STDOUT.
  3. La sortie est lue par Hadoop, puis transmise au raccord de réduction (reducer.exe dans cet exemple) sur STDIN.The output is read by Hadoop, and then passed to the reducer (reducer.exe in this example) on STDIN.
  4. Le raccord de réduction lit les paires clé/valeur séparées par des tabulations, traite les données, puis émet le résultat sous forme de paires clé/valeur séparées par des tabulations sur 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. La sortie est lue par Hadoop et écrite dans le répertoire de sortie.The output is read by Hadoop and written to the output directory.

Pour plus d’informations sur la diffusion en continu, consultez l’article Diffusion en continu Hadoop.For more information on streaming, see Hadoop Streaming.

PrérequisPrerequisites

  • Visual Studio.Visual Studio.

  • Des connaissances en écriture et en génération de code C# qui cible .NET Framework 4.5.A familiarity with writing and building C# code that targets .NET Framework 4.5.

  • Permet de charger des fichiers .exe dans le cluster.A way to upload .exe files to the cluster. Les étapes de ce document utilisent Data Lake Tools pour Visual Studio pour télécharger les fichiers vers le stockage principal pour le cluster.The steps in this document use the Data Lake Tools for Visual Studio to upload the files to primary storage for the cluster.

  • Si vous utilisez PowerShell, vous aurez besoin du module Az.If using PowerShell, you'll need the Az Module.

  • Un client SSH (facultatif).An SSH client (optional). Pour plus d’informations, consultez Se connecter à HDInsight (Apache Hadoop) à l’aide de SSH.For more information, see Connect to HDInsight (Apache Hadoop) using SSH.

  • Un cluster Apache Hadoop sur HDInsight.An Apache Hadoop cluster on HDInsight. Consultez Bien démarrer avec HDInsight sur Linux.See Get Started with HDInsight on Linux.

  • Le schéma d’URI de votre principal espace de stockage de clusters.The URI scheme for your clusters primary storage. Il s’agirait de wasb:// pour Stockage Azure, de abfs:// pour Azure Data Lake Storage Gen2 ou de adl:// pour Azure Data Lake Storage Gen1.This would be wasb:// for Azure Storage, abfs:// for Azure Data Lake Storage Gen2 or adl:// for Azure Data Lake Storage Gen1. Si l’option de transfert sécurisé est activée pour Stockage Azure ou Data Lake Storage Gen2, l’URI serait wasbs:// ou abfss://, respectivement. Consultez également l’article dédié au transfert sécurisé.If secure transfer is enabled for Azure Storage or Data Lake Storage Gen2, the URI would be wasbs:// or abfss://, respectively See also, secure transfer.

Créer le mappeurCreate the mapper

Dans Visual Studio, créez une nouvelle application console .NET Framework nommée mapper.In Visual Studio, create a new .NET Framework console application named mapper. Utilisez le code suivant pour l’application :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);
                }
            }
        }
    }
}

Après avoir créé l’application, générez-la pour produire le fichier /bin/Debug/mapper.exe dans le répertoire du projet.After you create the application, build it to produce the /bin/Debug/mapper.exe file in the project directory.

Créer le raccord de réductionCreate the reducer

Dans Visual Studio, créez une nouvelle application console .NET Framework nommée reducer.In Visual Studio, create a new .NET Framework console application named reducer. Utilisez le code suivant pour l’application :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);
            }
        }
    }
}

Après avoir créé l’application, générez-la pour produire le fichier /bin/Debug/reducer.exe dans le répertoire du projet.After you create the application, build it to produce the /bin/Debug/reducer.exe file in the project directory.

Téléchargement vers le stockageUpload to storage

Ensuite, vous devez charger les applications mapper et reducer sur le stockage HDInsight.Next, you need to upload the mapper and reducer applications to HDInsight storage.

  1. Dans Visual Studio, sélectionnez Affichage > Explorateur de serveurs.In Visual Studio, select View > Server Explorer.

  2. Cliquez avec le bouton droit sur Azure, sélectionnez Se connecter à un abonnement Microsoft Azure... , puis terminez le processus de connexion.Right-click Azure, select Connect to Microsoft Azure Subscription..., and complete the sign in process.

  3. Développez le cluster HDInsight sur lequel vous souhaitez déployer cette application.Expand the HDInsight cluster that you wish to deploy this application to. Une entrée avec le texte (compte de stockage par défaut) est répertoriée.An entry with the text (Default Storage Account) is listed.

    Compte de stockage, cluster HDInsight, explorateur de serveurs, Visual Studio

    • Si l’entrée (compte de stockage par défaut) peut être développée, vous utilisez un compte de stockage Azure en tant que stockage par défaut pour le cluster.If the (Default Storage Account) entry can be expanded, you're using an Azure Storage Account as default storage for the cluster. Pour afficher les fichiers sur le stockage par défaut pour le cluster, développez l’entrée, puis double-cliquez sur le (conteneur par défaut) .To view the files on the default storage for the cluster, expand the entry and then double-click (Default Container).

    • Si l’entrée (compte de stockage par défaut) ne peut pas être développée, vous utilisez Azure Data Lake Storage en tant que stockage par défaut pour le cluster.If the (Default Storage Account) entry can't be expanded, you're using Azure Data Lake Storage as the default storage for the cluster. Pour afficher les fichiers sur le stockage par défaut pour le cluster, double-cliquez sur l’entrée (compte de stockage par défaut) .To view the files on the default storage for the cluster, double-click the (Default Storage Account) entry.

  4. Pour charger les fichiers .exe, appliquez l’une des méthodes suivantes :To upload the .exe files, use one of the following methods:

    • Si vous utilisez un compte de stockage Azure, sélectionnez l’icône Télécharger un objet Blob.If you're using an Azure Storage Account, select the Upload Blob icon.

      Icône de chargement de HDInsight pour le mappeur, Visual Studio

      Dans la boîte de dialogue Télécharger un nouveau fichier, sous Nom de fichier, sélectionnez Parcourir.In the Upload New File dialog box, under File name, select Browse. Dans la boîte de dialogue Télécharger un objet Blob, accédez au dossier bin\debug pour le projet mapper, puis sélectionnez le fichier 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. Enfin, sélectionnez Ouvrir, puis OK pour terminer le téléchargement.Finally, select Open and then OK to complete the upload.

    • Pour Azure Data Lake Storage, cliquez avec le bouton droit sur une zone vide de la liste des fichiers, puis sélectionnez Charger.For Azure Data Lake Storage, right-click an empty area in the file listing, and then select Upload. Enfin, sélectionnez le fichier mapper.exe et cliquez sur Ouvrir.Finally, select the mapper.exe file and then select Open.

    Une fois que le chargement de mapper.exe est terminé, répétez le processus de chargement pour le fichier reducer.exe.Once the mapper.exe upload has finished, repeat the upload process for the reducer.exe file.

Exécuter un travail : Utilisation d’une session SSHRun a job: Using an SSH session

La procédure suivante décrit comment exécuter un travail MapReduce à l’aide d’une session SSH :The following procedure describes how to run a MapReduce job using an SSH session:

  1. Utilisez la commande ssh pour vous connecter à votre cluster.Use ssh command to connect to your cluster. Modifiez la commande ci-dessous en remplaçant CLUSTERNAME par le nom de votre cluster, puis entrez la commande :Edit the command below by replacing CLUSTERNAME with the name of your cluster, and then enter the command:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Exécutez une des commandes suivantes pour démarrer la tâche MapReduce :Use one of the following commands to start the MapReduce job:

    • Si le stockage par défaut est Stockage Azure :If the default storage is Azure Storage:

      yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-streaming.jar \
          -files wasbs:///mapper.exe,wasbs:///reducer.exe \
          -mapper mapper.exe \
          -reducer reducer.exe \
          -input /example/data/gutenberg/davinci.txt \
          -output /example/wordcountout
      
    • Si le stockage par défaut est 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
      
    • Si le stockage par défaut est 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
      

    La liste suivante fournit la signification de chaque paramètre et option :The following list describes what each parameter and option represents:

    • hadoop-streaming.jar : Indique le fichier jar contenant la fonctionnalité MapReduce de streaming.hadoop-streaming.jar: Specifies the jar file that contains the streaming MapReduce functionality.
    • -files: Indique les fichiers mapper.exe et reducer.exe pour ce travail.-files: Specifies the mapper.exe and reducer.exe files for this job. La déclaration de protocole wasbs:///, adl:/// ou abfs:/// devant chaque fichier correspond au chemin d’accès à la racine du stockage par défaut pour le cluster.The wasbs:///, adl:///, or abfs:/// protocol declaration before each file is the path to the root of default storage for the cluster.
    • -mapper: Indique le fichier qui implémente le mappeur.-mapper: Specifies the file that implements the mapper.
    • -reducer: Indique le fichier qui implémente le raccord de réduction.-reducer: Specifies the file that implements the reducer.
    • -input: Indique les données d’entrée.-input: Specifies the input data.
    • -output: Indique le répertoire de sortie.-output: Specifies the output directory.
  3. Une fois le travail MapReduce terminé, utilisez la commande suivante pour afficher les résultats :Once the MapReduce job completes, use the following command to view the results:

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

    Le texte suivant est un exemple de données renvoyées par cette commande :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
    

Exécuter un travail : Utiliser PowerShellRun a job: Using PowerShell

Utilisez le script PowerShell suivant pour exécuter une tâche MapReduce et télécharger les résultats.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
}

Ce script vous invite à entrer le nom et le mot de passe du compte de connexion du cluster, ainsi que le nom du cluster HDInsight.This script prompts you for the cluster login account name and password, along with the HDInsight cluster name. Une fois que le travail est terminé, la sortie est téléchargée sous la forme d’un fichier nommé output.txt.Once the job completes, the output is downloaded to a file named output.txt. Le texte suivant constitue un exemple des données contenues dans le fichier output.txt :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

Étapes suivantesNext steps

Pour plus d’informations sur l’utilisation de MapReduce avec HDInsight, consultez Utiliser MapReduce dans Apache Hadoop sur HDInsight.For more information on using MapReduce with HDInsight, see Use MapReduce in Apache Hadoop on HDInsight.

Pour plus d’informations sur l’utilisation de C# avec Hive et Pig, consultez Utiliser une fonction définie par l’utilisateur C# avec Apache Hive et Apache Pig.For information on using C# with Hive and Pig, see Use a C# user-defined function with Apache Hive and Apache Pig.

Pour plus d’informations sur l’utilisation de C# avec Storm sur HDInsight, consultez Développer des topologies C# pour Apache Storm sur HDInsight.For information on using C# with Storm on HDInsight, see Develop C# topologies for Apache Storm on HDInsight.