Hadoop 截断/不一致的计数器名称

2022-08-31 12:47:52

现在,我有一个Hadoop工作,它创建了一个非常有名的计数器。

例如,下面的一个:.此计数器在 Web 界面和方法调用时被截断。我发现Hadoop对计数器max名称有限制,此设置ID用于配置此限制。因此,我将其递增到,Web界面现在显示完整的计数器名称。但计数器仍然返回截断的名称。stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limitsgetName()mapreduce.job.counters.counter.name.max500getName()

有人可以解释一下这一点或指出我的错误吗?谢谢。

编辑 1

我的Hadoop服务器配置由单个服务器组成,上面有HDFS,YARN和map-reduce本身。在 map-reduce 期间,有一些计数器增量,作业完成后,在 I 获取使用 .ToolRunnerorg.apache.hadoop.mapreduce.Job#getCounters

编辑 2

Hadoop版本如下:

Hadoop 2.6.0-cdh5.8.0
Subversion http://github.com/cloudera/hadoop -r 042da8b868a212c843bcbf3594519dd26e816e79 
Compiled by jenkins on 2016-07-12T22:55Z
Compiled with protoc 2.5.0
From source with checksum 2b6c319ecc19f118d6e1c823175717b5
This command was run using /usr/lib/hadoop/hadoop-common-2.6.0-cdh5.8.0.jar

我做了一些额外的调查,似乎这个问题描述了与我类似的情况。但这非常令人困惑,因为我能够增加计数器的数量,但不能增加计数器名称的长度......

编辑 3

今天,我花了很多时间调试Hadoop的内部。一些有趣的东西:

  1. org.apache.hadoop.mapred.ClientServiceDelegate#getJobCounters方法从 yarn 返回一堆计数器,这些计数器具有截断的名称和完整的显示名称。
  2. 无法调试映射和化简器本身,但在日志记录的帮助下,该方法似乎在化简器执行期间工作正常。org.apache.hadoop.mapreduce.Counter#getName

答案 1

Hadoop代码中没有任何内容在初始化后截断计数器名称。因此,正如您已经指出的那样,控制计数器的名称最大长度(默认值为 64 个符号)。mapreduce.job.counters.counter.name.max

此限制在调用 期间应用。相应的源代码如下AbstractCounterGroup.addCounter/findCounter

@Override
public synchronized T addCounter(String counterName, String displayName,
                                 long value) {
  String saveName = Limits.filterCounterName(counterName);
  ...

实际上

public static String filterName(String name, int maxLen) {
  return name.length() > maxLen ? name.substring(0, maxLen - 1) : name;
}

public static String filterCounterName(String name) {
  return filterName(name, getCounterNameMax());
}

如您所见,计数器的名称正在被截断,相对于 。在它的时候,Hadoop代码中只有一个地方执行调用(从类调用):mapreduce.job.counters.maxLimits.init(Configuration conf)LocalContainerLauncher

class YarnChild {

  private static final Logger LOG = LoggerFactory.getLogger(YarnChild.class);

  static volatile TaskAttemptID taskid = null;

  public static void main(String[] args) throws Throwable {
    Thread.setDefaultUncaughtExceptionHandler(new YarnUncaughtExceptionHandler());
    LOG.debug("Child starting");

    final JobConf job = new JobConf(MRJobConfig.JOB_CONF_FILE);
    // Initing with our JobConf allows us to avoid loading confs twice
    Limits.init(job);

我相信您需要执行以下步骤才能修复您观察到的计数器名称问题:

  1. 调整配置值mapreduce.job.counters.counter.name.max
  2. 重新启动 YARN/MapReduce 服务
  3. 重新运行作业

我认为您仍然会看到旧作业的截断计数器名称。


答案 2

getName()似乎已弃用

或者,可以使用默认的最大长度为 255。getUri()

文档链接: getUri()

没有亲自尝试过,但它似乎是解决此问题的可能方法。


推荐