public class FileSplit extends InputSplit implements Writable {
private Path file;
private long start;
private long length;
private String[] hosts;
public FileSplit() {
}
public FileSplit(Path file, long start, long length, String[] hosts) {
this.file = file;
this.start = start;
this.length = length;
this.hosts = hosts;
}
public Path getPath() {
return this.file;
}
public long getStart() {
return this.start;
}
public long getLength() {
return this.length;
}
public String toString() {
return this.file + ":" + this.start + "+" + this.length;
}
public void write(DataOutput out) throws IOException {
Text.writeString(out, this.file.toString());
out.writeLong(this.start);
out.writeLong(this.length);
}
public void readFields(DataInput in) throws IOException {
this.file = new Path(Text.readString(in));
this.start = in.readLong();
this.length = in.readLong();
this.hosts = null;
}
public String[] getLocations() throws IOException {
if (this.hosts == null) {
return new String[0];
}
return this.hosts;
}
}
代码比较简单, 四部分组成 文件路径 ,启始位置,长度,Host列表
Host为什么是个列表
看分片的时候创建函数
splits.add(makeSplit(path, length - bytesRemaining,
splitSize, blkLocations[blkIndex].getHosts()));
再来看块的源代码
public
class
BlockLocation {
private
String[] hosts;
private
String[] names;
private
String[] topologyPaths;
private
long
offset;
private
long
length;
private
boolean
corrupt;
public
BlockLocation() {
this
(
new
String[0],
new
String[0], 0L, 0L
);
}
public
BlockLocation(String[] names, String[] hosts,
long
offset,
long
length) {
this
(names, hosts, offset, length,
false
);
}
public
BlockLocation(String[] names, String[] hosts,
long
offset,
long
length,
boolean
corrupt) {
if
(names ==
null
)
this
.names =
new
String[0
];
else
{
this
.names =
names;
}
if
(hosts ==
null
)
this
.hosts =
new
String[0
];
else
{
this
.hosts =
hosts;
}
this
.offset =
offset;
this
.length =
length;
this
.topologyPaths =
new
String[0
];
this
.corrupt =
corrupt;
}
public
BlockLocation(String[] names, String[] hosts,
String[] topologyPaths,
long
offset,
long
length) {
this
(names, hosts, topologyPaths, offset, length,
false
);
}
public
BlockLocation(String[] names, String[] hosts,
String[] topologyPaths,
long
offset,
long
length,
boolean
corrupt) {
this
(names, hosts, offset, length, corrupt);
if
(topologyPaths ==
null
)
this
.topologyPaths =
new
String[0
];
else
this
.topologyPaths =
topologyPaths;
}
public
String[] getHosts()
throws
IOException {
if
((
this
.hosts ==
null
) || (
this
.hosts.length == 0
)) {
return
new
String[0
];
}
return
this
.hosts;
}
public
String[] getNames()
throws
IOException {
if
((
this
.names ==
null
) || (
this
.names.length == 0
)) {
return
new
String[0
];
}
return
this
.names;
}
public
String[] getTopologyPaths()
throws
IOException {
if
((
this
.topologyPaths ==
null
) || (
this
.topologyPaths.length == 0
)) {
return
new
String[0
];
}
return
this
.topologyPaths;
}
public
long
getOffset() {
return
this
.offset;
}
public
long
getLength() {
return
this
.length;
}
public
boolean
isCorrupt() {
return
this
.corrupt;
}
public
void
setOffset(
long
offset) {
this
.offset =
offset;
}
public
void
setLength(
long
length) {
this
.length =
length;
}
public
void
setCorrupt(
boolean
corrupt) {
this
.corrupt =
corrupt;
}
public
void
setHosts(String[] hosts)
throws
IOException {
if
(hosts ==
null
)
this
.hosts =
new
String[0
];
else
this
.hosts =
hosts;
}
public
void
setNames(String[] names)
throws
IOException {
if
(names ==
null
)
this
.names =
new
String[0
];
else
this
.names =
names;
}
public
void
setTopologyPaths(String[] topologyPaths)
throws
IOException {
if
(topologyPaths ==
null
)
this
.topologyPaths =
new
String[0
];
else
this
.topologyPaths =
topologyPaths;
}
public
String toString() {
StringBuilder result
=
new
StringBuilder();
result.append(
this
.offset);
result.append(
','
);
result.append(
this
.length);
if
(
this
.corrupt) {
result.append(
"(corrupt)"
);
}
for
(String h :
this
.hosts) {
result.append(
','
);
result.append(h);
}
return
result.toString();
}
}

