当前位置: 首页 > 知识库问答 >
问题:

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

盖泽宇
2023-03-14

现在,我有一个Hadoop作业,它创建了一个很大名称的计数器。

例如,下面的一个:stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-innon-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方法返回一组来自yarn的计数器,这些计数器具有截断的名称和完整的显示名称。
  2. 无法调试映射和还原程序本身,但在日志记录的帮助下,org.apache.hadoop.mapreduce.counter#getName方法似乎在还原程序执行期间可以正常工作。

共有2个答案

巫马望
2023-03-14

getName()似乎不推荐使用

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

文档链接:getURI()

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

郝池暝
2023-03-14

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);

我认为您需要执行以下步骤来解决您观察到的计数器名称问题:

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

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

 类似资料:
  • 问题内容: 我正在使用sybase服务器提供的Rapid SQL或isql连接到sql数据库。当我发出 命令,我应该获取已连接用户的列表。我可以,但是主机名列被截断,因此例如当主机地址为host0001时,它会被截断为host0,这是一个问题,因为有许多主机名以相同的前缀开头,例如host001,host002…。因此,我不知道哪些进程阻塞了我的数据库,我无法登录到计算机并杀死这些进程。我没有特权

  • 问题内容: 我需要清除所有库存表。 我已经试过了: 但是我得到这个错误: 如果这是正确的方法,那我做错了什么? 问题答案: 使用concat: 当然,这只会生成您需要复制和运行自己的SQL。

  • 问题内容: 在MSSQL中执行TRUNCATE(而不是删除)时,如何触发触发器 问题答案: 来自msdn: TRUNCATE TABLE无法激活触发器,因为该操作不会记录单个行的删除。

  • 问题内容: 这是一个两部分的问题: 1)是否可以使用select语句基于其或其他标识符来检索数据所在的分区的名称? 例如。 2)是否可以在不删除其他分区中存储的数据的情况下截断表的单个分区? 我有一个超过十亿行的表,哈希按类别划分。只有少数类别的数据有问题,因此重新创建整个表没有意义,但是即使所有约束都处于非活动状态,从表中删除数据也花费了太长时间。 问题答案: 多亏您对 rowid 的提示,我找

  • 本文向大家介绍 请列出hadoop的进程名称相关面试题,主要包含被问及 请列出hadoop的进程名称时的应答技巧和注意事项,需要的朋友参考一下 解答: 1.namenode:管理集群,并记录datanode文件信息。 2.Secondname:可以做冷备,对一定范围内的数据做快照性备份。 3.Datanode:存储数据。 4.Jobtracker:管理任务,并将任务分配给tasktracker。

  • 问题内容: 以下数据库视图将日期截断为会计年度(4月1日): 这使我们能够根据今天的日期计算当前会计年度。 如何简化或优化此计算? 问题答案: