HDInsight'ta Apache Hadoop üzerinde MapReduce akışı ile C# kullanma

HDInsight'ta MapReduce çözümü oluşturmak için C# kullanmayı öğrenin.

Apache Hadoop akışı, bir betik veya yürütülebilir dosya kullanarak MapReduce işlerini çalıştırmanıza olanak tanır. Burada bir sözcük sayısı çözümü için eşleyiciyi ve azaltıcıyı uygulamak için .NET kullanılır.

HDInsight üzerinde .NET

HDInsight kümeleri .NET uygulamalarını çalıştırmak için Mono (https://mono-project.com) kullanır. Mono sürüm 4.2.1, HDInsight sürüm 3.6'ya dahildir. HDInsight ile birlikte gelen Mono sürümü hakkında daha fazla bilgi için bkz . HDInsight sürümleriyle kullanılabilen Apache Hadoop bileşenleri.

.NET Framework sürümleriyle Mono uyumluluğu hakkında daha fazla bilgi için bkz . Mono uyumluluğu.

Hadoop akışı nasıl çalışır?

Bu belgede akış için kullanılan temel işlem aşağıdaki gibidir:

  1. Hadoop verileri STDIN'deki eşleyiciye (bu örnekte mapper.exe ) geçirir.
  2. Eşleyici verileri işler ve sekmeyle ayrılmış anahtar/değer çiftlerini STDOUT'a yayar.
  3. Çıktı Hadoop tarafından okunur ve stdin üzerindeki azaltıcıya (bu örnekte reducer.exe ) geçirilir.
  4. Azaltıcı sekmeyle ayrılmış anahtar/değer çiftlerini okur, verileri işler ve ardından sonucu STDOUT'ta sekmeyle ayrılmış anahtar/değer çiftleri olarak yayar.
  5. Çıktı Hadoop tarafından okunur ve çıkış dizinine yazılır.

Akış hakkında daha fazla bilgi için bkz . Hadoop Akış.

Önkoşullar

  • Visual Studio.

  • .NET Framework 4.5'i hedefleyen C# kodu yazma ve derleme hakkında bilgi.

  • .exe dosyaları kümeye yüklemenin bir yolu. Bu belgedeki adımlar, dosyaları kümenin birincil depolama alanına yüklemek için Visual Studio için Data Lake Araçları'nı kullanır.

  • PowerShell kullanıyorsanız Az Modülü gerekir.

  • HDInsight üzerinde bir Apache Hadoop kümesi. Bkz . Linux'ta HDInsight'ı kullanmaya başlama.

  • Kümelerinizin birincil depolama alanı için URI şeması. Bu şema Azure Depolama, abfs:// Azure Data Lake Storage 2. Nesil veya adl:// Azure Data Lake Storage 1. Nesil için olabilirwasb://. Azure Depolama veya Data Lake Storage 2. Nesil için güvenli aktarım etkinleştirildiyse, URI sırasıyla veya abfss://olurwasbs://.

Eşleyiciyi oluşturma

Visual Studio'da mapper adlı yeni bir .NET Framework konsol uygulaması oluşturun. Uygulama için aşağıdaki kodu kullanın:

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

Uygulamayı oluşturduktan sonra proje dizininde /bin/Debug/mapper.exe dosyasını oluşturmak için oluşturun.

Azaltıcıyı oluşturma

Visual Studio'da reducer adlı yeni bir .NET Framework konsol uygulaması oluşturun. Uygulama için aşağıdaki kodu kullanın:

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

Uygulamayı oluşturduktan sonra proje dizininde /bin/Debug/reducer.exe dosyasını oluşturmak için oluşturun.

Depolama alanına yükleme

Ardından eşleştirici ve azaltıcı uygulamalarını HDInsight depolama alanına yüklemeniz gerekir.

  1. Visual Studio'da Sunucu Gezginini Görüntüle'yi>seçin.

  2. Azure'a sağ tıklayın, Microsoft Azure Aboneliğine Bağlan... öğesini seçin ve oturum açma işlemini tamamlayın.

  3. Bu uygulamayı dağıtmak istediğiniz HDInsight kümesini genişletin. (Varsayılan Depolama Hesabı) metnini içeren bir girdi listelenir.

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

    • (Varsayılan Depolama Hesabı) girişi genişletilebilirse, küme için varsayılan depolama alanı olarak bir Azure Depolama Hesabı kullanıyorsunuz demektir. Kümenin varsayılan depolama alanı üzerindeki dosyaları görüntülemek için girdiyi genişletin ve ardından (Varsayılan Kapsayıcı) öğesine çift tıklayın.

    • (Varsayılan Depolama Hesabı) girişi genişletilemiyorsa, küme için varsayılan depolama alanı olarak Azure Data Lake Depolama kullanıyorsunuz demektir. Küme için varsayılan depolamadaki dosyaları görüntülemek için (Varsayılan Depolama Hesabı) girdisine çift tıklayın.

  4. .exe dosyalarını karşıya yüklemek için aşağıdaki yöntemlerden birini kullanın:

    • Azure Depolama Hesabı kullanıyorsanız Blobu Karşıya Yükle simgesini seçin.

      HDInsight upload icon for mapper, Visual Studio.

      Yeni Dosyayı Karşıya Yükle iletişim kutusundaki Dosya adı'nın altında Gözat'ı seçin. Blobu Karşıya Yükle iletişim kutusunda, eşleyici projesinin bin\debug klasörüne gidin ve mapper.exe dosyasını seçin. Son olarak, karşıya yüklemeyi tamamlamak için Aç'ı ve ardından Tamam'ı seçin.

    • Azure Data Lake Depolama için dosya listesinde boş bir alana sağ tıklayın ve karşıya yükle'yi seçin. Son olarak, mapper.exe dosyasını ve ardından Aç'ı seçin.

    mapper.exe karşıya yükleme işlemi tamamlandıktan sonra reducer.exe dosyası için karşıya yükleme işlemini yineleyin.

İş çalıştırma: SSH oturumu kullanma

Aşağıdaki yordamda SSH oturumu kullanarak MapReduce işinin nasıl çalıştırıldığı açıklanmaktadır:

  1. Kümenize bağlanmak için ssh komutunu kullanın. CLUSTERNAME değerini kümenizin adıyla değiştirerek aşağıdaki komutu düzenleyin ve komutunu girin:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. MapReduce işini başlatmak için aşağıdaki komutlardan birini kullanın:

    • Varsayılan depolama Azure Depolama ise:

      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
      
    • Varsayılan depolama Data Lake Storage 1. Nesil:

      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
      
    • Varsayılan depolama Data Lake Storage 2. Nesil:

      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
      

    Aşağıdaki listede her parametre ve seçeneğin neyi temsil ettiği açıklanmaktadır:

    Parametre Açıklama
    hadoop-streaming.jar MapReduce akış işlevini içeren jar dosyasını belirtir.
    -Dosyaları Bu iş için mapper.exe ve reducer.exe dosyalarını belirtir. wasbs:///Her dosyadan önceki , adl:///veya abfs:/// protokol bildirimi, küme için varsayılan depolamanın kök yoludur.
    -Eşleştiricisi Eşleyiciyi uygulayan dosyayı belirtir.
    -Redüktör Azaltıcıyı uygulayan dosyayı belirtir.
    -Giriş Giriş verilerini belirtir.
    -Çıkış Çıkış dizinini belirtir.
  3. MapReduce işi tamamlandıktan sonra sonuçları görüntülemek için aşağıdaki komutu kullanın:

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

    Aşağıdaki metin, bu komut tarafından döndürülen verilerin bir örneğidir:

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

İş çalıştırma: PowerShell kullanma

MapReduce işini çalıştırmak ve sonuçları indirmek için aşağıdaki PowerShell betiğini kullanın.

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

Bu betik, HDInsight küme adıyla birlikte küme oturum açma hesabı adını ve parolasını ister. İş tamamlandıktan sonra çıktı output.txt adlı bir dosyaya indirilir. Aşağıdaki metin, dosyadaki output.txt verilerin bir örneğidir:

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

Sonraki adımlar