Hadoop tên bộ đếm bị cắt ngắn / không nhất quán


79

Hiện tại, tôi có một công việc Hadoop tạo ra các quầy với một cái tên khá lớn.

Ví dụ, sau một: stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits. Bộ đếm này được cắt ngắn trên giao diện web và khi getName()gọi phương thức. Tôi đã phát hiện ra rằng Hadoop có giới hạn về tên tối đa của bộ đếm và id cài đặt mapreduce.job.counters.counter.name.maxnày là để định cấu hình giới hạn này. Vì vậy, tôi đã tăng điều này lên 500và giao diện web hiện hiển thị tên bộ đếm đầy đủ. Nhưng getName()của bộ đếm vẫn trả về tên bị cắt ngắn.

Ai đó, làm ơn, giải thích điều này hoặc chỉ cho tôi những sai lầm của tôi? Cảm ơn bạn.

CHỈNH SỬA 1

Cấu hình máy chủ Hadoop của tôi bao gồm một máy chủ duy nhất có HDFS, YARN và bản đồ tự giảm trên đó. Trong quá trình thu nhỏ bản đồ, có một số bước tăng bộ đếm và sau khi hoàn thành công việc, trong ToolRunnertôi tìm nạp bộ đếm bằng cách sử dụng org.apache.hadoop.mapreduce.Job#getCounters.

CHỈNH SỬA 2

Phiên bản Hadoop như sau:

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

Tôi đã thực hiện một số điều tra bổ sung và có vẻ như vấn đề này mô tả một tình huống tương tự như của tôi. Nhưng nó khá khó hiểu vì tôi có thể tăng số lượng bộ đếm nhưng không thể tăng độ dài của tên bộ đếm ...

CHỈNH SỬA 3

Hôm nay, tôi đã dành khá nhiều thời gian để gỡ lỗi nội bộ của Hadoop. Một số công cụ thú vị:

  1. org.apache.hadoop.mapred.ClientServiceDelegate#getJobCountersphương thức trả về một loạt các bộ đếm từ sợi có tên TRUNCATED và tên hiển thị ĐẦY ĐỦ .
  2. Không thể tự gỡ lỗi bản đồ và bộ giảm nhưng với sự trợ giúp của việc ghi nhật ký, có vẻ như org.apache.hadoop.mapreduce.Counter#getNamephương pháp đó hoạt động chính xác trong quá trình thực thi bộ giảm.

2
Bạn có thể vui lòng cung cấp thêm chi tiết về getName()cuộc gọi vẫn trả về tên bị cắt ngắn không? Điều này có lặp lại qua các bộ đếm được trả về từ Job#getCounters()máy khách gửi sau khi chờ hoàn thành công việc hay là một bộ đếm truy vấn ứng dụng riêng biệt từ máy chủ lịch sử công việc hay là một cái gì đó hoàn toàn khác? Tôi mong đợi cấu hình của bạn là đủ. Giao diện người dùng web sử dụng cùng một getName()cuộc gọi. (Nó sẽ không hồi tố lần chỉnh sửa cắt ngắn tên truy cập từ công việc đệ trình trước khi thay đổi cấu hình mặc dù.)
Chris Nauroth

@ChrisNauroth, cấu hình khá đơn giản, tôi có một máy chủ với hadoop và tất cả đều là phần mềm bổ sung được cài đặt trên đó. Luồng của các bộ đếm trong bản đồ giảm của tôi: 1. Bộ đếm tăng lên trong bộ giảm (được tìm nạp từ ngữ cảnh) 2. Tìm nạp từ Công việc # getCounters (). Cảm ơn sự quan tâm của bạn và xin lỗi vì câu trả lời chậm trễ.
mr.nothing

1
@ChrisNauroth, tôi đã thực hiện một số cuộc điều tra bổ sung và có vẻ như tôi đã tìm thấy điều gì đó ... uh, thú vị. Chúng tôi đã cài đặt hadoop 2.6.0 và có vẻ như sự cố này gây ra vấn đề.apache.org/jira/browse/MAPREDUCE-5875 mô tả tình huống tương tự như của tôi. Nhưng nó khá khó hiểu vì tôi có thể tăng số lượng bộ đếm nhưng không thể tăng độ dài của tên bộ đếm ... Bạn có nghĩ đây có thể là một vấn đề?
mr.nothing

Bạn có thể vui lòng cho tôi biết tên chính xác (cắt ngắn một) đó là bạn nhận được khi bạn gọi getName () cho bộ đếmstats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits
maxmithun

@DennisJaheruddin rất tiếc, tôi đã rời bỏ công việc đó và tôi không còn lựa chọn nào khác ngoài áp dụng một số giải pháp tạm thời để giải quyết vấn đề này vì không có phản hồi nào được cung cấp trong hadoop jira. Vấn đề đó vẫn không được giải quyết vào ngày tôi rời công việc đó.
mr.nothing

Câu trả lời:


2

Không có gì trong mã Hadoop cắt bớt tên bộ đếm sau khi khởi tạo. Vì vậy, như bạn đã chỉ ra, mapreduce.job.counters.counter.name.maxkiểm soát độ dài tối đa của tên bộ đếm (với 64 ký hiệu làm giá trị mặc định ).

Giới hạn này được áp dụng trong các cuộc gọi đến AbstractCounterGroup.addCounter/findCounter. Mã nguồn tương ứng như sau :

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

thực sự :

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

Như bạn có thể thấy, tên của bộ đếm đang được cắt bớt đối với mapreduce.job.counters.max. Ngược lại, chỉ có một nơi duy nhất trong mã Hadoop nơi Limits.init(Configuration conf)thực hiện lệnh gọi đến (được gọi từ LocalContainerLauncherlớp):

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

Tôi tin rằng bạn cần thực hiện các bước sau để khắc phục sự cố tên bộ đếm mà bạn quan sát thấy:

  1. Điều chỉnh mapreduce.job.counters.counter.name.maxgiá trị cấu hình
  2. Khởi động lại dịch vụ YARN / MapReduce
  3. Điều hành lại công việc của bạn

Bạn vẫn sẽ thấy các tên bộ đếm bị cắt ngắn cho các công việc cũ mà tôi nghĩ.


Mặc dù tôi không thể kiểm tra điều này nó sẽ rất hữu ích và giải thích cho những người phải đối mặt với vấn đề này (theo upvotes có rất nhiều người như vậy)
mr.nothing

1

getName() dường như không được dùng nữa

Ngoài ra, getUri()có thể sử dụng chiều dài tối đa mặc định là 255.

Liên kết tài liệu: getUri()

Chưa thử nó một cách cá nhân, nhưng nó có vẻ là một sửa chữa có thể cho vấn đề này.


Không chắc bạn nhận được vấn đề một cách chính xác. Bạn đang nói về org.apache.hadoop.fs.FileSystem#getNamenhưng chủ đề này là về org.apache.hadoop.mapreduce.Counter#getNamevà đó là hành vi.
mr.nothing
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.