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

标签 hadoop mapreduce

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

最佳答案

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)

获得计数器的句柄后,作业可以将计数器增加增量或将其设置为特定值。

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

关于Hadoop 计数器——如何使用不同类型的计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34403552/

相关文章:

java - TotalOrderPartitioner 和分区文件

java - Hadoop上出现UnsupportedClassVersionError,版本没有明显变化

hadoop - 如果数据量很大,hadoop 如何在本地存储 map 输出?

java - jps命令仅列出jps,但仍提供HDFS服务

hadoop - 无法创建目录/home/hadoop/hadoopinfra/hdfs/namenode/current

hadoop - MapReduce-是否可以通过CustomOutputFormat类覆盖输出目录?

java - 如何通过 Hadoop mapreduce WordCount 对最常重复的单词列表进行排序?

java - 在 Hadoop Map Reduce 中重命名部分文件

apache-spark - HIVE:插入查询失败,错误为 “java.lang.OutOfMemoryError: GC overhead limit exceeded”

java - 来自 java 的异常 ": org.apache.hadoop.ipc.RpcException: RPC response exceeds maximum data length"