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.. 이 카운터는 웹 인터페이스 및 getName()메서드 호출 에서 잘립니다 . Hadoop에는 카운터 최대 이름에 제한이 있으며이 설정 ID mapreduce.job.counters.counter.name.max는이 제한을 구성하기위한 것임을 알았습니다 . 그래서 나는 이것을 증가 시켰고 500웹 인터페이스는 이제 전체 카운터 이름을 보여줍니다. 그러나 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 표시 이름을 가진 실에서 카운터를 반환 합니다.
  2. 지도와 감속기 자체를 디버그 할 수 없었지만 로깅의 도움으로 org.apache.hadoop.mapreduce.Counter#getName감속기 실행 중에 메서드가 올바르게 작동 하는 것 같습니다 .

2
getName()잘린 이름을 반환하는 호출 에 대해 더 자세한 정보를 제공해 주 시겠습니까? Job#getCounters()작업 완료를 기다린 후 제출하는 클라이언트에서 반환 된 카운터를 반복합니까 , 아니면 작업 기록 서버에서 카운터를 쿼리하는 별도의 응용 프로그램입니까, 아니면 완전히 다른 것입니까? 귀하의 구성이 충분할 것으로 기대합니다. 웹 UI는 동일한 getName()호출을 사용합니다 . (그것은 소급하지만 구성이 변경되기 전에 제출 된 작업에서 카운터 이름을 잘립니다 해결되지 것입니다.)
크리스 Nauroth

@ChrisNauroth, 구성은 매우 간단합니다. 나는 hadoop이있는 하나의 서버를 가지고 있으며 모든 추가 소프트웨어가 설치되어 있습니다. 내 맵-리 듀스에서 카운터의 흐름 : 1. 리듀서의 카운터 증가 (컨텍스트에서 가져옴) 2. Job # getCounters ()에서 가져옵니다. 관심을 가져 주셔서 감사 드리며 답변이 지연되어 죄송합니다.
mr.nothing

1
@ChrisNauroth, 추가 조사를했는데 뭔가 발견 한 것 같네요 ... 어, 흥미 롭군요. 우리는 hadoop 2.6.0을 설치 했으며이 문제는 issues.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에 피드백이 제공되지 않았기 때문에이 문제를 해결하기 위해 임시 솔루션을 적용 할 수밖에 없었습니다. 그 문제는 내가 그 일을 그만두는 날까지 해결되지 않았습니다.
mr.nothing

답변:


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)( 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. 작업 재실행

내가 생각하는 오래된 작업에 대해 잘린 카운터 이름이 여전히 표시됩니다.


나는이를 확인 드릴 수 없습니다하지만 그것은이 문제 (upvotes에 따라 같은 많은 사람들이있다)에 직면 사람들을위한 매우 유용하고 설명해야한다
mr.nothing

1

getName() 더 이상 사용되지 않는 것 같습니다.

또는 getUri()기본 최대 길이 인 255를 사용할 수 있습니다.

문서 링크 : getUri()

개인적으로 시도하지는 않았지만이 문제에 대한 가능한 해결책 인 것 같습니다.


문제가 올바르게 발생하는지 확실하지 않습니다. 당신은 이야기하고 org.apache.hadoop.fs.FileSystem#getName있지만이 주제는 org.apache.hadoop.mapreduce.Counter#getName행동 에 관한 것입니다.
mr.nothing
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.