Hadoopの疑似分散モード

Hadoop (大型本)スタンドアローンモードでの動作ビルド方法を確認したら、次は疑似分散モードです。

スタンドアローンモードではローカルのファイルシステムを使っていたのに対し、疑似分散モードでは分散ファイルシステム(HDFS)を使います。もちろん、マシンが1台なので、HDFSのコンテンツは本当はローカルにあるわけですが、見た目はそうではなくなります。

利用方法は、クイックスタートのとおりです(前に作成した入力データinputがあるとして)。

  1. 設定用のXMLファイル(core-site.xmlとhdfs-site.xml, mapred-site.xml)を書き換える
  2. パスフレーズなしでlocalhostにssh接続できるようにする
  3. HDFSのフォーマット
    bin/hadoop namenode -format
    
  4. Hadoopデーモンの起動
    bin/start-all.sh
    
  5. 入力ファイルをHDFSにコピー(3番目の引数はローカル、4番目の引数はHDFSのファイル名)
    bin/hadoop fs -put input input
    
  6. プログラムの実行(WordCountの場合)
    bin/hadoop fs -rmr output
    bin/hadoop jar hadoop-0.20.1-examples.jar wordcount input output
    
  7. HDFS上の結果を読む
    bin/hadoop fs -cat "output/*"
    a       3
    b       3
    c       2
    
  8. Hadoopデーモンの停止
    bin/stop-all.sh
    

HDFSの様子はhttp://localhost:50070/で、MapReduceの様子はhttp://localhost:50030/でわかります。(外部からでも見えますが、その場合にはファイアウォールを正しく設定しておく必要があります。)

ヒント

  • デーモンを起動する前にフォーマットする
  • うまくいかないときは、デーモンを停止させてから/tmp/hadoop*を削除し、やり直す

つづく

  • Eclipseプラグイン
  • 完全分散モード
  • Cloudera’s Distribution for Hadoop

Hadoopコードのビルド方法

Hadoop (大型本)Hadoopの導入とサンプルによる動作確認が終わったら、コードをビルド・実行してみたくなります。

例として、Map/Reduce チュートリアルで紹介されている単語を数えるプログラムWordCount v1.0をビルドしてみましょう。

パッケージ構成通りにディレクトリを作成し、コードを記述します。

mkdir -p org/myorg
touch org/myorg/WordCount.java
WordCount.javaを編集

Classファイルを格納するディレクトリを作ります。

mkdir wordcount_classes

コンパイルします(環境変数はどこかで1回設定すればいいです)。

export HADOOP_HOME=/home/yabuki/hadoop-0.20.1
export HADOOP_VERSION=0.20.1
javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar -d wordcount_classes org/myorg/WordCount.java

Classファイルをjarにまとめます。

jar -cvf wordcount.jar -C wordcount_classes/ .

入力データを作ります。

mkdir input
echo 'a b c' > input/a
echo 'a c b b a' > input/b

実行します。

rm -rf output
${HADOOP_HOME}/bin/hadoop jar wordcount.jar org.myorg.WordCount input output

結果を確認します。

cat output/*
a       3
b       3
c       2

AntやMavenのようなビルドツールを使うのが正統なのですが、あとでEclipseを使う方法を紹介するので、どうでもいいでしょう。

つづく

  • 疑似分散モード
  • Eclipseプラグイン
  • 完全分散モード
  • Cloudera’s Distribution for Hadoop

Hadoopの導入方法(スタンドアロンモード)

Hadoop (大型本)Googleが2004年に提唱した分散処理技術MapReduceがあると、手続きをmapとreduceという2つの形式に分けて記述しさえすれば、データを複数の計算機で分散処理できるようになります。

Googleが利用しているMapReduceの実装は公開されていませんが、Hadoopというオープンソースの実装を利用することで、MapReduceを簡単に試すことができます。具体的な方法は以下の通りです(GNU/Linuxの場合)。詳細はクイックスタートを参照。

  1. SunのJDKをインストールする
  2. Hadoopをダウンロード・展開する
    wget http://ftp.kddilabs.jp/infosystems/apache/hadoop/core/hadoop-0.20.1/hadoop-0.20.1.tar.gz
    tar zxf hadoop-0.20.1.tar.gz
    cd hadoop-0.20.1
    
  3. conf/hadoop-env.shに、「JAVA_HOME=/usr/java/latest」のようにしてJDKの場所を記述する。

Hadoopには、スタンドアロンモードと疑似分散モード、完全分散モードという3つの動作モードがあります。運用時には完全分散モードにしなければなりませんが、ここではもっとも簡単なスタンドアロンモードで動作を、Hadoopに付属するサンプルで確認します(付属サンプルは「bin/hadoop jar hadoop-*-examples.jar」として確認できます)。

まず、入力データを用意します。

mkdir input
echo 'a b c' > input/a
echo 'a c b b a' > input/b

ディレクトリinputにあるファイルの中身の単語数は、サンプルのwordcountを使って次のようにして数えられます。

rm -rf output
bin/hadoop jar hadoop-*-examples.jar wordcount input output
cat output/*
a       3
b       3
c       2

サンプルをもう一つ試します。

cat > problem.dat <<'EOF'
1 ? ? ? ? 7 ? 9 ?
? 3 ? ? 2 ? ? ? 8
? ? 9 6 ? ? 5 ? ?
? ? 5 3 ? ? 9 ? ?
? 1 ? ? 8 ? ? ? 2
6 ? ? ? ? 4 ? ? ?
3 ? ? ? ? ? ? 1 ?
? 4 ? ? ? ? ? ? 7
? ? 7 ? ? ? 3 ? ?
EOF

この数独(Ai Escargot)は、サンプルのsudokuを使って次のように解けます(ファイルの形式はsrc/examples/org/apache/hadoop/examples/dancing/puzzle1.dtaを参照)。

bin/hadoop jar hadoop-*-examples.jar sudoku problem.dat
1 6 2 8 5 7 4 9 3
5 3 4 1 2 9 6 7 8
7 8 9 6 4 3 5 2 1
4 7 5 3 1 2 9 8 6
9 1 3 5 8 6 7 4 2
6 2 8 7 9 4 1 3 5
3 5 6 4 7 8 2 1 9
2 4 1 9 3 5 8 6 7
8 9 7 2 6 1 3 5 4
Found 1 solutions

つづく