Hadoopセットアップ-その1(スタンドアロンモード)

久しぶりにHadoopを使ってみようと思います。 hadoopには以前から興味があり、試しにさわった程度の経験はありますが かなり忘れてしまっているので、もはや手探り状態です。

まずは公式サイトのドキュメントに従ってインストールします。

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

必要な環境を整える

私の環境にはrsyncが入っていなかったため、rsyncをインストールします。

# yum install rsync


Complete!

パッケージのダウンロードと展開

以下のサイトからHadoopのパッケージをダウンロードします。

ダウンロードサイト:Hadoop Common Releases

私はhadoop-1.0.0-1.amd64.rpmをダウンロードしました。

ダウンロードパッケージはrpm形式なので素直にインストールします。 今回は作業ディレクトリとして/hadoopを用意しておきました。

# rpm -Uvh hadoop-1.0.0-1.amd64.rpm
準備中... ########################################### [100%]
1:hadoop ########################################### [100%]

はて、どこにインストールされたやら…"hadoop"という名前のディレクトリを探してみると、これだけありました。

# find / -name "hadoop" 2> /dev/null
/hadoop
/var/run/hadoop
/var/log/hadoop
/etc/hadoop
/usr/share/hadoop
/usr/share/doc/hadoop
/usr/include/hadoop
/usr/etc/hadoop
/usr/bin/hadoop

※一番上は作業用ディレクト

おぉ、結構バラバラですね。

設定

公式サイトによると、この後設定ファイルを書き換えます。 設定ファイルはconf/hadoop-env.shです…って無い!

どこに行ったかということで調べたら見つかりました。結構いくつもありますね。 どれを修正すれば良いんでしょうか…

# find / -name "hadoop-env.sh" 2> /dev/null
/etc/hadoop/hadoop-env.sh
/etc/profile.d/hadoop-env.sh
/etc/default/hadoop-env.sh
/usr/share/hadoop/templates/conf/hadoop-env.sh

直感的には/etc/hadoop/hadoop-env.shが良さそうですね。 とりあえずこれを修正します。

9行目のJAVA_HOME変数は最低限設定する必要があるようです。

とりあえず動かしてみる

公式サイトの例はなんとなくいまいちなので Project Gutenbergからこちらのテキストを頂いてきました。(UTF-8のテキスト形式です)

/hadoop/testディレクトリを用意し、配下にinputディレクトリを用意します。 inputディレクトリにはダウンロードしたテキストを格納しておきます。

# pwd
/hadoop/test
# ls -F
input/
# ls -F input/
pg12429.txt

このテキストの単語カウントをしてみましょう。

#hadoop jar /usr/share/hadoop/hadoop-examples-1.0.0.jar wordcount input output

java.lang.OutOfMemoryError: Java heap space

ぬお!ヒープが足りない…ナンテコッタイ…

調べること数時間…io.sort.mbというパラメータが問題であることが分かりました。 そこで、/etc/hadoop/mapred-site.xmlに以下の記載を追記。

<property>
  <name>io.sort.mb</name>
  <value>30</value>
</property>

30にしたのは特に意味がなく、そうしている人が多かったからという安直な理由。(ほかには10の人もいました) 名前からしてソートで利用するメモリサイズなのでしょうか? デフォルトが100のようで、30にすると余計小さくして大丈夫なのかという気もしますが…

えいやっ!

# hadoop jar /usr/share/hadoop/hadoop-examples-1.0.0.jar wordcount input output

12/02/11 01:12:13 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to output
12/02/11 01:12:14 INFO mapred.JobClient: map 100% reduce 0%
12/02/11 01:12:16 INFO mapred.LocalJobRunner: reduce > reduce
12/02/11 01:12:16 INFO mapred.Task: Task 'attempt_local_0001_r_000000_0' done.
12/02/11 01:12:17 INFO mapred.JobClient: map 100% reduce 100%
12/02/11 01:12:17 INFO mapred.JobClient: Job complete: job_local_0001
12/02/11 01:12:17 INFO mapred.JobClient: Counters: 20
12/02/11 01:12:17 INFO mapred.JobClient: File Output Format Counters
12/02/11 01:12:17 INFO mapred.JobClient: Bytes Written=178237
12/02/11 01:12:17 INFO mapred.JobClient: FileSystemCounters
12/02/11 01:12:17 INFO mapred.JobClient: FILE_BYTES_READ=2073466
12/02/11 01:12:17 INFO mapred.JobClient: FILE_BYTES_WRITTEN=1578667
12/02/11 01:12:17 INFO mapred.JobClient: File Input Format Counters
12/02/11 01:12:17 INFO mapred.JobClient: Bytes Read=500838
12/02/11 01:12:17 INFO mapred.JobClient: Map-Reduce Framework
12/02/11 01:12:17 INFO mapred.JobClient: Map output materialized bytes=262178
12/02/11 01:12:17 INFO mapred.JobClient: Map input records=8176
12/02/11 01:12:17 INFO mapred.JobClient: Reduce shuffle bytes=0
12/02/11 01:12:17 INFO mapred.JobClient: Spilled Records=54363
12/02/11 01:12:17 INFO mapred.JobClient: Map output bytes=834793
12/02/11 01:12:17 INFO mapred.JobClient: Total committed heap usage (bytes)=186515456
12/02/11 01:12:17 INFO mapred.JobClient: CPU time spent (ms)=0
12/02/11 01:12:17 INFO mapred.JobClient: SPLIT_RAW_BYTES=100
12/02/11 01:12:17 INFO mapred.JobClient: Combine input records=85987
12/02/11 01:12:17 INFO mapred.JobClient: Reduce input records=18121
12/02/11 01:12:17 INFO mapred.JobClient: Reduce input groups=16622
12/02/11 01:12:17 INFO mapred.JobClient: Combine output records=18121
12/02/11 01:12:17 INFO mapred.JobClient: Physical memory (bytes) snapshot=0
12/02/11 01:12:17 INFO mapred.JobClient: Reduce output records=16622
12/02/11 01:12:17 INFO mapred.JobClient: Virtual memory (bytes) snapshot=0
12/02/11 01:12:17 INFO mapred.JobClient: Map output records=85987

動きました!!!

結果が、output/part-r-00000というファイルに出ていました。 たとえば先頭を引用すると、こんな感じです。

"A 3
"Above 2
"Ah! 1
"Ah, 2
"Ah," 1
"An' 1
"And 1
"Announced 1

2行目の「"Above」で検証してみましょう。

# grep -n '"Above ' input/pg12429.txt
4434:erected to his memory at Cornell University is "Above all nations is
7493:upon the memorial of Goldwin Smith at Ithaca, "Above all nations is

tokenizeしてないので少しおかしくなっていますが、確かに単語カウントされていますね!

次回

と言う訳で続きはまた次回。 次回:疑似分散モード+完全分散モードに続きます。 追記: 次回は疑似分散モードについてのみとしました。 完全分散モードは次次回となります。 次回 jnory.hatenablog.com

参考