The HIRO Says

If you smell what The HIRO is cooking!!!

Hadoopの初期設定方法

Google App EngineBigTable を深く知ろうと、Google が公開している論文を読み始めたら、Google File System や MapReduce にも興味が広がり、気がついたら Hadoop をいじり倒したくなっていました。
今回は、Hadoop をひとまず動かしてみるところまでやってみます。
※ちなみに、Hadoop 自体の説明については、こちらをご覧下さい。


◆前提条件

1.最初の目標

(1)Windows 上で、standalone モードで Hadoop を動作させる。
(2)Hadoopバージョンは、0.20.2 とする。
Hadoop : The Definitive Guide』(2nd)で扱われているのは 0.20 系なので、現時点で最新の stable 版の 0.20.2 を使用することにしました。

Hadoop: The Definitive Guide

Hadoop: The Definitive Guide


2.WindowsHadoopを動かすには

WindowsHadoop を動かすには、JDKcygwin が必要です。

  1. Hadoop は主に Java で構築されているので、動作させるためには JDK(1.6 以上)が必要です。
  2. Hadoop のコマンドが shell 形式であること、また Hadoop を distributed mode で動作させる際に sshsshd 等を使用することから、WindowsHadoop を動作させるためには cygwin が必要です。
3.環境一覧

今回の設定は、以下の環境で実施しました。

名前 version
Hadoop 0.20.2
Windows Windows XP Home Edition Version 2002 Service Pack 3
JDK 1.6.0_10

Hadoopの設定手順

(1)http://hadoop.apache.org/ へアクセスします。
(2)"Hadoop Common" のリンクを選択します。
(3)"Download" のリンクを選択します。
(4)"Download a release now!" のリンクを選択します。
(5)適当なミラーサイトを選択します。
(6)hadoop-0.20.2/hadoop-0.20.2.tar.gz を選択し、ダウンロードします。
(7)hadoop-0.20.2.tar.gz を、適当なディレクトリに解凍します。
以下、Hadoop のインストールディレクトリを、"$HADOOP_INSTALL" と表記します。


◆動作確認

公式サイトのクイックスタートに従い、設定した Hadoop を起動してみます。
(1)cygwin を起動します。


(2)$HADOOP_INSTALL へ移動します。


(3)$HADOOP_INSTALL/input ディレクトリを作成します。
【コマンド】 mkdir input


(4)$HADOOP_INSTALL/conf にある xml ファイルを、$HADOOP_INSTALL/input へコピーします。
【コマンド】 cp conf/*.xml input


(5)$HADOOP_INSTALL/bin/hadoop コマンドを使い、Hadoop のサンプルを実行してみます。
【コマンド】 bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'dfs[a-z.]+'


(6)以下のようなログが出力されれば、動作確認成功です。

11/05/03 22:47:39 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
11/05/03 22:47:40 INFO mapred.FileInputFormat: Total input paths to process : 5
11/05/03 22:47:40 INFO mapred.JobClient: Running job: job_local_0001
11/05/03 22:47:40 INFO mapred.FileInputFormat: Total input paths to process : 5
11/05/03 22:47:40 INFO mapred.MapTask: numReduceTasks: 1
11/05/03 22:47:40 INFO mapred.MapTask: io.sort.mb = 100
11/05/03 22:47:40 INFO mapred.MapTask: data buffer = 79691776/99614720
11/05/03 22:47:40 INFO mapred.MapTask: record buffer = 262144/327680
11/05/03 22:47:41 INFO mapred.MapTask: Starting flush of map output
11/05/03 22:47:41 INFO mapred.JobClient:  map 0% reduce 0%
11/05/03 22:47:42 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 isdone. And is in the process of commiting
11/05/03 22:47:42 INFO mapred.LocalJobRunner: file:/d:/hadoop-0.20.2/input/capacity-scheduler.xml:0+3936
11/05/03 22:47:42 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
11/05/03 22:47:42 INFO mapred.MapTask: numReduceTasks: 1
11/05/03 22:47:42 INFO mapred.MapTask: io.sort.mb = 100
11/05/03 22:47:42 INFO mapred.MapTask: data buffer = 79691776/99614720
11/05/03 22:47:42 INFO mapred.MapTask: record buffer = 262144/327680
11/05/03 22:47:42 INFO mapred.MapTask: Starting flush of map output
11/05/03 22:47:42 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000001_0 isdone. And is in the process of commiting
11/05/03 22:47:42 INFO mapred.LocalJobRunner: file:/d:/hadoop-0.20.2/input/core-site.xml:0+178
11/05/03 22:47:42 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000001_0' done.
11/05/03 22:47:42 INFO mapred.MapTask: numReduceTasks: 1
11/05/03 22:47:42 INFO mapred.MapTask: io.sort.mb = 100
11/05/03 22:47:42 INFO mapred.MapTask: data buffer = 79691776/99614720
11/05/03 22:47:42 INFO mapred.MapTask: record buffer = 262144/327680
11/05/03 22:47:42 INFO mapred.MapTask: Starting flush of map output
11/05/03 22:47:42 INFO mapred.MapTask: Finished spill 0
11/05/03 22:47:42 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000002_0 isdone. And is in the process of commiting
11/05/03 22:47:42 INFO mapred.LocalJobRunner: file:/d:/hadoop-0.20.2/input/hadoop-policy.xml:0+4190
11/05/03 22:47:42 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000002_0' done.
11/05/03 22:47:42 INFO mapred.MapTask: numReduceTasks: 1
11/05/03 22:47:42 INFO mapred.MapTask: io.sort.mb = 100
11/05/03 22:47:42 INFO mapred.MapTask: data buffer = 79691776/99614720
11/05/03 22:47:42 INFO mapred.MapTask: record buffer = 262144/327680
11/05/03 22:47:42 INFO mapred.MapTask: Starting flush of map output
11/05/03 22:47:42 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000003_0 isdone. And is in the process of commiting
11/05/03 22:47:42 INFO mapred.LocalJobRunner: file:/d:/hadoop-0.20.2/input/hdfs-site.xml:0+178
11/05/03 22:47:42 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000003_0' done.
11/05/03 22:47:42 INFO mapred.MapTask: numReduceTasks: 1
11/05/03 22:47:42 INFO mapred.MapTask: io.sort.mb = 100
11/05/03 22:47:42 INFO mapred.JobClient:  map 100% reduce 0%
11/05/03 22:47:42 INFO mapred.MapTask: data buffer = 79691776/99614720
11/05/03 22:47:42 INFO mapred.MapTask: record buffer = 262144/327680
11/05/03 22:47:42 INFO mapred.MapTask: Starting flush of map output
11/05/03 22:47:42 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000004_0 isdone. And is in the process of commiting
11/05/03 22:47:42 INFO mapred.LocalJobRunner: file:/d:/hadoop-0.20.2/input/mapred-site.xml:0+178
11/05/03 22:47:42 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000004_0' done.
11/05/03 22:47:42 INFO mapred.LocalJobRunner:
11/05/03 22:47:42 INFO mapred.Merger: Merging 5 sorted segments
11/05/03 22:47:42 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 21 bytes
11/05/03 22:47:42 INFO mapred.LocalJobRunner:
11/05/03 22:47:43 INFO mapred.TaskRunner: Task:attempt_local_0001_r_000000_0 isdone. And is in the process of commiting
11/05/03 22:47:43 INFO mapred.LocalJobRunner:
11/05/03 22:47:43 INFO mapred.TaskRunner: Task attempt_local_0001_r_000000_0 isallowed to commit now
11/05/03 22:47:43 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to file:/d:/hadoop-0.20.2/grep-temp-870476696
11/05/03 22:47:43 INFO mapred.LocalJobRunner: reduce > reduce
11/05/03 22:47:43 INFO mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.
11/05/03 22:47:43 INFO mapred.JobClient:  map 100% reduce 100%
11/05/03 22:47:43 INFO mapred.JobClient: Job complete: job_local_0001
11/05/03 22:47:43 INFO mapred.JobClient: Counters: 13
11/05/03 22:47:43 INFO mapred.JobClient:   FileSystemCounters
11/05/03 22:47:43 INFO mapred.JobClient:     FILE_BYTES_READ=978421
11/05/03 22:47:43 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=1031389
11/05/03 22:47:43 INFO mapred.JobClient:   Map-Reduce Framework
11/05/03 22:47:43 INFO mapred.JobClient:     Reduce input groups=1
11/05/03 22:47:43 INFO mapred.JobClient:     Combine output records=1
11/05/03 22:47:43 INFO mapred.JobClient:     Map input records=219
11/05/03 22:47:43 INFO mapred.JobClient:     Reduce shuffle bytes=0
11/05/03 22:47:43 INFO mapred.JobClient:     Reduce output records=1
11/05/03 22:47:43 INFO mapred.JobClient:     Spilled Records=2
11/05/03 22:47:43 INFO mapred.JobClient:     Map output bytes=17
11/05/03 22:47:43 INFO mapred.JobClient:     Map input bytes=8660
11/05/03 22:47:43 INFO mapred.JobClient:     Combine input records=1
11/05/03 22:47:43 INFO mapred.JobClient:     Map output records=1
11/05/03 22:47:43 INFO mapred.JobClient:     Reduce input records=1
11/05/03 22:47:43 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
11/05/03 22:47:43 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
11/05/03 22:47:44 INFO mapred.FileInputFormat: Total input paths to process : 1
11/05/03 22:47:44 INFO mapred.JobClient: Running job: job_local_0002
11/05/03 22:47:44 INFO mapred.FileInputFormat: Total input paths to process : 1
11/05/03 22:47:44 INFO mapred.MapTask: numReduceTasks: 1
11/05/03 22:47:44 INFO mapred.MapTask: io.sort.mb = 100
11/05/03 22:47:44 INFO mapred.MapTask: data buffer = 79691776/99614720
11/05/03 22:47:44 INFO mapred.MapTask: record buffer = 262144/327680
11/05/03 22:47:44 INFO mapred.MapTask: Starting flush of map output
11/05/03 22:47:44 INFO mapred.MapTask: Finished spill 0
11/05/03 22:47:44 INFO mapred.TaskRunner: Task:attempt_local_0002_m_000000_0 isdone. And is in the process of commiting
11/05/03 22:47:44 INFO mapred.LocalJobRunner: file:/d:/hadoop-0.20.2/grep-temp-870476696/part-00000:0+111
11/05/03 22:47:44 INFO mapred.TaskRunner: Task 'attempt_local_0002_m_000000_0' done.
11/05/03 22:47:44 INFO mapred.LocalJobRunner:
11/05/03 22:47:44 INFO mapred.Merger: Merging 1 sorted segments
11/05/03 22:47:44 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 21 bytes
11/05/03 22:47:44 INFO mapred.LocalJobRunner:
11/05/03 22:47:44 INFO mapred.TaskRunner: Task:attempt_local_0002_r_000000_0 isdone. And is in the process of commiting
11/05/03 22:47:44 INFO mapred.LocalJobRunner:
11/05/03 22:47:44 INFO mapred.TaskRunner: Task attempt_local_0002_r_000000_0 isallowed to commit now
11/05/03 22:47:44 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0002_r_000000_0' to file:/d:/hadoop-0.20.2/output
11/05/03 22:47:44 INFO mapred.LocalJobRunner: reduce > reduce
11/05/03 22:47:44 INFO mapred.TaskRunner: Task 'attempt_local_0002_r_000000_0' done.
11/05/03 22:47:45 INFO mapred.JobClient:  map 100% reduce 100%
11/05/03 22:47:45 INFO mapred.JobClient: Job complete: job_local_0002
11/05/03 22:47:45 INFO mapred.JobClient: Counters: 13
11/05/03 22:47:45 INFO mapred.JobClient:   FileSystemCounters
11/05/03 22:47:45 INFO mapred.JobClient:     FILE_BYTES_READ=640893
11/05/03 22:47:45 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=684769
11/05/03 22:47:45 INFO mapred.JobClient:   Map-Reduce Framework
11/05/03 22:47:45 INFO mapred.JobClient:     Reduce input groups=1
11/05/03 22:47:45 INFO mapred.JobClient:     Combine output records=0
11/05/03 22:47:45 INFO mapred.JobClient:     Map input records=1
11/05/03 22:47:45 INFO mapred.JobClient:     Reduce shuffle bytes=0
11/05/03 22:47:45 INFO mapred.JobClient:     Reduce output records=1
11/05/03 22:47:45 INFO mapred.JobClient:     Spilled Records=2
11/05/03 22:47:45 INFO mapred.JobClient:     Map output bytes=17
11/05/03 22:47:45 INFO mapred.JobClient:     Map input bytes=25
11/05/03 22:47:45 INFO mapred.JobClient:     Combine input records=0
11/05/03 22:47:45 INFO mapred.JobClient:     Map output records=1
11/05/03 22:47:45 INFO mapred.JobClient:     Reduce input records=1

◆残タスク

以上を見れば、まだ「Hadoop を動かせるようになったっぽい」というだけで、ちっともこなれていませんね。
なのでこの後は、次のようなことに1つずつトライしていこうと思います。
(1)独自の MapReduce のプログラムを構築・実行する。
(2)独自の Hadoop アプリケーションを実行する。
(3)最新バージョンの 0.21.0 を飼いならすこと。


◆参考資料

(1)Hadoop 0.20.2 の Quick Start
http://hadoop.apache.org/common/docs/r0.20.2/quickstart.html


(2)BigTableGoogle の論文)
http://labs.google.com/papers/bigtable.html


(3)Google File System(Google の論文)
http://labs.google.com/papers/gfs.html