package skywriting.examples.skyhout.common;
import java.io.Closeable;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.mapreduce.Partitioner;
public class SortedPartitionedOutputCollector<K, V, C, R> extends
AbstractOutputCollector<K, V, C, R> implements Closeable {
private SequenceFile.Writer[] writers;
private Combiner<K, C, V, R> combiner;
public SortedPartitionedOutputCollector(SkywritingTaskFileSystem fs,
Partitioner<K, V> partitioner, Combiner<K, C, V, R> combiner, Class<K> keyClass, Class<R> valueClass) throws IOException {
this(fs, partitioner, combiner, keyClass, valueClass, fs.numOutputs());
}
public SortedPartitionedOutputCollector(SkywritingTaskFileSystem fs,
Partitioner<K, V> partitioner, Combiner<K, C, V, R> combiner, Class<K> keyClass, Class<R> valueClass, int numOutputs) throws IOException {
super(numOutputs, partitioner, combiner);
this.combiner = combiner;
this.writers = new SequenceFile.Writer[fs.numOutputs()];
for (int i = 0; i < numOutputs; ++i) {
this.maps.add(new TreeMap<K, C>());
this.writers[i] = new SequenceFile.Writer(fs, fs.getConf(), new Path("/out/" + i), keyClass, valueClass);
}
}
private void dump(int mapID) throws IOException {
Map<K, C> map = maps.get(mapID);
Iterator<Map.Entry<K, C>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<K, C> pairs = it.next();
writers[mapID].append(pairs.getKey(), this.combiner.combineFinal(pairs.getKey(), pairs.getValue()));
}
}
@Override
public void close() throws IOException {
for (int i = 0; i < this.numOutputs; i++) {
Map<K, C> map = maps.get(i);
dump(i);
map.clear();
}
for (SequenceFile.Writer writer : this.writers) {
writer.close();
}
}
}