日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】[Hadoop源码解读](四)MapReduce篇之Counter相关类

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】[Hadoop源码解读](四)MapReduce篇之Counter相关类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://www.cnblogs.com/lucius/p/3449922.html

? ? ? ? ? ? ? ? ? ? ?

? 當我們定義一個Counter時,我們首先要定義一枚舉類型:

1 public static enum MY_COUNTER{ 2 CORRUPTED_DATA_COUNTER, 3 NORMAL_DATA_COUNTER 4 };

然后,我們就可以在mapper或reducer里面增加它的值:

context.getCounter(MY_COUNTER.CORRUPTED_DATA_COUNTER).increment(1);

?我們在第(一)篇講InputFormat時,我們有看到Mapper.class中的Context類是繼承于 MapContext類的,而MapContext又繼承于TaskInputOutputContext,我們可以從 TaskInputOutputContext的getCounter()方法看見,這個方法實際上是調用了StatusReporter的 getCounter()方法,StatusReporter在后面談到。

?

? 接著,我們在提交job,waitForCompletion()方法等待job執行完后,就可以通過

1 Counters counters = job.getCounters(); 2 Counter counter = counters.findCounter(MYCOUNTER.CORRUPTED_DATA_COUNTER); 3 System.out.println(counter.getValue());

這樣就將我們想要輸出的計數器輸出來。如果在執行前企圖輸出,則會報:java.lang.IllegalStateException: Job in state DEFINE instead of RUNNING。

?

? Counter對應我們寫的enum類型中的一個枚舉常量,比如MY_COUNTER.CORRUTED_DATA_COUNTER,它由 name,displayName和value表示,value是Counter當前計數值。Counter、CounterGroup和 Counters都實現了Writable接口,由于Counter是全局的,所以它們的讀寫方法都是synchronized方法,以保證線程安全。

?

? CounterGroup對應我們寫的enum類型,比如MY_COUNTER。CounterGroup有 name,displayName,TreeMap類型的counters,以及一個ResourceBoundle bundle。counters存放的是enum里面的所有枚舉常量對應的Counter。而bundle是用來本地化Counter的名字的。舉個例 子:src\mapred\org\apache\hadoop\mapred下有一個 JobInProgress_Counter.properties文件,內容是這樣的:

1 # ResourceBundle properties file for job-level counters 2 3 CounterGroupName= Job Counters 4 5 NUM_FAILED_MAPS.name= Failed map tasks 6 NUM_FAILED_REDUCES.name= Failed reduce tasks 7 TOTAL_LAUNCHED_MAPS.name= Launched map tasks 8 TOTAL_LAUNCHED_REDUCES.name= Launched reduce tasks 9 OTHER_LOCAL_MAPS.name= Other local map tasks 10 DATA_LOCAL_MAPS.name= Data-local map tasks 11 RACK_LOCAL_MAPS.name= Rack-local map tasks 12 FALLOW_SLOTS_MILLIS_MAPS.name= Total time spent by all maps waiting after reserving slots (ms) 13 FALLOW_SLOTS_MILLIS_REDUCES.name= Total time spent by all reduces waiting after reserving slots (ms)

它存放的是job級別的counters的本地化名字。形式是name = displayName。

?

這樣,我們就可以每次利用name從改文件中讀取displayName,使得當我們改變這個properties文件中的某個displayName的時候,不需要改動程序。

?

? ?Counters是一個Job的Counter最后的匯聚地,在分析Job類得時候,我們看到Job.getCounters()方法是用 RunningJob得到的,而RunningJob是獲取作業情況的一組接口。因為Counters會最終被JobTracker收集,要不斷從 TaskTracker收集并更新,因此它包含一個緩沖最近讀的Counter的cache來進行優化,它還有一個存儲Job的所有Counter的 TreeMap。當我們使用findCounter((Enum<?> key)方法查找Counter時,它會先在cache中查找,如果沒有找到,則會從TreeMap中查找并放入cache中。Counters還實現了 Iterable接口,以支持對Counters的遍歷。另外還提供了increase所有Counter的方法incrAllCounters()。

轉載于:https://www.cnblogs.com/conie/p/3583596.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的【转】[Hadoop源码解读](四)MapReduce篇之Counter相关类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。