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

bxgwgixi  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(429)

现在,我有一个hadoop工作,它创建了一个非常有名的计数器。
例如,下面的一个: stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits . 此计数器在web界面和上被截断 getName() 方法调用。我发现hadoop对计数器max name和这个设置id有限制 mapreduce.job.counters.counter.name.max 用于配置此限制。所以我把这个增加到 500 web界面现在显示完整的计数器名称。但是 getName() 计数器的名称仍然返回截断的名称。
有人能解释一下吗,或者指出我的错误?谢谢您。
编辑1
我的hadoop服务器配置由一个服务器组成,其中包含hdfs、yarn和map reduce本身。在map reduce期间,存在一些计数器增量,并且在作业完成后,在 ToolRunner 我用 org.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的内部构件。一些有趣的东西: org.apache.hadoop.mapred.ClientServiceDelegate#getJobCounters 方法从具有截断名称和完整显示名称的yarn返回一组计数器。
无法调试Map和还原程序本身,但在日志记录的帮助下,似乎 org.apache.hadoop.mapreduce.Counter#getName 方法在reducer执行期间正常工作。

jfgube3f

jfgube3f1#

hadoop代码中没有在初始化后截断计数器名称的代码。所以,正如你已经指出的, mapreduce.job.counters.counter.name.max 控制计数器的名称最大长度(默认值为64个符号)。
在调用时应用此限制 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());
}

如您所见,计数器的名称将被保存,并且相对于 mapreduce.job.counters.max . 在hadoop代码中,只有一个地方可以调用 Limits.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);

我相信您需要执行以下步骤来修复您观察到的计数器名称问题:
调整 mapreduce.job.counters.counter.name.max 配置值
重新启动yarn/mapreduce服务
重新运行您的作业
我认为,你仍然会看到旧工作的计数器名称被截断。

cxfofazt

cxfofazt2#

getName() 似乎被否决了
或者, getUri() 可以使用默认的最大长度255。
文档链接: getUri() 我没有亲自尝试过,但这似乎是一个可能的解决这个问题。

相关问题