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で集計することにしました...