hadoopのインストール(シングルノード)
作者:kosuke
動作環境:ubuntu8.10,hadoop0.20.1
1. Sun Java 6のインストール
下記のとおりにsun-java6-jdkをインストールする。
apt-get install sun-java6-jdk
2. ユーザーのグループ化
hadoopのグループを作って、hadoopユーザーをhadoopグループに登録する。
sudo addgroup hadoop
sudo adduser --ingroup hadoop hadoop
3. sshでローカルホストにログインできるようにする。
まずhadoopユーザーに切り替える。
$su - hadoop
sshをインストールする。
~$sudo apt-get install ssh
hadoop userのためにsshのキーを作成する。
~$ssh-keygen -t rsa --P
空のパスワードでローカルのマシンにログインするために次のコマンドを実行する.
~$cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
sshでローカルホストにログインする。
$ssh localhost
4. ipv6を使えないようにする.
ubuntuでは0.0.0.0を使うとipv6に紐づいてしまうらしいので、ipv6は無効にする。
よって、/etc/modprobe.d/blacklistを編集する.
# disable IPv6
blacklist ipv6
5. hadoopのダウンロード
hadoopの安定版にアクセスしてhadoopをダウンロードする。
/usr/local/hadoopに移動する.
cd /usr/local
ダウンロードしてきたファイルを解凍する。
/usr/local$ sudo tar xzf hadoop-x.xx.x.tar.gz
解凍したフォルダの名前をhadoopに変更する.
/usr/local$ sudo mv hadoop-x.xx.x hadoop
hadoopフォルダの所有者を再帰的にhadoop:hadoopにする。
/usr/local$ sudo chown -R hadoop:hadoop hadoop
6.hadoop-env.shを編集する。
confディレクトリの中にあるhadoop-env.shのjavaのアドレスを以下のように設定する.
# The java implementation to use. Required.
export JAVA_HOME=/usr/lib/jvm/java-6-sun
7.hadoop-site.xmlを編集する。
0.20.0から、hadoop-site.xmlは三つのxmlファイルに分割された。一つ目は、hadoop.tmp.dir, fs.default.nameを設定するcore-site.xml。二つ目は、dfs.replicationを編集するhdfs- site.xml。三つ目は、mapred.job.trackerを設定するmapred-site.xmlである。 hadoop.tmp.dirのvalueは、事前にディレクトリを作って、権限を与えて置かないとエラーになる可能性がある。
a. core-site.xmlを編集する.
hadoop.tmp.dirを設定していない解説サイトしかし、私自身は試していない.
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop-datastore/hadoop-hadoop</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://localhost:54310</value> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri's authority is used todetermine the host, port, etc. for a filesystem.</description> </property> </configuration>hadoop.tmp.dirのパスをどうしても自分で決めたい人は、以下のコマンドを実行する必要がある.
sudo mkdir /your/path
sudo chown hadoop:hadoop /your/path
2番目のコマンドを実行しないと、hadoopユーザーに許可を与えないことになるので、8、のフォーマットでエラーが起きる。
b. hdfs-site.xml を編集する
以下のように編集する。
<configuration> <property> <name>dfs.replication</name> <value>1</value> <description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time. </description> </property> <configuration>
c. mapred-site.xml を編集する
以下のように編集する。
<configuration> <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> <description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task. </description> </property> </configuration>
9. フォーマット
hadoopのインストールの第一歩はHDFS形式にフォーマットすることです.これは通常、クラスターのローカルファイルシステムのトップで実行される。今回の場合は、一台しかないので、このマシンにインストールした。
もちろん、フォーマットなので使用中のファイルをフォーマットすればそのファイルのデータは消える。
以下にフォーマットのコマンドを示す.
$ <HADOOP_INSTALL>/hadoop/bin/hadoop namenode -format
注意:<HADOOP_INSTALL>はhadoopをインストールしたフォルダを示す.ここでは、/usr/localがそれにあたる。
10. シングルノードで動かす。
以下に、hadoopの起動コマンドを示す.
$ bin/start-all.sh
11. プロセスのデバッグ
プロセスがきちんと動いているかどうか確かめる必要がある。確かめるには以下のコマンドを使う。
$ jps
下記のようなのが表示されれば成功。
8816 Jps 8293 DataNode 8700 TaskTracker 8457 SecondaryNameNode 8570 JobTracker 8157 NameNode
12. ポートのデバッグ
7.で構成したポートが正しくhadoopに認識されているか確かめる.確かめるにはnetstatを使った以下のコマンドを実行する.
sudo netstat -plten | grep java
下記のようなのが表示されれば成功。
tcp 0 0 192.168.66.133:54310.0.0.0:* LISTEN 1001 33013 8157/java tcp 0 0 192.168.66.133:54311 0.0.0.0:* LISTEN 1001 34783 8570/java
もし、この時点でエラーが発生した場合は、<HADOOP_INSTALL>/logs/にあるlogファイルをチェックするとよい。
13. シングルノードを止める。
止めるには以下のコマンドを実行する。
$ <HADOOP_INSTALL>/bin/stop-all.sh
14. MapReduceを動かしてみる
テキストファイルになにか適当な文字を何回か入力してそれをhadoopにカウントさせてみる。hadoopディレクトリ以下にinputsというディレクトリを作成する。
$ mkdir inputs
作ったinputsにfile1というファイルを作り、それに以下hoge hoge hoge fuga fugaを入力する。
$ cat > inputs/file1
hoge hoge hoge fuga fuga
作ったディレクトリをHDFSに転送する.(start-all.sh実行前にdfsのコマンドを実行すると Retrying connect to server: localhost/127.0.0.1:54310というエラーが起きる。)
$ bin/start-all.sh
$ bin/hadoop dfs -copyFromLocal inputs inputs
ここで、copyFromLocal: org.apache.hadoop.hdfs.server.namenode.SafeModeException?: Cannot create directory /user/hadoop/inputs. Name node is in safe mode.のようなエラーがでるときがある。こういう場合は以下のコマンドを実行するとよい。
$ bin/hadoop dfs -put inputs inputs
作ったディレクトリが転送されているか確認する。
$ bin/hadoop dfs -ls
転送されたディレクトリにfile1があることを確認する。
$ bin/hadoop dfs -ls inputs
サンプルプログラムを動かしてみる。
$ bin/hadoop jar hadoop-0.20.0-examples.jar wordcount inputs outputs
ここで、・・・java.io.IOException: Error opening job jar: hadoop-0.20.0-examples.jarと表示される場合は、<HADOOP_INSTALL>/hadoop/hadoop-0.20.0-examples.jarのアクセス権限を変更してあげるとよい。僕の環境では実行し終わるまでに24秒かかった。
出力ディレクトリを確認してみる。
$ bin/hadoop dfs -ls
つぎのような表示が出ればOK
drwxr-xr-x - hadoop supergroup 0 2009-08-24 12:01 /user/hadoop/outputs
DFS上のファイルを出力する。
$ bin/hadoop dfs -cat outputs/part-r-00000
次のように表示されればOK.
fuga 2 hoge 3
HDFS上のファイルをローカルに転送する。
$ bin/hadoop dfs -copyToLocal outputs/part-r-00000 ./part-r-00000
転送したファイルを表示する。
cat part-r-00000
fuga 2 hoge 3
