分配加载
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 node 和 ON 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();
加载流数
虽然您可以加载的文件数量不受限制,但加载流的最佳数量取决于多个因素,包括:
-
节点数
-
物理和逻辑架构
-
主机处理器
-
内存
-
磁盘空间
使用过多的加载流可能会耗尽或减少最佳查询处理所需的系统内存。有关配置加载流的建议,请参阅工作负载资源管理最佳实践。