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