Sử dụng MultipleScanTableInputFormat này, bạn có thể sử dụng Cấu hình MultipleScanTableInputFormat.PARTITIONS_PER_REGION_SERVER để kiểm soát số lượng người lập bản đồ nên thực thi đối với một máy chủ vùng. Lớp này sẽ nhóm tất cả các phân đoạn đầu vào chia theo vị trí của chúng (máy chủ vùng), và RecordReader sẽ lặp lại đúng cách thông qua tất cả các phân chia tổng hợp cho trình ánh xạ.
Dưới đây là ví dụ
https://gist.github.com/bbeaudreault/9788499#file-multiplescantableinputformat-java-L90
Đó làm việc bạn đã tạo ra nhiều chia rẽ tổng hợp cho một mapper đơn
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;
}
Tạo phân vùng của máy chủ Region
@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);
}