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 (略)
今日はここまで。


コメント