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