hadoop计数器如何使用不同类型的计数器?

yhived7q  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(475)

我的问题是,我怎么做计数器,我可以把像double之类的东西放进去(是的,我确实用了longvalue,但它给了我0)?

dz6r00yl

dz6r00yl1#

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(长)
http://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/mapreduce/counter.html#setvalue(长)
注意,方法签名都是按照 long . 域模型不支持使用 double 或任何其他数据类型作为计数器值。
如果这是绝对必要的,那么您可以想出一些创造性的方法将您的数据类型编码为 long . 一种方法是利用这两个事实 long 以及 double 是64位宽。你可以用 Double#doubleToLongBits 编码 double 价值观 long .
http://docs.oracle.com/javase/7/docs/api/java/lang/double.html#doubletolongbits(双倍)
但是,以后理解这一点的唯一方法是编写自定义代码,在作业完成后解压计数器值并将其传递给服务器 Double#longBitsToDouble .
http://docs.oracle.com/javase/7/docs/api/java/lang/double.html#longbitstodouble(长)
不过,这将是hadoopmapreduce作业计数器的一个非常不寻常的用法。

ozxc1zmp

ozxc1zmp2#

作为解决方法,你可以这样做

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

在driver中可以得到双值。

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

相关问题