Hadoop计数器 - 我如何使用不同类型的计数器?

时间:2015-12-21 20:09:12

标签: hadoop mapreduce

我的问题是,我如何制作计数器,我可以在其中加入双打之类的东西(是的,我确实使用了LongValue,但这给了我0)?

2 个答案:

答案 0 :(得分:4)

Hadoop MapReduce作业计数器定义为Java long值。 MapReduce作业实现可以通过Counter获取TaskAttemptContext的句柄。

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作业计数器来说是非常不寻常的用法。

答案 1 :(得分:0)

作为一种解决方法,你可以做这样的事情

android:layout_margin="3dp"

在“驱动程序”中,您可以获得双倍值。

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