Hadoop Streamingでカウンタで調子に乗った話
簡単にカウンタが出せたので,集計もやらせてみようと思ったのです.
例えば,次のようなファイルがあるとします.
iPhone
iPhone
iPhone
iPhone
iPhone
iPhone
Android
Android
iPhone
iPhone
iPhone
キーの出現回数をカウントする(つもりの)プログラムを作りました.
STDIN.each_line.{|line| os = line.chomp! STDERR.puts "reporter:counter:Count,OS_{#{os}},1" }
テストではうまくいった感じです.
Count OS_Android=9368 OS_iPhone=24790
なんてOSごとの集計ができました.
そこで調子に乗ってもっと巨大なファイルを入力したら,
2014-08-12 18:55:56,423 INFO [Thread-1] org.apache.hadoop.yarn.service.CompositeService: Error stopping JobHistoryEventHandler org.apache.hadoop.mapreduce.counters.LimitExceededException: Too many counters: 121 max=120 at org.apache.hadoop.mapreduce.counters.Limits.checkCounters(Limits.java:60) at org.apache.hadoop.mapreduce.counters.Limits.incrCounters(Limits.java:67) at org.apache.hadoop.mapreduce.counters.AbstractCounterGroup.addCounter(AbstractCounterGroup.java:78) at org.apache.hadoop.mapreduce.counters.AbstractCounterGroup.addCounterImpl(AbstractCounterGroup.java:95) at org.apache.hadoop.mapreduce.counters.AbstractCounterGroup.findCounter(AbstractCounterGroup.java:106) at org.apache.hadoop.mapreduce.counters.AbstractCounterGroup.incrAllCounters(AbstractCounterGroup.java:203) at org.apache.hadoop.mapreduce.counters.AbstractCounters.incrAllCounters(AbstractCounters.java:348) at org.apache.hadoop.mapreduce.v2.app.job.impl.JobImpl.incrTaskCounters(JobImpl.java:672) at org.apache.hadoop.mapreduce.v2.app.job.impl.JobImpl.getAllCounters(JobImpl.java:662) at org.apache.hadoop.mapreduce.jobhistory.JobHistoryEventHandler.processEventForJobSummary(JobHistoryEventHandler.java:601) at org.apache.hadoop.mapreduce.jobhistory.JobHistoryEventHandler.handleEvent(JobHistoryEventHandler.java:492) at org.apache.hadoop.mapreduce.jobhistory.JobHistoryEventHandler.stop(JobHistoryEventHandler.java:340) at org.apache.hadoop.yarn.service.CompositeService.stop(CompositeService.java:99) at org.apache.hadoop.yarn.service.CompositeService.stop(CompositeService.java:89) at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$MRAppMasterShutdownHook.run(MRAppMaster.java:1128) at org.apache.hadoop.util.ShutdownHookManager$1.run(ShutdownHookManager.java:54)
Too many counters.
そこでちゃんとキーと1をmapperからemitして,reducerで集計することにしました...