如何在 hadoop 的默认 Linerecordreader 中设置值

How value is set in default Linerecordreader in hadoop

Jobtracker 使用 InputFormat 的 getsplits() 函数获取拆分后 class。然后jobtracker根据split的存储位置分配maptasks,maptask调用InputFormatclass中的createrecordreader()方法,进而调用linerecordreaderclass.The初始化函数获取开始、结束位置和nextkeyvalue()设置键,值。这是我的查询,Key is set with pos as per below code.But 值是如何设置的。

public boolean  nextKeyValue() throws IOException {
     if (key == null) {
       key = new LongWritable();
     }
     key.set(pos);
     if (value == null) {
       value = new Text();
     }
     int newSize = 0;
     while (pos < end) {
       newSize = in.readLine(value, maxLineLength,
                             Math.max((int)Math.min(Integer.MAX_VALUE, end-pos),maxLineLength))
      if (newSize == 0) {
        break;
      }
      pos += newSize;
      if (newSize < maxLineLength) {
        break;
      }
      // line too long. try again
      LOG.info("Skipped line of size " + newSize + " at pos " + 
               (pos - newSize));
    }
    if (newSize == 0) {
      key = null;
      value = null;
      return false;
    } else {
      return true;
    }
  }

在nextKeyValue()中,同时计算

newSize = in.readLine(value, maxLineLength,
                             Math.max((int)Math.min(Integer.MAX_VALUE, end-pos),maxLineLength))

此处 readLine 会将数据填充到值对象中。可以参考readLine实现 here

if (appendLength > 0) {
        str.append(buffer, startPosn, appendLength);
       txtLength += appendLength;
     }

您可以参考 SO 中的 this article 以了解实际的按值传递是如何工作的。