presto中生成split的基本原理是:
1. presto先扫描所有所有需要访问的hdfs的数据文件,如果hdfs文件比hive.max-split-size(默认64M) 大,则一个文件生成一个split.
其代码实现在于BackgroundHiveSplitLoader::loadSplits中,loadSplits会扫描分区的所有文件,每个文件创建一个InternalHiveSplit,提交到HiveSplitSource中异步生成真正的HiveSplit。
2. 在HiveSplitSource中,如果文件不可切割的话,则无论文件大大小多大都只生成一个split,如果可以切割而且文件大于hive.max-split-size,则对文件进行切割成多个split,每个split最大处理hive.max-split-size大小的数据,其实现代码在于:
public CompletableFuture<ConnectorSplitBatch> getNextBatch(ConnectorPartitionHandle partitionHandle, int maxSize)
{
....
if (internalSplit.isSplittable()) {
splitBytes = min(maxSplitBytes, block.getEnd() - internalSplit.getStart());
}
else {
splitBytes = internalSplit.getEnd() - internalSplit.getStart();
}
resultBuilder.add(new HiveSplit())
internalSplit.increaseStart(splitBytes);
....
}