擬似分散モードで実験してみる。
Hadoopには、単語を数えるデモが付いてくるのでこれを使う。

カウント対象テキストの準備

以下のようなファイルを作る。

[hadoop@isis ~/sandbox/input]$ ls
test.txt
[hadoop@isis ~/sandbox]$ cat ./input/test.txt
aa
bb
cc
aa
bb

ファイルのHDFSへの格納

上で作ったファイルをHDFSに置く。
こういったファイル操作は、hadoopコマンドにdfsを付けて、-putとか-lsとか叩く。
hadoop dfsとやれば使用できるコマンドの一覧が表示される。-catとか-rmとかも使える。ディレクトリの削除は-rmr。

下記の例では、カレントディレクトリにあるinputディレクトリを、HDFSのinputディレクトリに-putでコピーしている。
inputディレクトリには、先に作ったtest.txtが入っている。

[hadoop@isis ~/sandbox]$ hadoop dfs -put input input
[hadoop@isis ~/sandbox]$
[hadoop@isis ~/sandbox]$ hadoop dfs -ls
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2013-07-27 23:51 /user/hadoop/input
[hadoop@isis ~/sandbox]$
[hadoop@isis ~/sandbox]$ hadoop dfs -ls input
Found 1 items
-rw-r--r--   1 hadoop supergroup         15 2013-07-27 23:51 /user/hadoop/input/test.txt

送り先には絶対パスを付けなくても自動的に/usr/hadoopの下になっていることが分かる。
すなわち、~/sandboxにいるときに、送り元、送り先双方にinputを指定すると、ローカルの~/hadoop/sandbox/inputが、HDFS上の/usr/hadoop/inputにコピーされる。

wordcountの実行

hadoop-examples-1.0.0.jarにwordcountと続け、カウント対象のファイルが置かれるディレクトリ、カウント結果のファイルが置かれるディレクトリを指定する。
下記の例では先にコピーしたinputを、結果をoutputとして指定する。
outputはこの時点では無くてOK。
「outputがすでにあるよ」と言われたら中身を確認してからhadoop dfs -rmr outputなどとして消す。

hadoopの実行は何かとコマンドが長くなりがちなので、\を使って見やすく複数行にしたほうがよいでしょう。

[hadoop@isis ~/sandbox]$ hadoop jar \
/usr/local/share/examples/hadoop/hadoop-examples-1.0.0.jar \
wordcount input output

13/07/28 00:02:27 INFO input.FileInputFormat: Total input paths to process : 1
13/07/28 00:02:45 INFO mapred.JobClient: Running job: job_201307272333_0001
13/07/28 00:02:46 INFO mapred.JobClient:  map 0% reduce 0%
13/07/28 00:06:44 INFO mapred.JobClient:  map 100% reduce 0%
13/07/28 00:08:01 INFO mapred.JobClient:  map 100% reduce 66%
13/07/28 00:08:11 INFO mapred.JobClient:  map 100% reduce 100%
13/07/28 00:09:15 INFO mapred.JobClient: Job complete: job_201307272333_0001
13/07/28 00:09:26 INFO mapred.JobClient: Counters: 26
13/07/28 00:09:26 INFO mapred.JobClient:   Job Counters
13/07/28 00:09:26 INFO mapred.JobClient:     Launched reduce tasks=1
13/07/28 00:09:26 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=159745
13/07/28 00:09:26 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
13/07/28 00:09:26 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
13/07/28 00:09:26 INFO mapred.JobClient:     Launched map tasks=1
13/07/28 00:09:26 INFO mapred.JobClient:     Data-local map tasks=1
13/07/28 00:09:26 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=66457
13/07/28 00:09:26 INFO mapred.JobClient:   File Output Format Counters
13/07/28 00:09:26 INFO mapred.JobClient:     Bytes Written=15
13/07/28 00:09:26 INFO mapred.JobClient:   FileSystemCounters
13/07/28 00:09:26 INFO mapred.JobClient:     FILE_BYTES_READ=33
13/07/28 00:09:26 INFO mapred.JobClient:     HDFS_BYTES_READ=123
13/07/28 00:09:26 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=43099
13/07/28 00:09:26 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=15
13/07/28 00:09:26 INFO mapred.JobClient:   File Input Format Counters
13/07/28 00:09:26 INFO mapred.JobClient:     Bytes Read=15
13/07/28 00:09:26 INFO mapred.JobClient:   Map-Reduce Framework
13/07/28 00:09:26 INFO mapred.JobClient:     Map output materialized bytes=33
13/07/28 00:09:26 INFO mapred.JobClient:     Map input records=5
13/07/28 00:09:26 INFO mapred.JobClient:     Reduce shuffle bytes=0
13/07/28 00:09:26 INFO mapred.JobClient:     Spilled Records=6
13/07/28 00:09:26 INFO mapred.JobClient:     Map output bytes=35
13/07/28 00:09:26 INFO mapred.JobClient:     Total committed heap usage (bytes)=209518592
13/07/28 00:09:26 INFO mapred.JobClient:     Combine input records=5
13/07/28 00:09:26 INFO mapred.JobClient:     SPLIT_RAW_BYTES=108
13/07/28 00:09:26 INFO mapred.JobClient:     Reduce input records=3
13/07/28 00:09:26 INFO mapred.JobClient:     Reduce input groups=3
13/07/28 00:09:26 INFO mapred.JobClient:     Combine output records=3
13/07/28 00:09:26 INFO mapred.JobClient:     Reduce output records=3
13/07/28 00:09:26 INFO mapred.JobClient:     Map output records=5
[hadoop@isis ~/sandbox]$

仮想環境上とはいえ7分てどういうこと。

結果の確認

結果は。指定したディレクトリ、outputに格納される。
outputの中身を見ると、処理の成功したことを示す_SUCCESSというファイルに、結果の書き込まれるpart-r-00000が格納されている。
hadoop dfs -catで中身を確認すると、各単語の数がリストされている。

[hadoop@isis ~/sandbox]$ hadoop dfs -ls

Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2013-07-27 23:51 /user/hadoop/input
drwxr-xr-x   - hadoop supergroup          0 2013-07-28 00:08 /user/hadoop/output
[hadoop@isis ~/sandbox]$ hadoop dfs -ls output
Warning: $HADOOP_HOME is deprecated.

Found 3 items
-rw-r--r--   1 hadoop supergroup          0 2013-07-28 00:08 /user/hadoop/output/_SUCCESS
drwxr-xr-x   - hadoop supergroup          0 2013-07-28 00:02 /user/hadoop/output/_logs
-rw-r--r--   1 hadoop supergroup         15 2013-07-28 00:08 /user/hadoop/output/part-r-00000
[hadoop@isis ~/sandbox]$
[hadoop@isis ~/sandbox]$ hadoop dfs -cat output/part-r-00000
aa      2
bb      2
cc      1
[hadoop@isis ~/sandbox]$

これだけのために7分とは。
実マシン、かつもっともっと大きなログで試してみたいところ。