Hadoop - 有没有办法在作业之间共享自定义计数器



我正在运行一个MapReduce工作流,目前由2个链式MR任务组成。在第一个任务中,映射器写入自定义计数器。我希望在第二个任务中化简器的 setup() 方法中读取此计数器的值。当我尝试在第二个任务中读取计数器的值时,我得到的值为 0

为清楚起见,每个任务都有自己的驱动程序代码,具有自己的ConfigurationJob。计数器定义为主驱动程序类中的static enum,负责链接任务(以及启动 EMR 集群,而不是在单节点集群设置中本地运行工作流)。

我使用的是Hadoop 2.7.3和Java 8。

我看到至少 3 个选项:

  • 将计数器值写入 HDFS 文件。作业完成后将其删除。

  • 在作业之间共享配置,将计数器值放在配置中。

  • 从主驱动程序中的第一个作业计数器读取计数器值,将其放入第二个作业配置中

要在作业完成后读取计数器,请执行以下操作:

long val = job.getCounters().getGroup("g").findCounter("c").getValue();

我会把计数器写给ZooKeeper。查看Hadoop权威指南和示例。

最新更新