El uso de este MultipleScanTableInputFormat, puede utilizar Configuración MultipleScanTableInputFormat.PARTITIONS_PER_REGION_SERVER para controlar cuántos mapeadores se deberían ejecutar contra un solo servidor de regiones. La clase agrupará todas las divisiones de entrada por su ubicación (servidor de regiones), y el lector de registros repetirá adecuadamente todas las divisiones agregadas para el asignador.
Aquí está el ejemplo
https://gist.github.com/bbeaudreault/9788499#file-multiplescantableinputformat-java-L90
que el trabajo que ha creado las múltiples escisiones agregados para un único asignador
private List<InputSplit> getAggregatedSplits(JobContext context) throws IOException {
final List<InputSplit> aggregatedSplits = new ArrayList<InputSplit>();
final Scan scan = getScan();
for (int i = 0; i < startRows.size(); i++) {
scan.setStartRow(startRows.get(i));
scan.setStopRow(stopRows.get(i));
setScan(scan);
aggregatedSplits.addAll(super.getSplits(context));
}
// set the state back to where it was..
scan.setStopRow(null);
scan.setStartRow(null);
setScan(scan);
return aggregatedSplits;
}
Crear partición servidor Región
@Override
public List<InputSplit> getSplits(JobContext context) throws IOException {
List<InputSplit> source = getAggregatedSplits(context);
if (!partitionByRegionServer) {
return source;
}
// Partition by regionserver
Multimap<String, TableSplit> partitioned = ArrayListMultimap.<String, TableSplit>create();
for (InputSplit split : source) {
TableSplit cast = (TableSplit) split;
String rs = cast.getRegionLocation();
partitioned.put(rs, cast);
}