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 CompletableFuturegetNextBatch(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); .... }



