擬似分散モードで実験してみる。
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分とは。
実マシン、かつもっともっと大きなログで試してみたいところ。