Hadoopにlzoの環境構築(2)

13日目です
#あまりに業務が忙しいので、来週の更新は滞るかもしれません、、、
昨日のブログでlzoのインデックスを作成しました。では、このファイルをMapReduceしてみます。

MapReduceする(1)

CDH4に同梱されているwordcountを試してみましょう。

$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar wordcount lzotest output
13/12/14 00:46:17 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/12/14 00:46:17 INFO input.FileInputFormat: Total input paths to process : 2
13/12/14 00:46:17 WARN snappy.LoadSnappy: Snappy native library is available
13/12/14 00:46:17 INFO snappy.LoadSnappy: Snappy native library loaded
13/12/14 00:46:17 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library
13/12/14 00:46:17 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev 477079631bb6c2b47f15140548e2c0f4efa6996f]
13/12/14 00:46:18 INFO mapred.JobClient: Running job: job_201312121144_0002
13/12/14 00:46:19 INFO mapred.JobClient:  map 0% reduce 0%
13/12/14 00:46:26 INFO mapred.JobClient:  map 50% reduce 0%
13/12/14 00:46:34 INFO mapred.JobClient:  map 50% reduce 16%
(略)

出力を見ると、LZOのライブラリが正しく読み込まれていることがわかります。
ところが、出力結果を見ると、、文字化けっ!

$ hadoofs -tail output/part-r-00000
1p232�4z5<5�6�7�8E99�:�;N<<�=�>X??�@�A_B#	1
��
  r%
    	1

表示されたmapタスク数も2です。3ブロックあるはずなのに。

13/12/14 02:08:06 INFO mapred.JobClient:   Job Counters
13/12/14 02:08:06 INFO mapred.JobClient:     Launched map tasks=2
 hadoop fsck /user/training/lzotest/1G.dat.lzo
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
Connecting to namenode via http://0.0.0.0:50070
FSCK started by training (auth:SIMPLE) from /127.0.0.1 for path /user/training/lzotest/1G.dat.lzo at Sat Dec 14 02:10:16 JST 2013
.Status: HEALTHY
 Total size:	189710458 B
 Total dirs:	0
 Total files:	1
 Total blocks (validated):	3 (avg. block size 63236819 B)
(略)

実は、lzoで圧縮してスプリット可能にしたファイルをMapReduceで処理するためには、ドライバーコードでLzoInputFormatを指定する必要があります。手元のwordcountのコードを修正し、以下を追加しました。

import com.hadoop.mapreduce.LzoTextInputFormat;
  :
  :
job.setInputFormatClass(LzoTextInputFormat.class);
  :

ビルドして再度実行します。

MapReduceする(2)

$ javac -cp `hadoop classpath` *.java
$ jar cvf wordcountlzo.jar *.class
added manifest
adding: SumReducer.class(in = 1586) (out= 660)(deflated 58%)
adding: WordCount.class(in = 1613) (out= 866)(deflated 46%)
adding: WordMapper.class(in = 1699) (out= 707)(deflated 58%)
$ hadoop jar wclzo.jar WordCount lzotest output
13/12/14 01:25:39 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/12/14 01:25:40 INFO input.FileInputFormat: Total input paths to process : 2
13/12/14 01:25:41 INFO mapred.JobClient: Running job: job_201309171025_0007
13/12/14 01:25:42 INFO mapred.JobClient:  map 0% reduce 0%
13/12/14 01:27:15 INFO mapred.JobClient:  map 1% reduce 0%
13/12/14 01:27:17 INFO mapred.JobClient:  map 3% reduce 0%
13/12/14 01:27:18 INFO mapred.JobClient:  map 4% reduce 0%
13/12/14 01:27:20 INFO mapred.JobClient:  map 5% reduce 0%
13/12/14 01:27:21 INFO mapred.JobClient:  map 6% reduce 0%
13/12/14 01:27:23 INFO mapred.JobClient:  map 7% reduce 0%
13/12/14 01:27:24 INFO mapred.JobClient:  map 8% reduce 0%

生成されたMapタスクの数は3。

13/12/14 02:00:23 INFO mapred.JobClient:   Job Counters
13/12/14 02:00:23 INFO mapred.JobClient:     Launched map tasks=3

出力も正常です。

[training@localhost sample_solution]$ hadoop fs -tail output2/part-r-00000
zzua	1
zzugI	1
zzul	1
zzun	1
zzv	19
zzv3	1
zzv5j	1
zzv6	1
(略)

今日はここまで。

コメント