Hadoopを動かすには、いくつか環境変数の設定が必要である。
JAVA_HOMEとか、HADOOP_PREFIXとか。
また同時に、複数ノードの制御のために、sshやrsyncだって使う。

以上のことを考えると、専用のユーザを作っておくのが便利である。

ところで、Hadoopをportsから入れると、ユーザhadoopが作られる。
ユーザhadoopを使うのがよさそうだが、しかしこのユーザhadoopはそのままでは使えない。
シェルに/sbin/nologinが設定されているから。

Hadoopをportsからインストールしたとき、そういったことも併せて、擬似分散モード、完全分散モードで動かす準備をまとめる。
準備は大きく分けて二段階。ユーザhadoopの環境設定と、sshdの設定変更。

ユーザhadoopのホームディレクトリ、シェル情報の変更

vipwでhadoopの行を以下のように書き換える。

hadoop:*:955:955::0:0:hadoop user:/nonexistent:/usr/sbin/nologin
※以下のように書き換え
hadoop:*:955:955::0:0:hadoop user:/home/hadoop:/usr/local/bin/bash

パスワードは変えなくてもよい。
sudo su - hadoopしたらいいし、リモートから直接hadoopとしてログインしたい場合には鍵を使うから。

ユーザhadoopのホームディレクトリと.profileの作成

ホームディレクトリを作り、HADOOP関連の環境変数を.profileに書き込む。
追加でHADOOP_PREFIXという変数も加えておく。

$ sudo mkdir /home/hadoop
$ sudo sh -c 'cat /usr/local/etc/hadoop/envvars.d/* >> /home/hadoop/.profile'
$ sudo sh -c 'echo "PATH=$PATH:/usr/local/share/hadoop/bin;export PATH" >> /home/hadoop/.profile'
$ sudo sh -c 'echo "export HADOOP_PREFIX=/usr/local/share/hadoop" >> /home/hadoop/.profile'
$

上記の手順を踏むと、.profileの中身は以下のように。

$ cat /home/hadoop/.profile
export JAVA_HOME=${JAVA_HOME:-/usr/local/openjdk6}

export HADOOP_HOME=/usr/local/share/hadoop
export HADOOP_CONF_DIR=/usr/local/etc/hadoop
export HADOOP_LOG_DIR=/var/log/hadoop
export HADOOP_PID_DIR=/var/run/hadoop
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/doe/bin:/usr/local/share/hadoop/bin;export PATH
export HADOOP_PREFIX=/usr/local/share/hadoop

実際にログインして環境変数が設定されているか確認。
なってますな。

$ sudo su - hadoop
[hadoop@vanilla ~]$ env | egrep 'JAVA|HADOOP|PATH'
HADOOP_LOG_DIR=/var/log/hadoop
HADOOP_HOME=/usr/local/share/hadoop
HADOOP_PID_DIR=/var/run/hadoop
HADOOP_PREFIX=/usr/local/share/hadoop
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/hadoop/bin:/usr/local/share/hadoop/bin
JAVA_HOME=/usr/local/openjdk6
HADOOP_CONF_DIR=/usr/local/etc/hadoop

ユーザhadoopのssh設定。

これは複数ノードの制御のため。
ポイントは二つある。
・パスワードなしでssh接続できるようにしておく。
・リモート接続したときにも環境変数が有効になるようにしておく。

パスワードなしのssh接続。

鍵を作っておいて、パスワードなしでリモートノードに接続できるようにしておく。
(セキュリティ的にはおおらかですな。もちろんセキュリティ向上の取り組みはなされているようだけど)

これはもうお決まりの手順。

$ sudo su - hadoop
[hadoop@vanilla ~]$
[hadoop@vanilla ~]$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
Generating public/private dsa key pair.
Created directory '/home/hadoop/.ssh'.
Your identification has been saved in /home/hadoop/.ssh/id_dsa.
Your public key has been saved in /home/hadoop/.ssh/id_dsa.pub.
The key fingerprint is:
bf:69:a7:7f:73:af:ed:2d:d7:02:5a:05:ce:08:a1:44 hadoop@isis
The key's randomart image is:
+--[ DSA 1024]----+
| .E .. |
| . .. . |
| . . + . |
| . o . |
| S . |
| . o |
| .o . .|
| oo. =.=|
| .++...O*|
+-----------------+
[hadoop@vanilla ~]$
[hadoop@vanilla ~]$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
[hadoop@vanilla ~]$
[hadoop@vanilla ~]$ ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is fc:b3:5c:28:1f:2f:32:21:0a:ba:1c:51:00:95:47:7a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
FreeBSD 9.1-RELEASE-p4 (GENERIC) #0: Mon Jun 17 11:42:37 UTC 2013

Welcome to FreeBSD!

いったん抜ける

リモート制御(コマンド実行)のためのssh設定

ここでまとめた通り、~/.ssh/environment環境変数の記載をする。
$PATHとかの表記をしない。exportも省く。

[hadoop@vanilla ~]$ cat ~hadoop/.ssh/environment
JAVA_HOME=/usr/local/openjdk6
HADOOP_HOME=/usr/local/share/hadoop
HADOOP_CONF_DIR=/usr/local/etc/hadoop
HADOOP_LOG_DIR=/var/log/hadoop
HADOOP_PID_DIR=/var/run/hadoop
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/doe/bin:/usr/local/share/hadoop/bin
HADOOP_PREFIX=/usr/local/share/hadoop

リモート制御(コマンド実行)のためのssh「d」設定

おなじく、sshdの設定を変える。

$ sudo cp /etc/ssh/sshd_config{,.org}
$ sudo vi /etc/ssh/sshd_config
※以下のように書き換え
#PermitUserEnvironment no
PermitUserEnvironment yes

$ sudo service sshd restart
Stopping sshd.
Starting sshd.
$

確認。
パスワードなしでログインできて、環境変数もOK.

$ sudo su - hadoop
[hadoop@vanilla ~]$
[hadoop@vanilla ~]$ ssh localhost env | egrep 'JAVA|HADOOP|PATH'
HADOOP_LOG_DIR=/var/log/hadoop
HADOOP_HOME=/usr/local/share/hadoop
HADOOP_PID_DIR=/var/run/hadoop
HADOOP_PREFIX=/usr/local/share/hadoop
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/hadoop/bin:/usr/local/share/hadoop/bin
JAVA_HOME=/usr/local/openjdk6
HADOOP_CONF_DIR=/usr/local/etc/hadoop
[hadoop@vanilla ~]$

以上

関連エントリ。

[FreeBSD] Hadoopのportsからのインストール
[Hadoop]Hadoop 擬似分散(Psuedo-distributed)モードの設定
[Hadoop]擬似分散モードで実験
[Hadoop] 擬似分散モードから完全分散モードへ(データノードの追加)