如何在 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 以了解实际的按值传递是如何工作的。
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 以了解实际的按值传递是如何工作的。