分配加载

Vertica 可以在多个数据库节点之间拆分加载数据的工作,从而利用并行度来加快操作速度。如何做到这一点取决于数据的位置以及解析器支持的并行度类型。

在对所有节点可用的共享存储中找到要加载的数据时,Vertica 分配加载的效率最高。但是,有时数据仅在您必须指定的特定节点上可用。

加载并行度的类型

Vertica 支持多种类型的并行度。所有内置解析器都支持分布式加载,某些解析器支持分摊加载和协作解析。各个解析器的参考页面均包含它们支持的加载并行度类型。

加载并行度默认处于启用状态,但可以禁用。常规参数中描述了本节中指定的配置参数。

分布式加载

Vertica 会将多文件加载中的文件分配给多个节点以并行加载,而不是在单个节点上加载所有文件。如果所有节点都可以访问文件且您不限制参与节点,则 Vertica 会自动分配加载。

分摊加载和协作解析都需要可以在记录边界处拆分的输入。不同之处在于,协作解析会执行顺序扫描以查找记录边界,而分摊加载会先跳(寻找)至给定位置,然后再执行扫描。某些格式(例如通用 XML)不支持寻找。

分摊加载

在分摊加载中,Vertica 会将单个大型文件或其他单个源拆分成多个段(部分),然后分配给多个节点以进行并行加载。分摊加载会根据每个节点上的可用节点和核心在计划时拆分加载。

要使用分摊加载,您必须确保所有参与的数据库节点都可以访问源。分摊加载通常与分布式文件系统结合使用。

对于支持分摊加载的解析器,分摊加载默认处于启用状态。要将其禁用,请将 EnableApportionLoad 配置参数设置为 0。

协作解析

默认情况下,Vertica 会在一个数据库节点上的单个线程中解析数据源。如果解析器支持协作解析,则节点将改为使用多个线程来并行进行解析。协作解析会根据线程的调度方式在执行时拆分加载。

对于支持协作解析的解析器,协作解析默认处于启用状态。要将其禁用,请将 EnableCooperativeParse 配置参数设置为 0。

在特定节点上加载

您可以使用以下任一方法指示哪个或哪些节点应解析输入路径:

  • 节点名称: ON 节点

  • 一组节点: ON nodeset(请参阅指定分布式文件加载

  • ON ANY NODE (HDFS 和云路径的默认值)

  • ON EACH NODE

使用 ON ANY NODE 子句表示源路径在所有节点上都可用。如果指定此子句,则 COPY 会解析来自群集中任何节点的文件。如果路径包含 glob,则 COPY 会在启动程序节点上展开 glob。 ON ANY NODE 是除 Linux 之外的所有文件系统的默认值。

使用 ON nodeset 子句表示源文件位于所有指定的节点上。如果指定此子句,则 COPY 会打开相应文件并从集合中的任何节点对其进行解析。请确保指定的源文件可用且在每个适用的群集节点上可供访问。

ON nodeON ANY NODE 会加载每个文件一次,以选择一个节点来执行加载。相反,如果每个节点上的数据不同,而您想加载所有数据且路径相同,请使用 ON EACH NODE

=> COPY myTable FROM '/local_export/*.dat' ON EACH NODE;

如果路径在所有节点上都无效,则 COPY 会加载有效路径并生成警告。如果路径是共享位置,则就 ON ANY NODE 而言,COPY 仅加载路径一次。

当您想从每个节点上的相同路径加载且文件不同时,请使用 ON EACH NODE。例如,如果您拥有特定于计算机的数据(例如系统事件日志),或者如果操作单独在每个节点上写入数据,则可以使用此子句来加载所有数据。

如果要加载的数据位于客户端上,请使用 COPY FROM LOCAL 而不是指定节点。所有本地文件都使用每个 COPY 语句按顺序进行加载和解析,因此您不能使用 LOCAL 选项执行并行加载。

指定分布式文件加载

您可以将多文件加载中的单个文件定向到特定节点:

=> COPY t FROM '/data/file1.dat' ON v_vmart_node0001, '/data/file2.dat' ON v_vmart_node0002;

您可以使用 glob(通配符扩展)通过 ON ANY NODE 选项指定一组文件:

=> COPY t FROM '/data/*.dat' ON ANY NODE;

您可以限制参与分摊加载的节点。如果您需要平衡多个并发加载,那么这样做非常有用。Vertica 会单独分摊每个加载;它不会考虑这些节点上可能正在进行的其他加载。因此,您可以通过自己管理分摊来潜在加快加载速度:

=> COPY t FROM '/data/big1.dat' ON (v_vmart_node0001, v_vmart_node0002, v_vmart_node0003),
        '/data/big2.dat' ON (v_vmart_node0004, v_vmart_node0005);

您可以为每个路径指定压缩类型。但是,由于文件压缩是一种筛选器,因此不能对压缩文件使用分摊加载。

指定具有源的分布式加载

此外,您还可以使用 COPY WITH SOURCE 来分摊加载。您可以使用用户定义的加载 (UDL) API 来创建源和解析器。如果源和解析器都支持分摊加载,并且设置了 EnableApportionLoad,则 Vertica 会尝试在节点之间拆分加载。

以下示例显示了您可以分摊的加载:

=> COPY t WITH SOURCE MySource() PARSER MyParser();

内置的分隔解析器支持分摊,因此您可以将它与用户定义的源结合使用:

=> COPY t WITH SOURCE MySource();

加载流数

虽然您可以加载的文件数量不受限制,但加载流的最佳数量取决于多个因素,包括:

  • 节点数

  • 物理和逻辑架构

  • 主机处理器

  • 内存

  • 磁盘空间

使用过多的加载流可能会耗尽或减少最佳查询处理所需的系统内存。有关配置加载流的建议,请参阅工作负载资源管理最佳实践