组合协作解析和分摊加载

您可以在同一解析器中同时启用协作解析分摊加载,从而允许 Vertica 决定如何加载数据。

决定如何拆分加载

Vertica 在查询规划时会尽可能使用分摊加载。它决定是否在执行时也使用协作解析。

分摊加载需要 SourceFactory 支持。如果指定合适的 UDSource,Vertica 将在规划时对 ParserFactory 调用 isParserApportionable() 方法。如果此方法返回 true,Vertica 将分摊加载。

如果 isParserApportionable() 返回 false,但 isChunkerApportionable() 返回 true,则块分割器可用于协作解析且块分割器支持分摊加载。Vertica 会分摊加载。

如果这些方法均未返回 true,则 Vertica 不会分摊加载。

在执行时,Vertica 会先检查加载是否在非隔离模式下运行,并仅在非隔离模式下运行才继续操作。在隔离模式下,不支持协作解析。

如果未分摊加载且有多个线程可用,Vertica 将使用协作解析。

如果已分摊加载且正好只有一个线程可用,则 Vertica 在当且仅当解析器不可分摊时才使用协作解析。在这种情况下,块分割器是可分摊的,但解析器是不可分摊的。

如果已分摊加载、有多个线程可用且块分割器是可分摊的,则 Vertica 会使用协作解析。

如果 Vertica 使用协作解析,但 prepareChunker() 未返回 UDChunker 实例,则 Vertica 会报告错误。

执行分摊的协作加载

如果加载同时使用分摊加载和协作解析,则 Vertica 会使用 SourceFactory 将输入分解为多个部分。然后,它将这些部分分配给执行节点。请参阅 Vertica 如何分摊加载

在执行节点上,Vertica 会调用块分割器的 alignPortion() 方法以将输入与部分边界对齐。(此步骤在第一部分已跳过,且根据定义已在开始时对齐。)必须执行此步骤,因为使用分摊加载的解析器有时必须在相应部分结尾之后继续读取,因此块分割器需要找到终点。

对齐相应部分后,Vertica 会重复调用块分割器的 process() 方法。请参阅 Vertica 如何拆分加载

然后,将块分割器找到的各个块发送给解析器的 process() 方法以按照常规方式进行处理。