2015-12-21 42 views

回答

4

Hadoop MapReduce作業計數器根據定義Java long值。 MapReduce作業實現可以通過TaskAttemptContext獲取Counter的句柄。

http://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/mapreduce/TaskAttemptContext.html#getCounter(java.lang.Enum)

獲得的句柄Counter後,作業可以通過增量遞增計數器或將其設置爲一個特定值。

http://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/mapreduce/Counter.html#increment(long)

http://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/mapreduce/Counter.html#setValue(long)

注意,方法簽名都在long術語規定。域模型不支持使用double或任何其他數據類型作爲計數器值。

如果這是絕對必要的,那麼你可以想出一些創造性的方式來編碼你的數據類型到long。一種方法是利用longdouble都是64位的事實。然後,您可以使用Double#doubleToLongBitsdouble的值編碼爲long

http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#doubleToLongBits(double)

然而,只有這樣才能使這個後來感覺是寫解包工作完成後計數器的值,並將其傳遞到Double#longBitsToDouble自定義代碼。

http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#longBitsToDouble(long)

這將是Hadoop的MapReduce工作櫃檯的一個非常不尋常的用法,但。

+0

謝謝,我正在尋找這樣的東西。 – Unknownguy

0

作爲一種變通方法,你可以做這樣的事情

long convert = (long) (mydoubleVal * 10000); 
context.getCounter(MyCounter.name1).setValue(convert); 

而且在驅動程序,你可以得到雙倍值。

long c2 = job0.getCounters().findCounter(MyCounter.name1) 
        .getValue(); 
double getMyVal= (double) c2/10000;