Megosztás a következőn keresztül:


A C# használata a MapReduce streameléssel az Apache Hadoopon a HDInsightban

Megtudhatja, hogyan hozhat létre MapReduce-megoldást a HDInsighton a C# használatával.

Az Apache Hadoop streamelése lehetővé teszi a MapReduce-feladatok futtatását szkript vagy végrehajtható fájl használatával. Itt a .NET használatával implementáljuk a leképezőt és a redukátort egy szószám-megoldáshoz.

.NET a HDInsighton

A HDInsight-fürtök a Mono (https://mono-project.com).NET-alkalmazások futtatásához) használatával működnek. A 4.2.1-es monoverzió a HDInsight 3.6-os verziója. A HDInsighthoz mellékelt Mono verziójáról további információt a HDInsight-verziókban elérhető Apache Hadoop-összetevőkben talál.

Az .NET-keretrendszer-verziókkal való monokompatibilitásról további információt a Mono kompatibilitás című témakörben talál.

A Hadoop streamelésének működése

A dokumentumban a streameléshez használt alapfolyamat a következő:

  1. A Hadoop adatokat ad át a leképezőnek (ebben a példában mapper.exe ) az STDIN-en.
  2. A leképező feldolgozza az adatokat, és tabulátorral tagolt kulcs/érték párokat bocsát ki az STDOUT-nak.
  3. A kimenetet a Hadoop olvassa be, majd átadja a redukátornak (ebben a példában reducer.exe ) az STDIN-en.
  4. A redukátor beolvassa a tabulátorral tagolt kulcs/érték párokat, feldolgozza az adatokat, majd tabulátorral tagolt kulcs/érték párokként bocsátja ki az eredményt az STDOUT-on.
  5. A kimenetet a Hadoop felolvassa, és a kimeneti könyvtárba írja.

További információ a streamelésről: Hadoop Streaming.

Előfeltételek

  • A Visual Studióval.

  • A 4.5-ös .NET-keretrendszer megcélozó C#-kód írásának és készítésének ismerete.

  • A .exe fájlok fürtbe való feltöltésének módja. A dokumentum lépései a Data Lake Tools for Visual Studio használatával töltik fel a fájlokat a fürt elsődleges tárolójára.

  • A PowerShell használata esetén szüksége lesz az Az modulra.

  • Apache Hadoop-fürt a HDInsighton. Tekintse meg a HDInsight linuxos használatának első lépéseit.

  • A fürtök elsődleges tárolójának URI-sémája. Ez a séma az Azure Storage, abfs:// az Azure Data Lake Storage Gen2 vagy adl:// az Azure Data Lake Storage Gen1 esetében lennewasb://. Ha az Azure Storage vagy a Data Lake Storage Gen2 esetében engedélyezve van a biztonságos átvitel, az URI vagy abfss://az URI leszwasbs://.

A leképező létrehozása

A Visual Studióban hozzon létre egy új .NET-keretrendszer mapper nevű konzolalkalmazást. Használja a következő kódot az alkalmazáshoz:

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

Az alkalmazás létrehozása után hozza létre a /bin/Debug/mapper.exe fájlt a projektkönyvtárban.

A redukátor létrehozása

A Visual Studióban hozzon létre egy új .NET-keretrendszer-konzolalkalmazást, melynek neve reducer. Használja a következő kódot az alkalmazáshoz:

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

Az alkalmazás létrehozása után hozza létre a /bin/Debug/reducer.exe fájlt a projektkönyvtárban.

Feltöltés tárolóba

Ezután fel kell töltenie a mapper és a redukátoralkalmazásokat a HDInsight-tárolóba.

  1. A Visual Studióban válassza a Kiszolgálókezelő megtekintése lehetőséget>.

  2. Kattintson a jobb gombbal az Azure-ra, válassza Csatlakozás a Microsoft Azure-előfizetéshez... és fejezze be a bejelentkezési folyamatot.

  3. Bontsa ki az alkalmazást üzembe helyezni kívánt HDInsight-fürtöt. Megjelenik egy szöveggel (alapértelmezett tárfiók) rendelkező bejegyzés.

    Storage account, HDInsight cluster, Server Explorer, Visual Studio.

    • Ha az (alapértelmezett tárfiók) bejegyzés kibontható, akkor egy Azure Storage-fiókot használ a fürt alapértelmezett tárolójaként. A fürt alapértelmezett tárolójának fájljainak megtekintéséhez bontsa ki a bejegyzést, majd kattintson duplán a (Alapértelmezett tároló) elemre.

    • Ha az (alapértelmezett tárfiók) bejegyzés nem bontható ki, akkor az Azure Data Lake Storage-t használja a fürt alapértelmezett tárolójaként. A fürt alapértelmezett tárolóján lévő fájlok megtekintéséhez kattintson duplán az (Alapértelmezett tárfiók) bejegyzésre.

  4. A .exe fájlok feltöltéséhez használja az alábbi módszerek egyikét:

    • Ha Azure Storage-fiókot használ, válassza a Blob feltöltése ikont.

      HDInsight upload icon for mapper, Visual Studio.

      Az Új fájl feltöltése párbeszédpanel Fájlnév csoportjában válassza a Tallózás lehetőséget. A Blob feltöltése párbeszédpanelen lépjen a mapper projekt bin\debug mappájába, majd válassza ki a mapper.exe fájlt. Végül válassza a Megnyitás , majd az OK gombot a feltöltés befejezéséhez.

    • Az Azure Data Lake Storage esetében kattintson a jobb gombbal egy üres területre a fájllistában, majd válassza a Feltöltés lehetőséget. Végül válassza ki a mapper.exe fájlt, majd válassza a Megnyitás lehetőséget.

    Ha a mapper.exe feltöltés befejeződött, ismételje meg a reducer.exe fájl feltöltési folyamatát.

Feladat futtatása: SSH-munkamenet használata

Az alábbi eljárás azt ismerteti, hogyan futtathat MapReduce-feladatokat egy SSH-munkamenet használatával:

  1. Az ssh paranccsal csatlakozzon a fürthöz. Szerkessze az alábbi parancsot úgy, hogy lecseréli a CLUSTERNAME nevet a fürt nevére, majd írja be a parancsot:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. A MapReduce-feladat elindításához használja az alábbi parancsok egyikét:

    • Ha az alapértelmezett tároló az 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
      
    • Ha az alapértelmezett tároló a 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
      
    • Ha az alapértelmezett tároló a 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
      

    Az alábbi lista az egyes paraméterek és beállítások jelentését ismerteti:

    Paraméter Leírás
    hadoop-streaming.jar Megadja a streamelési MapReduce funkciót tartalmazó jar-fájlt.
    -Fájlokat Megadja a feladathoz tartozó mapper.exe és reducer.exe fájlokat. Az wasbs:///egyes fájlok előtti , adl:///vagy abfs:/// protokolldeklaráció a fürt alapértelmezett tárolójának elérési útja.
    -Mapper Megadja a leképezőt megvalósító fájlt.
    -Szűkítő Megadja a redukátort megvalósító fájlt.
    -Bemenet Megadja a bemeneti adatokat.
    -Kimeneti Megadja a kimeneti könyvtárat.
  3. A MapReduce-feladat befejeződése után az alábbi paranccsal tekintheti meg az eredményeket:

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

    Az alábbi szöveg egy példa a parancs által visszaadott adatokra:

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

Feladat futtatása: A PowerShell használata

A mapReduce-feladat futtatásához és az eredmények letöltéséhez használja a következő PowerShell-szkriptet.

# 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
}

Ez a szkript kéri a fürt bejelentkezési fiókjának nevét és jelszavát, valamint a HDInsight-fürt nevét. A feladat befejezése után a kimenet egy output.txt nevű fájlba lesz letöltve. Az alábbi szöveg egy példa a output.txt fájlban lévő adatokra:

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

Következő lépések