SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Hadoop MapReduceプログラムを解剖する

サンプルコードを使って、MapReduceの構造を理解する

4.環境設定

 本記事はソースコードの解釈を目的としているため、環境設定については細かく言及しませんが、Hadoop MapReduceをコンパイルして実行するための環境を整備するには、EclipseとEclipseプラグインが便利です。Eclipseにコードを入れ、コンパイルし、Driverを実行するなら、Hadoopノードとは別のノード(Windowsなど)からでもジョブをサブミットできます。

  1. Linux上にインストールしたHadoopのフォルダをごっそりローカルディスクにも置きます(必要ないファイルもたくさんありますが)
  2. /hadoop-0.20.2/contrib/eclipse-plugin/hadoop-0.20.2-eclipse-plugin.jarを、Eclipseのpluginsフォルダにコピーし、再起動します(各ビルドにも入っています)
  3. Eclipseのワークスペース上で、MapReduceプロジェクトを作ります。このとき、Hadoopのロケーションを聞かれるので、先ほどのフォルダを指定します

 これだけで、Hadoop MapReduceに必要なJARにクラスパスが通ったJavaプロジェクトとなります。ネームノードなどの指定はコード中で行うので、プロジェクトの設定には必要ありません。

 このMapReduceプロジェクトは、プラグインが正常に動作する環境(Hadoopのネームノード上など)であれば右クリックしてサブミットできるのですが、Hadoopノードとは別のWindows環境などではその機能が働きませんので、MapReduceジョブをJARにエクスポートして、別のプロジェクトからサブミットする、という方法がスマートです。HDFSへのアクセス機能は正しく設定すれば働くので、利用すると便利です(クラスター外のWindowsで働かない理由は、シェルコマンドを使うからと推測されます)。

 筆者は、MapReduceジョブを入れたプロジェクトと、Driverを入れたプロジェクトを2つセットで作ります。MapReduceを作ったプロジェクトをJARとしてDriverプロジェクトに作ったlibフォルダにエクスポートしてクラスパスへ追加し、そのJARをMapReduceジョブとしてサブミットするのです(MapperやReducerのコードを修正したら、エクスポートしなおすのを忘れないようにします)。

図3.MapReduceジョブのJARとDriverの関係
図3.MapReduceジョブのJARとDriverの関係

5.MapperとReducer

 リスト1、リスト2に、それぞれ、MapperとReducerのサンプルを示しています。キーとバリューの関係を、で表現し、先ほどの図と一致させることで比較しやすいようにしてみました。

リスト1.Mapper
package com.yone.mapreduce;

import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
   private final static Text word = new Text();
  private final static IntWritable one = new IntWritable(1);

   public void map(LongWritable key, Text value, Context context)
     throws IOException, InterruptedException {

     // すべての単語に「1」という数値を付けて、出力する
     String line = value.toString();
     StringTokenizer tokenizer = new StringTokenizer(line);
      while (tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken());
        context.write(word, one);
     }

   }
}
リスト2.Reducer
package com.yone.mapreduce;

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MyReducer extends
   Reducer<Text, IntWritable, Text, IntWritable> {
   private IntWritable result = new IntWritable();

   public void reduce(Text key, Iterable<IntWritable> values, Context context)
      throws IOException, InterruptedException {

     // 同じキーに対して、すべてのバリュー(数値が大量に渡ってくる)を足し算して合計する
      int sum = 0;
      for (IntWritable val : values) {
         sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
   }
}

 この2つのファイルをMepReduceプロジェクト(クラスパスの通ったJavaプロジェクト)に作り、JARにエクスポートします。

次のページ
6.Driver

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

米持 幸寿(ヨネモチ ユキヒサ)

日本アイ・ビー・エム公認 ソフトウェア・エバンジェリスト。alphaWorks、developerWorks、インキュベーション系製品、アセットなどのテクノロジーの推進をしつつ、テクノロジー戦略、エバンジェリストチームをリードしている。講演や執筆も多数。主な著書に「かんたんサーバーサイドJava」(翔泳社)、「Webサービス完全解説」(翔泳社)がある。developerWorks Japan ブログ 「米持幸寿のブログ

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5582 2010/11/30 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー