Standaloneモードでは、複数のホストを使った処理は行わない。デーモンも動かさない。

しかしHadoopは分散処理をしてナンボである。
分散処理をする場合には、複数のホストでいくつかのデーモンを動作させる必要がある。
それはまあ当然。

ただ、いきなり複数ホストを使うのはハードルが高い。
そこで、「Hadoopは複数ホストで動いているつもりだけど実際は1台のホストで動いている」モードで設定の確認をする。
これが擬似分散(Psuedo-distributed)モード。

擬似分散モードに必要な各設定の意味

擬似分散(Psuedo-distributed)モードの動作には以下、四つの設定が必要。
完全分散(Full distributed)モードでも変わらないんだけどね。

  1. HDFSのメタデータを格納するnamenodeの設定
  2. データをいくつ複製(replication)するかの設定(デフォルトで3)
  3. タスク分散を受け持つJobTrackerの設定
  4. 実データを格納し、タスクを実行するdatanodeかつTaskTrackerの設定

1と3と4にそれぞれlocalhostを指定する(なおこれを別ホストにすればFull distributedモードに)。
2では1を指定する。
デフォルトのままだと、複製を3つ作ろうとする。ひいてはホストが3つ必要になってしまう。
擬似分散モードでは自ホストしか使わないわけだから1を指定するというわけ。

namenode, replication, JobTrackerの設定

以下、三つのファイルを変更する。
前章の1,2,3に対応する。

  • core-site.xml(namenode設定)
  • hdfs-site.xml(replication設定)
  • mapred-site.xml(JobTracker設定)

FreeBSDでportsから入れたなら/usr/local/etc/hadoopにある。

core-site.xml

<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://localhost/</value>
        </property>
</configuration>

hdfs-site.xml

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
</configuration>

mapred-site.xml

<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>localhost:8021</value>
        </property>
</configuration>

datanode, TaskTrackerの設定

/usr/local/etc/hadoopの下にmasters, slavesというファイルを作る。
ここでsecondary namenode, datanode, TaskTrackerを指定する。

secondary namenodeとは、namenodeのデータをバックアップするノード。
datanode、TaskTrackerとは、HDFSの実データが置かれ、JobTrackerから指定されたタスクをこなすノード。

mastersというファイルには、secondary namenodeを書く。
slavesというファイルには、datanodeかつTaskTrackerとなるホストを書く。

擬似分散モードでは、secondary namenodeの指定は不要。
mastersという空ファイルだけ作っておけばよい。
slavesには、localhostと書いておく。

$ cd /usr/local/etc/hadoop/
$ sudo touch slaves masters
$ sudo sh -c 'echo "localhost" >> ./slaves'
$ cat masters
$
$ cat slaves
localhost
$

HDFSのフォーマット

初回に限り、HDFSのフォーマットが必要である。
HDFSにはメタデータを保存するnamenodeと、実データの保存されるdatanodeがある。

ここでの「HDFSのフォーマット」とは、実際のところnamenodeの初期化を意味する。

なので、datanodeはこのフォーマットとは無関係。不要。
しかもdatanodeを追加したり削除したときだって、namenodeでの設定変更、フォーマットは不要。

拍子抜けするくらいである。
だが。裏を返すとnamenodeが壊れればすべてのデータが死亡することを意味する。
実運用の際には、secondaly namenodeを立てるなどして事故に備えることになる。

しかし今は擬似分散モードなので気軽に進める。
HDFSのフォーマットは以下のようにして行う。
※フォーマットは、実際にHadoopを使うユーザで行うこと。FreeBSDでportsから入れた場合は注意

$ hadoop namenode -format
Warning: $HADOOP_HOME is deprecated.

13/07/23 20:12:16 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/127.0.0.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 1.0.0
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1214675; compiled by 'hortonfo' on Thu Dec 15 16:36:35 UTC 2011
************************************************************/
13/07/23 20:12:18 INFO util.GSet: VM type = 64-bit
13/07/23 20:12:18 INFO util.GSet: 2% max memory = 19.33375 MB
13/07/23 20:12:18 INFO util.GSet: capacity = 2^21 = 2097152 entries
13/07/23 20:12:18 INFO util.GSet: recommended=2097152, actual=2097152
13/07/23 20:12:19 INFO namenode.FSNamesystem: fsOwner=vanilla
13/07/23 20:12:20 INFO namenode.FSNamesystem: supergroup=supergroup
13/07/23 20:12:20 INFO namenode.FSNamesystem: isPermissionEnabled=true
13/07/23 20:12:20 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
13/07/23 20:12:20 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
13/07/23 20:12:20 INFO namenode.NameNode: Caching file names occuring more than 10 times
13/07/23 20:12:20 INFO common.Storage: Image file of size 113 saved in 0 seconds.
13/07/23 20:12:20 INFO common.Storage: Storage directory /tmp/hadoop-vanilla/dfs/name has been successfully formatted.
13/07/23 20:12:20 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1
************************************************************/

HDFSの場所

上記のログにもある通り、デフォルトでは/tmpの下に作られる。
厳密に言えば、/tmp/hadoop-${user.name} に作られる。
namenodeでも、datanodeでも同じ。

/tmpディレクトリだと、システムが消したりするので実運用では場所を変えたほうがよい。

これらの場所は、hdfs-site.xmlで制御できる。
hadoop.tmp.dirがprefixなので、これを変えればよい。
あるいは、dfs.name.dir(namenode向け)、dfs.data.dir(datanode向け)で明示してもよい。

Hadoopの起動

start-all.shで起動させる。

$ sudo su - hadoop
[hadoop@isis ~]$
[hadoop@isis ~]$
[hadoop@isis ~]$ start-all.sh
Warning: $HADOOP_HOME is deprecated.

starting namenode, logging to /var/log/hadoop/hadoop-hadoop-namenode-isis.out
localhost: Warning: $HADOOP_HOME is deprecated.
localhost:
localhost: starting datanode, logging to /var/log/hadoop/hadoop-hadoop-datanode-isis.out
starting jobtracker, logging to /var/log/hadoop/hadoop-hadoop-jobtracker-isis.out
localhost: Warning: $HADOOP_HOME is deprecated.
localhost:
localhost: starting tasktracker, logging to /var/log/hadoop/hadoop-hadoop-tasktracker-isis.out
[hadoop@isis ~]$

HADOOP_HOMEについて文句をつけられている。スクリプトを見れば分かるが、これは無視してよい。この点については別途。
namenode, datanode, jobtracker, tasktrackerの4つを起動しようと試みていることが分かる。

さて実際に起動しているか。jpsで確認。動いていますな。

[hadoop@isis ~]$ jps
2135 DataNode
2324 TaskTracker
2057 NameNode
2377 Jps
2229 JobTracker
[hadoop@isis ~]$

そしてこれらのプロセスは、ポート待ち受けをする。調べてみる。

[hadoop@isis ~]$ sockstat -l4|grep hadoop
hadoop   java       1746  55 tcp4 6 *:24923               *:*
hadoop   java       1746  60 tcp4   127.0.0.1:8021        *:*
hadoop   java       1746  71 tcp4 6 *:50030               *:*
hadoop   java       1621  55 tcp4 6 *:64722               *:*
hadoop   java       1621  63 tcp4   127.0.0.1:8020        *:*
hadoop   java       1621  74 tcp4 6 *:50070               *:*
[hadoop@isis ~]$

50030はJobTrackerの、50070はnamenodeの管理Web用ポート、8020はnamenodeの、8021はdatanodeのポート。

namenodeに対し、ブラウザで前二者のポートにアクセスするとステータスが分かる。

実際に動かすのは今度。