eu.stratosphere.core.fs.FileInputSplit Maven / Gradle / Ivy
/***********************************************************************************************************************
* Copyright (C) 2010-2013 by the Stratosphere project (http://stratosphere.eu)
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
**********************************************************************************************************************/
/**
* This file is based on source code from the Hadoop Project (http://hadoop.apache.org/), licensed by the Apache
* Software Foundation (ASF) under the Apache License, Version 2.0. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership.
*/
package eu.stratosphere.core.fs;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import eu.stratosphere.core.io.InputSplit;
import eu.stratosphere.core.io.StringRecord;
/**
* A file input split provides information on a particular part of a file, possibly
* hosted on a distributed file system and replicated among several hosts.
*
*/
public class FileInputSplit implements InputSplit {
/**
* The path of the file this file split refers to.
*/
private Path file;
/**
* The position of the first byte in the file to process.
*/
private long start;
/**
* The number of bytes in the file to process.
*/
private long length;
/**
* List of hosts (hostnames) containing the block, possibly null
.
*/
private String[] hosts;
/**
* The logical number of the split.
*/
private int partitionNumber;
/**
* Constructs a split with host information.
*
* @param num
* the number of this input split
* @param file
* the file name
* @param start
* the position of the first byte in the file to process
* @param length
* the number of bytes in the file to process (-1 is flag for "read whole file")
* @param hosts
* the list of hosts containing the block, possibly null
*/
public FileInputSplit(final int num, final Path file, final long start, final long length, final String[] hosts) {
this.partitionNumber = num;
this.file = file;
this.start = start;
this.length = length;
this.hosts = hosts;
}
/**
* Constructor used to reconstruct the object at the receiver of an RPC call.
*/
public FileInputSplit() {
}
/**
* Returns the path of the file containing this split's data.
*
* @return the path of the file containing this split's data.
*/
public Path getPath() {
return file;
}
/**
* Returns the position of the first byte in the file to process.
*
* @return the position of the first byte in the file to process
*/
public long getStart() {
return start;
}
/**
* Returns the number of bytes in the file to process.
*
* @return the number of bytes in the file to process
*/
public long getLength() {
return length;
}
/**
* Gets the names of the hosts that this file split resides on.
*
* @return The names of the hosts that this file split resides on.
*/
public String[] getHostNames() {
if (this.hosts == null) {
return new String[] {};
} else {
return this.hosts;
}
}
/*
* (non-Javadoc)
* @see eu.stratosphere.nephele.template.InputSplit#getPartitionNumber()
*/
@Override
public int getSplitNumber() {
return this.partitionNumber;
}
@Override
public String toString() {
return "[" + this.partitionNumber + "] " + file + ":" + start + "+" + length;
}
@Override
public void write(final DataOutput out) throws IOException {
// write partition number
out.writeInt(this.partitionNumber);
// write file
if (this.file != null) {
out.writeBoolean(true);
this.file.write(out);
} else {
out.writeBoolean(false);
}
// write start and length
out.writeLong(this.start);
out.writeLong(this.length);
// write hosts
if (this.hosts == null) {
out.writeBoolean(false);
} else {
out.writeBoolean(true);
out.writeInt(this.hosts.length);
for (int i = 0; i < this.hosts.length; i++) {
StringRecord.writeString(out, this.hosts[i]);
}
}
}
@Override
public void read(final DataInput in) throws IOException {
// read partition number
this.partitionNumber = in.readInt();
// read file path
boolean isNotNull = in.readBoolean();
if (isNotNull) {
this.file = new Path();
this.file.read(in);
}
this.start = in.readLong();
this.length = in.readLong();
isNotNull = in.readBoolean();
if (isNotNull) {
final int numHosts = in.readInt();
this.hosts = new String[numHosts];
for (int i = 0; i < numHosts; i++) {
this.hosts[i] = StringRecord.readString(in);
}
} else {
this.hosts = null;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy