Hadoopセットアップ-その2(疑似分散モード)

前回から少し時間が経ってしまいましたが、Hadoopセットアップの続きを行います。

今度は疑似分散モードに設定します。

設定ファイル編集

まずは公式サイトにあるようにそのまま設定します。

【追記(2013/3/31)】 このあたりの話を別途再検証して記事にまとめました。併せてご参照ください。 Hadoopをとりあえず動かしてみるために

(2012/6/3追記:ファイル名を間違えておりました。修正させていただきます)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>io.sort.mb</name>
    <value>30</value>
  </property>
  <property>
    <name>mapred.job.tracker</name>
    <value>localhost:9001</value>
  </property>
</configuration>

ユーザ設定

たしか後で必要になったと思うので、今のうちに"hadoop"という名前のユーザーを作成しておきます。 hadoopグループはrpmインストール時に作成されていたようです。

# useradd -d /home/hadoop -g hadoop -m hadoop
# passwd hadoop
ユーザー hadoop のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。

作成したhadoopユーザーにsshの公開鍵認証設定をします。 まず、sshdの設定。 デフォルトから、以下のように修正します。(CentOS6)

# pwd
/etc/ssh
# cp -p sshd_config sshd_config.back20120229
(修正作業...)
# diff sshd_config sshd_config.back20120229
48,49c48,49
< PubkeyAuthentication yes
< AuthorizedKeysFile .ssh/authorized_keys --- > #PubkeyAuthentication yes
> #AuthorizedKeysFile .ssh/authorized_keys
66c66
< PasswordAuthentication no --- > PasswordAuthentication yes
# service sshd restart
sshd を停止中: [ OK ]
sshd を起動中: [ OK ]

次に、ログインのテスト。

# su - hadoop
$ ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is (略)
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
$ ls -la .ssh
合計 12
drwx------. 2 hadoop hadoop 4096 2月 29 01:23 2012 .
drwx------. 5 hadoop hadoop 4096 2月 29 01:23 2012 ..
-rw-r--r--. 1 hadoop hadoop 391 2月 29 01:23 2012 known_hosts
$

鍵ペアの作成と、authorized_keysへの公開鍵の追加をします。

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
(略)
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 644 .ssh/authorized_keys
$ ls -l .ssh
合計 16
-rw-r--r--. 1 hadoop hadoop 396 2月 29 01:26 2012 authorized_keys
-rw-------. 1 hadoop hadoop 1675 2月 29 01:26 2012 id_rsa
-rw-r--r--. 1 hadoop hadoop 396 2月 29 01:26 2012 id_rsa.pub
-rw-r--r--. 1 hadoop hadoop 391 2月 29 01:23 2012 known_hosts
$

ログインテストをしてみましょう。

$ ssh localhost
$
$ exit
logout
Connection to localhost closed.
$

hdfsのフォーマットとデーモンの起動

hdfsというのは分散ファイルシステムというHadoop内部で利用する 独自のファイルシステムです。

このファイルシステムのフォーマットを行います。

$ hadoop namenode -format
12/02/29 01:42:07 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = hostname/xxx.xxx.xxx.xxx
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:39:56 UTC 2011
************************************************************/
12/02/29 01:42:08 INFO util.GSet: VM type = 64-bit
12/02/29 01:42:08 INFO util.GSet: 2% max memory = 2.27625 MB
12/02/29 01:42:08 INFO util.GSet: capacity = 2^18 = 262144 entries
12/02/29 01:42:08 INFO util.GSet: recommended=262144, actual=262144
12/02/29 01:42:08 INFO namenode.FSNamesystem: fsOwner=hadoop
12/02/29 01:42:08 INFO namenode.FSNamesystem: supergroup=supergroup
12/02/29 01:42:08 INFO namenode.FSNamesystem: isPermissionEnabled=true
12/02/29 01:42:08 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
12/02/29 01:42:08 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
12/02/29 01:42:08 INFO namenode.NameNode: Caching file names occuring more than 10 times
12/02/29 01:42:08 INFO common.Storage: Image file of size 112 saved in 0 seconds.
12/02/29 01:42:09 INFO common.Storage: Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted.
12/02/29 01:42:09 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hostname/xxx.xxx.xxx.xxx
************************************************************/
$

実際には、ホスト名とIPアドレスの欄は実行された環境の値が入っています。

次に、デーモンの起動と言うことで、start-all.shを起動…ってやっぱりどこにあるやらわからない訳です。 調べてみましょう。

$ find / -name "start-all.sh" 2> /dev/null
/usr/sbin/start-all.sh

では実行しましょう。

$ /usr/sbin/start-all.sh
-bash: /usr/sbin/start-all.sh: 許可がありません
$ ls -l /usr/sbin/start-all.sh
-rw-r--r--. 1 root root 1166 12月 16 01:40 2011 /usr/sbin/start-all.sh

ふっ…この程度では引きませんぜ…

$ head -1 /usr/sbin/start-all.sh
#!/usr/bin/env bash
$ bash /usr/sbin/start-all.sh
/usr/sbin/start-all.sh: line 31: /usr/sbin/start-dfs.sh: 許可がありません
/usr/sbin/start-all.sh: line 34: /usr/sbin/start-mapred.sh: 許可がありません

参りましたm( )m

気を取り直して…調べましょう。

$ su -
パスワード:
# # rpm -qpl /hadoop/hadoop-1.0.0-1.amd64.rpm | grep /usr/sbin
/usr/sbin
/usr/sbin/hadoop-create-user.sh
/usr/sbin/hadoop-daemon.sh
/usr/sbin/hadoop-daemons.sh
/usr/sbin/hadoop-setup-applications.sh
/usr/sbin/hadoop-setup-conf.sh
/usr/sbin/hadoop-setup-hdfs.sh
/usr/sbin/hadoop-setup-single-node.sh
/usr/sbin/hadoop-validate-setup.sh
/usr/sbin/rcc
/usr/sbin/slaves.sh
/usr/sbin/start-all.sh
/usr/sbin/start-balancer.sh
/usr/sbin/start-dfs.sh
/usr/sbin/start-jobhistoryserver.sh
/usr/sbin/start-mapred.sh
/usr/sbin/stop-all.sh
/usr/sbin/stop-balancer.sh
/usr/sbin/stop-dfs.sh
/usr/sbin/stop-jobhistoryserver.sh
/usr/sbin/stop-mapred.sh
/usr/sbin/update-hadoop-env.sh

上記ファイルについてchmod +xをしていきます。

気を取り直して…

$ /usr/sbin/start-all.sh
starting namenode, logging to /var/log/hadoop/hadoop/hadoop-hadoop-namenode-hostname.out
localhost: starting datanode, logging to /var/log/hadoop/hadoop/hadoop-hadoop-datanode-hostname.out
localhost: starting secondarynamenode, logging to /var/log/hadoop/hadoop/hadoop-hadoop-secondarynamenode-hostname.out
starting jobtracker, logging to /var/log/hadoop/hadoop/hadoop-hadoop-jobtracker-hostname.out
localhost: starting tasktracker, logging to /var/log/hadoop/hadoop/hadoop-hadoop-tasktracker-hostname.out

※hostnameは全て実行環境のホスト名となります。

うまくいったか調べてみましょう。 firefoxhadoopのステータス画面を表示します。

無事表示されました。よかった!

サンプル実行

前回と同じサンプルプログラムを実行します。 まずは、分散ファイルシステムへのファイル転送です。 分散ファイルシステムのファイル操作はhadoop fsコマンドを利用するようです。

$ pwd
/hadoop/test
$ ls
input output
$ hadoop fs -ls /
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2012-02-29 02:05 /tmp
$ hadoop fs -put input /
$ hadoop fs -ls /
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2012-02-29 02:29 /input
drwxr-xr-x - hadoop supergroup 0 2012-02-29 02:05 /tmp
$ hadoop fs -ls /input
Found 1 items
-rw-r--r-- 1 hadoop supergroup 500838 2012-02-29 02:29 /input/pg12429.txt

これで転送完了。それでは実行しましょう。

$ hadoop jar /usr/share/hadoop/hadoop-examples-1.0.0.jar wordcount /input /output
12/02/29 02:31:11 INFO input.FileInputFormat: Total input paths to process : 1
12/02/29 02:31:11 INFO mapred.JobClient: Running job: job_201202290205_0001
12/02/29 02:31:12 INFO mapred.JobClient: map 0% reduce 0%
12/02/29 02:31:26 INFO mapred.JobClient: map 100% reduce 0%
12/02/29 02:31:38 INFO mapred.JobClient: map 100% reduce 100%
12/02/29 02:31:43 INFO mapred.JobClient: Job complete: job_201202290205_0001
12/02/29 02:31:43 INFO mapred.JobClient: Counters: 29
12/02/29 02:31:43 INFO mapred.JobClient: Job Counters
12/02/29 02:31:43 INFO mapred.JobClient: Launched reduce tasks=1
12/02/29 02:31:43 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=12291
12/02/29 02:31:43 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0
12/02/29 02:31:43 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0
12/02/29 02:31:43 INFO mapred.JobClient: Launched map tasks=1
12/02/29 02:31:43 INFO mapred.JobClient: Data-local map tasks=1
12/02/29 02:31:43 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=10221
12/02/29 02:31:43 INFO mapred.JobClient: File Output Format Counters
12/02/29 02:31:43 INFO mapred.JobClient: Bytes Written=176845
12/02/29 02:31:43 INFO mapred.JobClient: FileSystemCounters
12/02/29 02:31:43 INFO mapred.JobClient: FILE_BYTES_READ=524362
12/02/29 02:31:43 INFO mapred.JobClient: HDFS_BYTES_READ=500942
12/02/29 02:31:43 INFO mapred.JobClient: FILE_BYTES_WRITTEN=829593
12/02/29 02:31:43 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=176845
12/02/29 02:31:43 INFO mapred.JobClient: File Input Format Counters
12/02/29 02:31:43 INFO mapred.JobClient: Bytes Read=500838
12/02/29 02:31:43 INFO mapred.JobClient: Map-Reduce Framework
12/02/29 02:31:43 INFO mapred.JobClient: Map output materialized bytes=262178
12/02/29 02:31:43 INFO mapred.JobClient: Map input records=8176
12/02/29 02:31:43 INFO mapred.JobClient: Reduce shuffle bytes=262178
12/02/29 02:31:43 INFO mapred.JobClient: Spilled Records=54363
12/02/29 02:31:43 INFO mapred.JobClient: Map output bytes=834793
12/02/29 02:31:43 INFO mapred.JobClient: CPU time spent (ms)=4370
12/02/29 02:31:43 INFO mapred.JobClient: Total committed heap usage (bytes)=186515456
12/02/29 02:31:43 INFO mapred.JobClient: Combine input records=85987
12/02/29 02:31:43 INFO mapred.JobClient: SPLIT_RAW_BYTES=104
12/02/29 02:31:43 INFO mapred.JobClient: Reduce input records=18121
12/02/29 02:31:43 INFO mapred.JobClient: Reduce input groups=16622
12/02/29 02:31:43 INFO mapred.JobClient: Combine output records=18121
12/02/29 02:31:43 INFO mapred.JobClient: Physical memory (bytes) snapshot=206737408
12/02/29 02:31:43 INFO mapred.JobClient: Reduce output records=16622
12/02/29 02:31:43 INFO mapred.JobClient: Virtual memory (bytes) snapshot=3044974592
12/02/29 02:31:43 INFO mapred.JobClient: Map output records=85987

お〜!動いたみたいです。結果を確認しましょう。

$ hadoop fs -ls /
Found 3 items
drwxr-xr-x - hadoop supergroup 0 2012-02-29 02:29 /input
drwxr-xr-x - hadoop supergroup 0 2012-02-29 02:31 /output
drwxr-xr-x - hadoop supergroup 0 2012-02-29 02:05 /tmp
$ hadoop fs -ls /input
Found 1 items
-rw-r--r-- 1 hadoop supergroup 500838 2012-02-29 02:29 /input/pg12429.txt
$ hadoop fs -ls /output
Found 3 items
-rw-r--r-- 1 hadoop supergroup 0 2012-02-29 02:31 /output/_SUCCESS
drwxr-xr-x - hadoop supergroup 0 2012-02-29 02:31 /output/_logs
-rw-r--r-- 1 hadoop supergroup 176845 2012-02-29 02:31 /output/part-r-00000
$ hadoop fs -cat /output/part-r-00000 | head -8
"A 3
"Above 2
"Ah! 1
"Ah, 2
"Ah," 1
"An' 1
"And 1
"Announced 1
cat: Unable to write to output stream.
$

前回と同じ結果が得られました!無事動作しましたね。

ついでに、実行後には、Webインターフェースから以下の記録が確認できました。

次回

今回は妙なハマり方をしなかったので良かったです。 次回は完全分散モードです。 実際にhadoop環境を3環境用意し、分散計算してみます。

参考