目次

Hadoop覚え書き

インストール方法

Scientific LinuxにHadoop/Map-Reduceをインストールしたときのメモ。

1.レポジトリの追加

 # cd /etc/yum.repos.d/
 # wget http://archive-primary.cloudera.com/cdh5/redhat/6/x86_64/cdh/cloudera-cdh5.repo
 # yum update yum
 # yum search hadoop

2.ダウンロード&インストール

 # yum install hadoop-0.20-mapreduce-jobtracker.x86_64
 # yum install hadoop-hdfs-namenode.x86_64
 # yum install hadoop-hdfs-secondarynamenode.x86_64
 # yum install hadoop-0.20-mapreduce-tasktracker.x86_64
 # yum install hadoop-hdfs-datanode.x86_64
 # yum install hadoop-client.x86_64

3.環境変数の設定

.bash_profile等に下記内容を追加

 . /etc/default/hadoop

Hadoop streamingでの実行方法

標準入出力でデータ入出力ができるHadoop streamingを使用。 プログラム例として、WordcountをC++で実装しスタンドアロンモードで実行。

Mapperの作製

mapper.cpp
#include<iostream>
#include<string>
 
main(){
  using namespace std;
 
  string str;
  int count = 1;
 
  // 文字列が標準入力から送られてくるので、単語ごとに取り出す
  while(cin>>str){
    // "単語","タブ文字","1","改行"の順に標準出力に出力する。
    cout << str << "\t" << count << endl;
  }
}

コンパイル

 # gcc -o mapper -lstdc++ mapper.cpp

Reducerの作製

reducer.cpp
#include<iostream>
#include<map>
#include<string>
 
main(){
  using namespace std;
 
  map<string, int> data;
  string str;
  int count;
 
  // "単語","数"の順に標準入力から送られてくるので、格納する
  while((cin>>str>>count)){
    // "単語"をキーとする連想配列に格納。キーが存在する場合は数を足しこむ
    if(data.find(str) == data.end()){
       data[str] = count;
    }else{
       data[str] += count;
    }
  }
 
  // 連想配列のデータを列挙する
  map<string, int>::iterator itr;
  for(itr=data.begin(); itr!=data.end(); itr++){
    cout<< itr->first << " " << itr->second << endl;
  }
}

コンパイル

 # gcc -o reducer -lstdc++ reducer.cpp

入力ファイルの用意

 $ mkdir input

inputディレクトリの中に適当にテキストファイルを作成しておく。例えば

test1
This is a pen
test2
This is a ball

MapperとReducerの動作確認

  $ cat input/* | ./mapper | ./reducer

Hadoop Streaming(スタンドアロンモード)での実行

 $ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -file ./mapper -mapper ./mapper -file ./reducer -reducer ./reducer -input input/* -output output

実行結果確認

 $ cat output/*

擬似分散モード

初期設定

# sudo -u hdfs hdfs namenode -format
# /usr/lib/hadoop/libexec/init-hdfs.sh

サービスの実行

for x in `cd /etc/init.d ; ls hadoop-0.20-mapreduce-*` ; do sudo service $x start ; done

ユーザディレクトリの追加

# sudo -u hdfs hadoop fs -mkdir /user/hogehoge
# sudo -u hdfs hadoop fs -chown hogehoge /user/hogehoge

Safe modeをOFFにする

# sudo -u hdfs hadoop dfsadmin -safemode leave

↑のコマンドはrootでないと実行できないので、全ユーザに権限を付与。rootでvisudoを起動し

# visudo

下記内容を追加

ALL localhost=(hdfs) NOPASSWD: /usr/bin/hadoop

localhostは実行するマシンのホスト名にしないとうまくいかない

hadoop streamingの実行

$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.5.0-mr1-cdh5.2.0.jar -file ./mapper -mapper ./mapper -file ./reducer -reducer ./reducer -input prog/input/* -output output