低スペックな頭の僕がhadoopの環境を作ってうごかしてみる

黄色い象さんでおなじみのhadoopですが正直のところあまりよくわかっていません。流石にそろそろまずいとおもうのでさっそく環境作って動かしてみます。今回は超ざっくりSingleNodeSetupのドキュメントを訳したりしながら進めます。

hadoopってなんぞ

hadoopのOverviewにはこんなこと書いています。*1

  • MapReduce*2
    • 超でっかいデータセット(テラバイト)を数千ノードのでっかいクラスタで分散処理を簡単に書くためのフレームワーク
    • データセットを分けて、バラバラに処理する
    • タスクのスケジューリングや失敗したタスクの再実行もする
  • HDFS*3
  • Common
    • File System Shell/Service Level Authorization/Native Libraries
    • サブプロジェクト見ろし

相変わらず僕の訳がひどいので原文みてくだしあ><Getting Startedに従ってSingle Node Setupをやってみます。

Single Node Setupをやってみる。

ドキュメントはこちらターゲットはOracle Virtualbox上のScientificLinux6.1を利用。

サポートしてるプラットフォームと必要なソフト

Linuxだったらdevelopmentとproductionをサポートするよ。windowsはdevelopmentのみサポートするよってことらしい。今回はScientificLinuxなのでとくに問題なさそう。必要なアプリはJava1.6とsshsshdが必須。windowsCygwinがいるよってことらしい。今回はScientificLinuxなのでJava1.6とsshsshdがあればおk。

インストール

ドキュメントを読むとrsyncもいるみたいなのでインストールします。

//rsyncインストール
# yum install rsync

ScientificLinux6.1にはデフォルトで入っているので必要なかったようです。ついでにJava1.6をインストールしましょう。openjdkでいいよね。

//openJDKインストール
# yum install java-1.6.0-openjdk

これでインストールするとランタイムしかインストールされません。開発環境をつけてインストールしたいのでjava-1.6.0-openjdk-develというパッケージを選びます。テヘペロ

//openJDKインストール
# yum install java-1.6.0-openjdk-devel

hadoop本体をダウンロードします。適当なディレクトリに移動して以下のコマンドを実行。

//hadoop本体のダウンロード
$ wget http://ftp.kddilabs.jp/infosystems/apache//hadoop/common/stable/hadoop-0.20.203.0rc1.tar.gz

展開したらこんな感じ

[reg@anko hadoop-0.20.203.0]$ ll
合計 6632
-rw-rw-r--.  1 reg reg  412413  5月  4 15:30 2011 CHANGES.txt
-rw-rw-r--.  1 reg reg   13366  5月  4 15:30 2011 LICENSE.txt
-rw-rw-r--.  1 reg reg     101  5月  4 15:30 2011 NOTICE.txt
-rw-rw-r--.  1 reg reg    1366  5月  4 15:30 2011 README.txt
drwxr-xr-x.  2 reg reg    4096  8月 24 16:46 2011 bin
-rw-rw-r--.  1 reg reg   97666  5月  4 15:30 2011 build.xml
drwxr-xr-x.  4 reg reg    4096  5月  5 00:00 2011 c++
drwxr-xr-x.  2 reg reg    4096  8月 24 16:45 2011 conf
drwxr-xr-x. 14 reg reg    4096  5月  4 15:30 2011 contrib
drwxr-xr-x.  7 reg reg    4096  8月 24 16:45 2011 docs
-rw-rw-r--.  1 reg reg    6842  5月  4 15:30 2011 hadoop-ant-0.20.203.0.jar
-rw-rw-r--.  1 reg reg 3471348  5月  5 00:00 2011 hadoop-core-0.20.203.0.jar
-rw-rw-r--.  1 reg reg  142469  5月  4 15:30 2011 hadoop-examples-0.20.203.0.jar
-rw-rw-r--.  1 reg reg 2285620  5月  5 00:00 2011 hadoop-test-0.20.203.0.jar
-rw-rw-r--.  1 reg reg  284888  5月  4 15:30 2011 hadoop-tools-0.20.203.0.jar
drwxr-xr-x.  2 reg reg    4096  8月 24 16:45 2011 ivy
-rw-rw-r--.  1 reg reg    9731  5月  4 15:30 2011 ivy.xml
drwxr-xr-x.  5 reg reg    4096  8月 24 16:45 2011 lib
drwxr-xr-x.  2 reg reg    4096  8月 24 16:45 2011 librecordio
drwxr-xr-x. 15 reg reg    4096  8月 24 16:46 2011 src
drwxr-xr-x.  9 reg reg    4096  5月  4 15:30 2011 webapps

Standalone Operationをうごかす

ドキュメント通りに動かします。展開したディレクトリに移動して以下のコマンドを実行

//inputディレクトリを作成する
$ mkdir input 
//confの下のxmlをコピー
$ cp conf/*.xml input 
//hadoopのgrepを実行
$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 

はい。ここでエラーがでました。

[reg@anko hadoop-0.20.203.0]$ bin/hadoop jar hadoop-examples-0.20.203.0.jar grep input output 'dfs[a-z.]+'
Error: JAVA_HOME is not set

おとなしくJAVA_HOMEを設定します。

//JAVA_HOMEの設定
$ export JAVA_HOME=/usr

これが終わった後に再度実行。

$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'

ログが流れ終わったら終了なので結果を確認します。

$ cat output/*

こんな結果が返ってきました。

[reg@anko hadoop-0.20.203.0]$ cat output/*
1       dfsadmin

この文字列がヒットしてるみたい

[reg@anko input]$ grep -P dfs[a-z.]+ *.xml
hadoop-policy.xml:    dfsadmin and mradmin commands to refresh the security policy in-effect. 

Pseudo-Distributed Operationを動かす

疑似分散環境モードってことらしい。ドキュメントに従って設定ファイルを変更する。ドキュメント通りにやればおk。ssh周りの設定も一度sshでローカルホストにログインしておけばいい。まずはHDFSを初期化。hadoopを展開したディレクトリに移動してコマンド実行。

//HDFS初期化
$ bin/hadoop namenode -format

その次にhadoopデーモンを起動

//hadoopデーモン起動!
$ bin/start-all.sh

こんな感じで起動する。

[reg@anko hadoop-0.20.203.0]$ bin/start-all.sh 
namenode running as process 6092. Stop it first.
reg@localhost's password: 
localhost: starting datanode, logging to /home/reg/hadoop-0.20.203.0/bin/../logs/hadoop-reg-datanode-anko.localdomain.out
reg@localhost's password: 
localhost: starting secondarynamenode, logging to /home/reg/hadoop-0.20.203.0/bin/../logs/hadoop-reg-secondarynamenode-anko.localdomain.out
jobtracker running as process 6297. Stop it first.
reg@localhost's password: 
localhost: starting tasktracker, logging to /home/reg/hadoop-0.20.203.0/bin/../logs/hadoop-reg-tasktracker-anko.localdomain.out

namenode running as process 6092. Stop it first.ってのは失敗してた時のプロセスがのこってたから。
http://サーバー:50070/にブラウザでつないでNameNodeの状態が表示されることを確認して、http://サーバー:50030/につないでJobTrackerの画面が表示されることを確認できればおk。さっき作ったinputとoutputのディレクトリを空にしてコマンドを順に実行

//HDFSにインプットファイルをコピー
$ bin/hadoop fs -put conf input
//実行だじぇ!
$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
//outputファイルをコピー
$ bin/hadoop fs -get output output 
$ cat output/*
//デーモン停止
$ bin/stop-all.sh

結果はこんな感じ

[reg@anko hadoop-0.20.203.0]$ cat output/*
cat: output/_logs: ディレクトリです
1       dfs.replication
1       dfs.server.namenode.
1       dfsadmin

まとめ

正直、hadoopのおいしいところって複数のNodeで動かして初めて出てくるんじゃないかとおもったり。現にスタンドアロンで動かすより疑似分散環境のほうが遅く感じたわけで。やってる内容がちがうから何とも言えませんが。もうちょっとつづくんじゃよ。