Standaloneモードでは、複数のホストを使った処理は行わない。デーモンも動かさない。
しかしHadoopは分散処理をしてナンボである。
分散処理をする場合には、複数のホストでいくつかのデーモンを動作させる必要がある。
それはまあ当然。
ただ、いきなり複数ホストを使うのはハードルが高い。
そこで、「Hadoopは複数ホストで動いているつもりだけど実際は1台のホストで動いている」モードで設定の確認をする。
これが擬似分散(Psuedo-distributed)モード。
擬似分散モードに必要な各設定の意味
擬似分散(Psuedo-distributed)モードの動作には以下、四つの設定が必要。
完全分散(Full distributed)モードでも変わらないんだけどね。
- HDFSのメタデータを格納するnamenodeの設定
- データをいくつ複製(replication)するかの設定(デフォルトで3)
- タスク分散を受け持つJobTrackerの設定
- 実データを格納し、タスクを実行する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に対し、ブラウザで前二者のポートにアクセスするとステータスが分かる。
実際に動かすのは今度。