現在JavaScriptの設定が無効になっています。このページを利用するにはJavaScriptの設定を有効にしてください。トップ全記事一覧テクノロジー2010.01.26Hadoopを使いこなす(1)こんにちは。今回は一歩踏み込んで、Hadoopの使いこなし方について書きたいと思います。今回は、ある程度Hadoopを使ったことのある方、Hadoopのインストールをして、オフィシャルページのMapReduceチュートリアルなどを試してみた方を対象としています。こちらでオフィシャルページの日本語訳もされていますので、試していない方は一度試してみることをおすすめします。前回の記事では、map関数とreduce関数と、その組み合わせが、MapReduceの肝だという話をしましたが、ある程度複雑な処理を行う場合は、map関数とreduce関数だけでなく、それ以外のポイントをどうカスタマイズするかも重要になってきます。MapReduceの詳細なフローを紹介した上で、カスタマイズできるポイントを紹介、最後に実例を紹介していきたいと思っています。MapReduceの詳細なフローでは、MapReduceの詳細なフローを見ていきましょう。カスタマイズポイントを紹介するための説明ですので、詳細な部分は省いています。)、多くのマシンに分散されます。一つのInputSplitごとに一つのMapTaskが割り当てられます。MapTaskとはMap処理を実行する単位のことで、多くのマシン上でMapTaskが並列に動くことになります。)し、map関数に引数として渡します。)され、それぞれが次に処理されるReduceTaskに割り当てられます。デフォルトのPartitionerでは、Keyのハッシュ値をもとに分割されます。MapTaskが実行されているマシンのローカルのディスクに書き出され、ReduceTaskからコピーされるのを待ちます。オプションでDistributedCacheと、Combinerを指定できます。)は、Taskが実行される前に、処理に必要なファイルを各マシンにコピーします。Reducerで自由に利用することができます。)は、Mapperの出力をさらに集計します。Combinerの新たな出力が、MapTaskの出力として書き出され、ReduceTaskからコピーされます。ミニReducerと呼べるものですが、MapperとReducerの間に入り、MapTask内で行われる点が、Reducerとは異なります。(次回の記事で詳しく解説します)では、ReduceTaskの流れを見ていきましょう。ReduceTaskでは、まず、各MapTaskが走っているマシンから、自分に割り当てられたPartitionのファイルをコピーします。コピーは終了したMapTaskから順に行われます。)が行われ、ファイルがまとめられます。)し、Keyとともにreduce関数に引数として渡します。)、MapReduceの出力となります。これらのフローの中で、カスタマイズできるポイントを紹介しましょう。カスタマイズできるポイントフロー中の処理と、カスタマイズするポイントの対応表は以下の通りです。カスタマイズポイントに書かれたクラスをカスタマイズして、MapReduceの初期化時にJobConfなどで指定します。入力ファイルを分割する方法は、InputFormatクラスの、getSplits関数を上書きすることで、カスタマイズできます。InputSplitから、KeyとValueを抽出する処理も、InputFormatクラスを通じてカスタマイズできます。InputFormatのgetRecordReader関数を通じて、RecordReaderクラスを生成するのですが、これに任意のRecordReaderクラスを指定すればOKです。Map処理ですが、ユーザが指定したMapperクラスの処理を実行します。Mapperクラスは、MapRunnerクラスを通じて、初期化処理、map関数を繰り返す過程、終了処理といった一連の流れを実行します。MapRunnerクラスをカスタマイズすれば、こうした流れを制御することができます。APIでは、Mapperクラス自体のrun関数で、流れを制御できます。Partitionの分割処理は、Partitionerクラスを指定することでカスタマイズできます。DistributedCacheは、MapReduceの初期化時にDistributedCacheのstaticメソッドを通じて、配布したいファイルを指定します。Combinerは、Combinerクラスを指定することでカスタマイズできます。ソートで、Keyを比較する方法は、Comparatorクラスを指定することでカスタマイズできます。ValueのグルーピングもComparatorクラスによってカスタマイズできますが、ソートの比較に用いるクラスとは別のクラスを指定できます。Reduce処理ですが、ユーザが指定したReducerクラスの処理を実行します。新しいAPIでは、初期化処理、reduce関数を繰り返す過程、終了処理といった流れを、Reducerクラスのrun関数を通じて行えます。Reducerの出力の書き出しは、OutputFormatクラスを通じてカスタマイズできます。OutputFormatのgetRecordWriter関数を通じて、RecordWriterクラスを生成するのですが、これに任意のRecordWriterクラスを指定すればOKです。最後にフローには書いてはいませんが、MapperやReducerのKeyやValueに使われる、Writableクラスのカスタマイズも重要なポイントになってきます。Writableクラスは、例えば、Textクラス、IntWritableクラスといったものです。JobConfでのこれらのカスタマイズポイントの設定例をのせておきます。//OutputFormatクラスを指定では、それぞれのカスタマイズポイントについて詳細にみていきましょう。APIには、0.20.0からの新しいAPIと、従来のAPIがあります。新しいAPIはまだ、MultipleInputsやMultipleOutputsに対応していないなど発展途上であり(0.20.1現在)、オフィシャルページのMapReduceチュートリアルも従来のAPIで書かれていることから、特に断りのない場合は、従来のAPIで記述していますので、ご注意下さい。InputFormatInputFormatのインターフェースは以下のようになっています。IOException;}getSplitsが、入力するファイルを分割する方法を定義する関数で、InputSplitの配列を返します。getRecordReaderは、InputSplitからKeyとValueを抽出する、RecordReaderクラスを返します。RecordReaderのインターフェースは以下のようになっています。createValueで、KeyとValueを初期化、next関数を繰り返し呼んで、KeyとValueに値をセットしていきます。ArchivesがどうInputFormatをカスタマイズしているか見ていきましょう。実際にファイルをまとめる処理はMapReduceで動いています。Archivesでは、MapReduce処理を行う前に、まず入力として受け取ったファイルのリストを書き出します。SequenseFileという、MapReduceのKeyとValueをそのまま扱える形式で書き出され、Keyが実際のファイルのサイズ、Valueがファイルへのパスなどになっています。実際にはValueはもっと複雑な形式になっていますが、説明のためファイルへのパスということにしておきます。/path/to/fileDMapperはこのファイルリストを入力とします。map関数では、Valueにファイルのパスがセットされますが、ここからmap関数内で実際にファイルを読み出し、MapTaskごとにまとめて一つのファイルとして出力します。デフォルトでは、ファイルリスト自体のサイズにもとづいて、InputSplitが分割されるので、Mapperでまとめたファイルの出力サイズに大きな差が出てきてしまいます。そこで、HadoopArchivesでは、KeyのファイルサイズにもとづいてファイルリストをInputSplitに分割するという処理を行っています。/path/to/fileDというように、Keyのファイルサイズを読んで、ファイルサイズの合計がなるべく均等になるように、fileCとfileDの間で、分割します。ちなみに、Reducerでは、Mapperでまとめたファイルにおける実際のファイルのインデックスなどの情報を書き出すようになっています。元から用意されているInputFormatでも、入力テキストを区切り文字でKeyとValueに分割して、Mapperの入力のKey/Valueとして扱えるKeyValueTextInputFormat,小さいファイルをまとめて扱えるCombineFileInputFormatなど便利なものが多くありますので、調べてみてください。直接は関係ありませんが、入力ファイルに応じて複数のMapperクラスやInputFormatを割り当てられる、MultipleInputsという仕組みもあります。次回は、残りのカスタマイズポイントを解説します。P.S.GoogleがMapReduceの特許を取得したことには驚きました。Hadoopに影響するのかどうか気になるところですね。JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。JAPANのサービス開発を支える技術やデザイン、文化を発信しています。Reserved.このページの先頭へ。