2010年7月25日日曜日

Hadoop (3) 完全分散モード


このエントリーをはてなブックマークに追加


次に完全分散モードでの実行を試みる。


前回の続き
Hadoop (1) スタンドアロン
Hadoop (2) 疑似分散モード


関連項目
Solaris10 zone 設定
Solaris10 zone で止めておいた方がよいサービス
ssh で認証無しログインをする方法(公開鍵方式)

参考ページ
Hadoopセットアップ・・・このサイトの設定ファイルテンプレートは非常に有用。




今回から動作環境をSolarisのZoneへ移行した。
6台の仮想マシンはVirtualBoxでは重すぎてきつかった。

こんな感じになっている。
root@sol10-u24 21:50:57>zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
  16 hdp01            running    /spool/zone/hdp01              native   shared
  17 hdp03            running    /spool/zone/hdp03              native   shared
  18 hdp04            running    /spool/zone/hdp04              native   shared
  19 hdp05            running    /spool/zone/hdp05              native   shared
  20 hdp02            running    /spool/zone/hdp02              native   shared
  22 hdp06            running    /spool/zone/hdp06              native   shared

また各zoneのディスクはzfsで100GBに制限してある。
root@sol10-u24 21:51:05>zfs list
NAME                                                           USED  AVAIL  REFER  MOUNTPOINT
spool/zone                                                    16.4G  3.91T  40.4K  /spool/zone
spool/zone/hdp01                                              2.73G  97.3G  2.73G  /spool/zone/hdp01
spool/zone/hdp02                                              2.73G  97.3G  2.73G  /spool/zone/hdp02
spool/zone/hdp03                                              2.73G  97.3G  2.73G  /spool/zone/hdp03
spool/zone/hdp04                                              2.73G  97.3G  2.73G  /spool/zone/hdp04
spool/zone/hdp05                                              2.73G  97.3G  2.73G  /spool/zone/hdp05
spool/zone/hdp06                                              2.73G  97.3G  2.73G  /spool/zone/hdp06

hdp01 ・・・Primary NameNode
hdp02 ・・・Secondary NameNode(予定)
hdp03-06 ・・・DataNode

*Zone上にHadoopは構築できませんでした。無駄な努力乙(´・ω・`)
https://issues.apache.org/jira/browse/HADOOP-6319

zoneはファイルシステムの容量報告が普通と違うみたいで、Hadoopからみると常に残ゼロに見えてHDFSがうまく動かないっぽい。

というわけで気を取り直して、CentOSでやり直す。インストールサーバ準備しといてよかった・・・。


PXE ブートによるネットワークインストール(CentOS 5.5)


■環境

hdp01(Primary NameNode)
hdp02(Sencondary NameNode) → Datanode
hdp03(DataNode)
hdp04(DataNode)

結局3台。4台同時に負荷掛けると1台落ちちゃう。Sol10 + VBox貧弱すぎて心が折れそうデス。

(1)全ノードで基本設定を施す。

1.jdkのインストール(1.6)を使用(パスとJAVA_HOMEも忘れずに)
2.参加する全てのノードの名前解決ができるようにしておく
3.hdp01 から hdp02,03への ssh 認証無しログイン(hadoopユーザ)
4.hadoop-0.20.2 の配置(公式から取得して、/home/hadoop 以下に解凍します。

(2)各ノード共通設定(全ノードで実施)

hadoop側のJAVA環境変数の設定
[hadoop@hdp01 hadoop-0.20.2]$ vi conf/hadoop-env.sh
---------------------------------
export JAVA_HOME=/usr/java/default
---------------------------------


[hadoop@hdp01 hadoop-0.20.2]$ vi conf/core-site.xml
---------------------------------
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/cache/${user.name}</value>
        <description>
            全てのベースディレクトリの設定。
            関連するファイルは全てこのディレクトリ配下に配置する。
        </description>
    </property>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://hdp01:9000</value>
        <description>NameNodeのアドレスを指定する</description>
    </property>
</configuration>
---------------------------------


[hadoop@hdp01 hadoop-0.20.2]$ vi conf/hdfs-site.xml
---------------------------------
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
        <description>HDFS内のレプリケーション数</description>
    </property>
    <property>
        <name>dfs.hosts</name>
        <value>${hadoop.tmp.dir}/hosts.include</value>
        <description>
           NameNodeへの接続を許可するノードのリスト
        </description>
    </property>
    <property>
        <name>dfs.hosts.exclude</name>
        <value>${hadoop.tmp.dir}/hosts.exclude</value>
        <description>
           NameNodeへの接続を拒否するノードのリスト
        </description>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>${hadoop.tmp.dir}/dfs/name</value>
        <description>
            NameNode 用データ格納ディレクトリ
        </description>
    </property>
</configuration>
---------------------------------


[hadoop@hdp01 hadoop-0.20.2]$ vi conf/mapred-site.xml
---------------------------------
<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>hdp01:9001</value>
        <description>JobTrackerのホスト名</description>
    </property>
    <property>
        <name>mapred.hosts</name>
        <value>${hadoop.tmp.dir}/hosts.include</value>
        <description>
           JobTrackerへの接続を許可するノードのリスト
        </description>
    </property>
    <property>
        <name>mapred.hosts.exclude</name>
        <value>${hadoop.tmp.dir}/hosts.exclude</value>
        <description>
           JobTrackerへの接続を拒否するノードのリスト
        </description>
    </property>
</configuration>
---------------------------------


Nameノードを記載
[hadoop@hdp01 ~]$ vi hadoop-0.20.2/conf/masters
---------------------------------
hdp01
---------------------------------

Dataノードを記載
[hadoop@hdp01 ~]$ vi hadoop-0.20.2/conf/slaves
---------------------------------
hdp02
hdp03
---------------------------------


前回の設定ファイルやキャッシュが残っていれば削除する(例
rm -Rf ${hadoop.tmp.dir}
rm -Rf /tmp/hadoop*





(3)Nameノードで実施
接続許可ホストを定義(Dataノードを列挙する)
[hadoop@hdp01 ~]$ mkdir -p /home/hadoop/cache/hadoop/
[hadoop@hdp01 ~]$ vi /home/hadoop/cache/hadoop/hosts.include
---------------------------------
hdp02
hdp03
---------------------------------


使わないけど、除外リストも作成しておく。作らないと起動時にエラーするため。
[hadoop@hdp01 logs]$ touch /home/hadoop/cache/hadoop/hosts.exclude



Nameノードをフォーマットする
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop namenode -format
10/07/25 03:11:57 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = hdp01/192.168.1.81
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.20.2
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on Fri Feb 19 08:07:34 UTC 2010
************************************************************/
10/07/25 03:11:57 INFO namenode.FSNamesystem: fsOwner=hadoop,hadoop
10/07/25 03:11:57 INFO namenode.FSNamesystem: supergroup=supergroup
10/07/25 03:11:57 INFO namenode.FSNamesystem: isPermissionEnabled=true
10/07/25 03:11:57 INFO common.Storage: Image file of size 96 saved in 0 seconds.
10/07/25 03:11:57 INFO common.Storage: Storage directory /home/hadoop/cache/hadoop/dfs/name has been successfully formatted.
10/07/25 03:11:57 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hdp01/192.168.1.81
************************************************************/


(4)起動する(NameNodeから実行すれば、ssh経由で全てのノードでプロセスを起動する) [hadoop@hdp01 hadoop-0.20.2]$ bin/start-all.sh
*停止はstop-all.sh


正常に起動した場合、NameNodeでは以下のJavaプロセスが起動する。 [hadoop@hdp01 hadoop-0.20.2]$ /usr/java/default/bin/jps
19455 Jps
19326 SecondaryNameNode
19186 NameNode
19394 JobTracker

DataNodeは以下
[hadoop@hdp02 ~]$ /usr/java/default/bin/jps
9649 TaskTracker
9563 DataNode
9682 Jps


うまく起動しない場合は、各ノードのhadoop-20.2/logs配下のログを確認。

成功するとこんな感じの画面(http://namenode:50070)


(5)動作確認

MapReduceのテスト
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop jar hadoop-0.20.2-examples.jar pi 1 1000
Number of Maps = 1
Samples per Map = 1000
Wrote input for Map #0
Starting Job
10/07/25 03:13:43 INFO mapred.FileInputFormat: Total input paths to process : 1
10/07/25 03:13:44 INFO mapred.JobClient: Running job: job_201007250312_0001
10/07/25 03:13:45 INFO mapred.JobClient: map 0% reduce 0%
10/07/25 03:13:51 INFO mapred.JobClient: map 100% reduce 0%
10/07/25 03:14:01 INFO mapred.JobClient: map 100% reduce 100%
10/07/25 03:14:02 INFO mapred.JobClient: Job complete: job_201007250312_0001
10/07/25 03:14:02 INFO mapred.JobClient: Counters: 18
10/07/25 03:14:02 INFO mapred.JobClient: Job Counters
10/07/25 03:14:02 INFO mapred.JobClient: Launched reduce tasks=1
10/07/25 03:14:02 INFO mapred.JobClient: Launched map tasks=1
10/07/25 03:14:02 INFO mapred.JobClient: Data-local map tasks=1
10/07/25 03:14:02 INFO mapred.JobClient: FileSystemCounters
10/07/25 03:14:02 INFO mapred.JobClient: FILE_BYTES_READ=28
10/07/25 03:14:02 INFO mapred.JobClient: HDFS_BYTES_READ=118
10/07/25 03:14:02 INFO mapred.JobClient: FILE_BYTES_WRITTEN=88
10/07/25 03:14:02 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=215
10/07/25 03:14:02 INFO mapred.JobClient: Map-Reduce Framework
10/07/25 03:14:02 INFO mapred.JobClient: Reduce input groups=2
10/07/25 03:14:02 INFO mapred.JobClient: Combine output records=0
10/07/25 03:14:02 INFO mapred.JobClient: Map input records=1
10/07/25 03:14:02 INFO mapred.JobClient: Reduce shuffle bytes=28
10/07/25 03:14:02 INFO mapred.JobClient: Reduce output records=0
10/07/25 03:14:02 INFO mapred.JobClient: Spilled Records=4
10/07/25 03:14:02 INFO mapred.JobClient: Map output bytes=18
10/07/25 03:14:02 INFO mapred.JobClient: Map input bytes=24
10/07/25 03:14:02 INFO mapred.JobClient: Combine input records=0
10/07/25 03:14:02 INFO mapred.JobClient: Map output records=2
10/07/25 03:14:02 INFO mapred.JobClient: Reduce input records=2
Job Finished in 18.498 seconds
Estimated value of Pi is 3.14800000000000000000
*動いたけどむちゃくちゃ遅いwww vboxのネットワークがおかしいっぽい雰囲気。


HDFSのテスト

HDFSの操作はIBMの技術ページが参考になる。
Hadoop による分散データ処理: 第 1 回 導入編

[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -ls
まだ何もない

ディレクトリを作成する。
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -mkdir test
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -ls
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2010-07-25 03:14 /user/hadoop/test

ディレクトリを削除する
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -rmr test
Deleted hdfs://hdp01:9000/user/hadoop/test
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -ls

ファイルを配置する
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -mkdir input
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -ls
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2010-07-25 03:15 /user/hadoop/input

[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -put /usr/share/doc/syslinux-3.11/* input
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -ls input
Found 15 items
-rw-r--r-- 2 hadoop supergroup 18007 2010-07-25 03:15 /user/hadoop/input/COPYING
-rw-r--r-- 2 hadoop supergroup 34271 2010-07-25 03:15 /user/hadoop/input/NEWS
-rw-r--r-- 2 hadoop supergroup 1380 2010-07-25 03:15 /user/hadoop/input/README
-rw-r--r-- 2 hadoop supergroup 4478 2010-07-25 03:15 /user/hadoop/input/README.menu
-rw-r--r-- 2 hadoop supergroup 2170 2010-07-25 03:15 /user/hadoop/input/README.usbkey
-rw-r--r-- 2 hadoop supergroup 807 2010-07-25 03:15 /user/hadoop/input/TODO
-rw-r--r-- 2 hadoop supergroup 21695 2010-07-25 03:15 /user/hadoop/input/comboot.doc
-rw-r--r-- 2 hadoop supergroup 1210 2010-07-25 03:15 /user/hadoop/input/distrib.doc
-rw-r--r-- 2 hadoop supergroup 3271 2010-07-25 03:15 /user/hadoop/input/extlinux.doc
-rw-r--r-- 2 hadoop supergroup 4975 2010-07-25 03:15 /user/hadoop/input/isolinux.doc
-rw-r--r-- 2 hadoop supergroup 3706 2010-07-25 03:15 /user/hadoop/input/keytab-lilo.doc
-rw-r--r-- 2 hadoop supergroup 6316 2010-07-25 03:15 /user/hadoop/input/memdisk.doc
-rw-r--r-- 2 hadoop supergroup 14168 2010-07-25 03:15 /user/hadoop/input/pxelinux.doc
drwxr-xr-x - hadoop supergroup 0 2010-07-25 03:15 /user/hadoop/input/sample
-rw-r--r-- 2 hadoop supergroup 25464 2010-07-25 03:15 /user/hadoop/input/syslinux.doc

ディレクトリはサンプルプログラムでうまく処理できないので消しておく
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -rmr input/sample
ファイルの内容を表示する。
cat: Source must be a file.
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -cat input/TODO
$Id: TODO,v 1.30 2005/08/21 06:28:56 hpa Exp $

*** To do in the short term:

- PXELINUX: Figure out localboot/idle problems

- PXELINUX: Support changing the default server and boot file prefix?

- Support loading a new configuration file.

- Library support for "shuffle and boot" extension.

- Library support for all the comboot system calls.


*** Future projects:

- Clean up the command-line parsing.

- Cleaned up documentation, with a real man page.

- Subdirectory support in SYSLINUX.

- Support files that span multiple input media (SYSLINUX)
-> Seems to be getting less important; floppies are dying?

- Clean up the handling of sections

- Add "localboot" support to SYSLINUX (using the ISOLINUX feature
set.)
OBSOLETE: chain.c32 is probably better.

- API call to get directory listing


データノード側でファイルをみる
[hadoop@hdp02 current]$ pwd
/home/hadoop/cache/hadoop/dfs/data/current
[hadoop@hdp02 current]$ ls
VERSION blk_2371836588789704134
blk_-1120218730112926378 blk_2371836588789704134_1036.meta
blk_-1120218730112926378_1039.meta blk_2734962366991155342
blk_-1214753250424289986 blk_2734962366991155342_1033.meta
blk_-1214753250424289986_1019.meta blk_2834059765135453017
blk_-1323921254039428003 blk_2834059765135453017_1064.meta
blk_-1323921254039428003_1060.meta blk_2841179418864385561
blk_-1515500364051541787 blk_2841179418864385561_1057.meta
blk_-1515500364051541787_1003.meta blk_2925065353969304233
blk_-3383513471486276167 blk_2925065353969304233_1049.meta

分散されてる。。。感じがする。



(6)HDFS上のファイルをMapReduceで処理してみる。
サンプルで用意されているプログラムに、ファイル内の単語をカウントするプログラムがあるのでそれを試す。

[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount input output
10/07/25 03:19:25 INFO input.FileInputFormat: Total input paths to process : 14
10/07/25 03:19:25 INFO mapred.JobClient: Running job: job_201007250312_0004
10/07/25 03:19:26 INFO mapred.JobClient: map 0% reduce 0%
10/07/25 03:19:30 INFO mapred.JobClient: map 7% reduce 0%
10/07/25 03:19:31 INFO mapred.JobClient: map 28% reduce 0%
10/07/25 03:19:34 INFO mapred.JobClient: map 50% reduce 7%
10/07/25 03:19:35 INFO mapred.JobClient: map 78% reduce 7%
10/07/25 03:19:36 INFO mapred.JobClient: map 100% reduce 21%
10/07/25 03:19:45 INFO mapred.JobClient: map 100% reduce 100%
10/07/25 03:19:46 INFO mapred.JobClient: Job complete: job_201007250312_0004
10/07/25 03:19:46 INFO mapred.JobClient: Counters: 17
10/07/25 03:19:46 INFO mapred.JobClient: Job Counters
10/07/25 03:19:46 INFO mapred.JobClient: Launched reduce tasks=1
10/07/25 03:19:46 INFO mapred.JobClient: Launched map tasks=14
10/07/25 03:19:46 INFO mapred.JobClient: Data-local map tasks=14
10/07/25 03:19:46 INFO mapred.JobClient: FileSystemCounters
10/07/25 03:19:46 INFO mapred.JobClient: FILE_BYTES_READ=119235
10/07/25 03:19:46 INFO mapred.JobClient: HDFS_BYTES_READ=141918
10/07/25 03:19:46 INFO mapred.JobClient: FILE_BYTES_WRITTEN=238996
10/07/25 03:19:46 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=56076
10/07/25 03:19:46 INFO mapred.JobClient: Map-Reduce Framework
10/07/25 03:19:46 INFO mapred.JobClient: Reduce input groups=5413
10/07/25 03:19:46 INFO mapred.JobClient: Combine output records=8756
10/07/25 03:19:46 INFO mapred.JobClient: Map input records=3641
10/07/25 03:19:46 INFO mapred.JobClient: Reduce shuffle bytes=119313
10/07/25 03:19:46 INFO mapred.JobClient: Reduce output records=5413
10/07/25 03:19:46 INFO mapred.JobClient: Spilled Records=17512
10/07/25 03:19:46 INFO mapred.JobClient: Map output bytes=225369
10/07/25 03:19:46 INFO mapred.JobClient: Combine input records=22311
10/07/25 03:19:46 INFO mapred.JobClient: Map output records=22311
10/07/25 03:19:46 INFO mapred.JobClient: Reduce input records=8756

結果ファイルの確認
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -ls output
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2010-07-25 03:19 /user/hadoop/output/_logs
-rw-r--r-- 2 hadoop supergroup 56076 2010-07-25 03:19 /user/hadoop/output/part-r-00000

中身を表示する
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -cat output/part-r-00000 |head -10
!= 1
!PXE 5
"-iso-level 1
"-l" 1
"-o 1
".c32". 1
".cbt". 1
".com" 2
".com". 1
".img" 1
cat: Unable to write to output stream.

ローカルにファイルを取得する
[hadoop@hdp01 hadoop-0.20.2]$ bin/hadoop fs -get output/part-r-00000 result.txt
[hadoop@hdp01 hadoop-0.20.2]$ head -10 result.txt
!= 1
!PXE 5
"-iso-level 1
"-l" 1
"-o 1
".c32". 1
".cbt". 1
".com" 2
".com". 1
".img" 1

まずはこんな感じ





0 件のコメント:

コメントを投稿