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


79

现在,我有一个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在计数器最大名称上有限制,此设置IDmapreduce.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的内部组件。一些有趣的东西:

  1. org.apache.hadoop.mapred.ClientServiceDelegate#getJobCounters方法从TRUNCATED名称和FULL显示名称的yarn返回一堆计数器。
  2. 无法调试地图和化简器本身,但在记录的帮助下,该org.apache.hadoop.mapreduce.Counter#getName方法似乎在化简器执行期间正常工作。

2
您能否提供有关getName()仍返回截断名称的呼叫的更多详细信息?这是Job#getCounters()在等待作业完成之后对提交客户端中返回的计数器进行迭代,还是从作业历史服务器查询计数器的单独应用程序,还是完全其他?我希望您的配置足够。Web UI使用相同的getName()调用。(尽管它不会追溯地修改配置更改之前提交的作业的截断计数器名称。)
Chris Nauroth

@ChrisNauroth,配置非常简单,我有一台带有hadoop的服务器,上面安装了所有其他软件。我的map-reduce中的计数器流:1.在reducers中递增计数器(从上下文中获取)2.从Job#getCounters()获取。感谢您的关注,对不起您的答复。
先生

1
@ChrisNauroth,我进行了进一步的调查,看来我发现了一些东西……嗯,很有趣。我们已经安装了hadoop 2.6.0,看来这个问题issue.apache.org/jira/browse/MAPREDUCE-5875描述了与我的情况类似的情况。但这很令人困惑,因为我可以增加柜台数量,但不能增加柜台名称的长度...您认为这可能是个问题吗?
mr.nothing

您能告诉我调用计数器的getName()时得到的确切名称(截短的一个)吗?stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits
maxmithun

@DennisJaheruddin不幸的是,我离开了这份工作,我别无选择,只能应用一些临时解决方案来解决此问题,因为hadoop jira中没有提供反馈。在我离职的那一天,这个问题仍然没有解决。
18th

Answers:


2

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)可以执行to调用(从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. 重新执行工作

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


尽管我无法确认这一点,但对于面临此问题的人来说,它应该非常有帮助和解释(根据投票,有很多这样的人)
Mr.nothing

1

getName() 似乎已被弃用

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

文档链接: getUri()

尚未亲自尝试过,但似乎可以解决此问题。


不确定您是否正确获取了问题。您正在谈论,org.apache.hadoop.fs.FileSystem#getName但是这个主题org.apache.hadoop.mapreduce.Counter#getName与它有关。
mr.nothing
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.