C#でMapReduceを作成して実行する

MapReduce

MapReduceHadoop上で分散処理するためのプログラミングパターンです。言わずと知れたものですよね。

Hadoop Streaming

Java以外の言語でMapReduceを作成する場合、Hadoopストリーミングを利用します。仕組みは簡単でデータを標準入出力を介して受け渡す方式です。標準入力からテキストデータを受け取り、標準出力にテキストデータを出力することでHadoop側とやり取りを行います。コンソールアプリを作成すれば標準入出力を行うプログラムが作成できますので、今回はこの方式でMapReduceを作成します。

サンプル

お題はMapReduceチュートリアルといえばこれ、ワードカウントのサンプルで、Running HDInsight C# Hadoop Streaming Sampleのサンプルを参考にしました。

Mapperコード

using System;
using System.IO;

namespace Cat
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                Console.SetIn(new StreamReader(args[0]));
            }

            string line;
            while ((line = Console.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }
    }
}

Reducerコード

using System;
using System.IO;
using System.Linq;

namespace Wc
{
    class Program
    {
        static void Main(string[] args)
        {
            string line;
            var count = 0;

            if (args.Length > 0)
            {
                Console.SetIn(new StreamReader(args[0]));
            }

            while ((line = Console.ReadLine()) != null)
            {
                count += line.Count(cr => (cr == ' ' || cr == '\n'));
            }
            Console.WriteLine(count);
        }
    }
}

MapReduceの実行

MapReduceの実行にはHDInsight Studioを利用します。まずはワードカウントするファイルのアップロードです。


ここでは先ほど作成したプログラムをアップロードしました。
次にメニューからJob−MapReduceを選択して、MapReduce実行用の画面を表示します。最初にアップロードしたファイルのパスを指定し、MapperとReducerのプログラムファイルを指定します。


実行するとJobが動作します。プログラムは自動的に毎回配置されます。