从 S3 复制镶木地板文件时出现 Vertica 性能问题

Posted

技术标签:

【中文标题】从 S3 复制镶木地板文件时出现 Vertica 性能问题【英文标题】:Vertica performance issue while copying parquet files from S3 【发布时间】:2019-10-24 18:35:29 【问题描述】:

我在 S3 中有 66 个经过 GZIP 压缩的 parquet 文件,包含 20 亿条记录,我正在使用 Vertica 复制命令将数据从 s3 复制到 Vertica,如下所示。

COPY schema.table ( col1, col2, col3, col4, col5, col6 ) FROM 's3://test_path/*' PARQUET ABORT ON ERROR DIRECT NO COMMIT 

我们有 4 个 Vertica 节点。为了复制这 20 亿行,需要 45 分钟以上。 Vertica 文档说,默认情况下,从 S3 加载文件在多个节点上的多线程中运行。我们的 DBA 告诉我,达到最佳性能的方法是并行运行 66 个查询(每个文件 1 个查询),这样每个查询将在不同的节点上运行,并且每个查询将加载不同的文件。

Vertica Copy 命令是从 Java 以编程方式调用的,我不想为每个文件运行复制命令,这对维护事务来说变得很麻烦,而且在峰值负载期间文件可能会增加到 1000+。

我想只使用一个 COPY 命令来缩短执行时间,非常感谢任何指针和帮助。

谢谢

【问题讨论】:

【参考方案1】:

试试这个:

COPY schema.table ( col1, col2, col3, col4, col5, col6 ) 
FROM 's3://test_path/*' ON ANY NODE PARQUET
ABORT ON ERROR DIRECT;

我不知道您的 DBA 是如何想到每个文件运行一个命令的... 上面的命令将在解析阶段涉及 4 个节点中的每一个,通常甚至每个节点都有多个并行解析器。一旦解析阶段完成,数据将根据表的投影在节点之间的分段方案进行分段,每个节点将对自己的数据进行排序和编码,最后将其写入磁盘 - 并在最后提交。只要记住文件 glob 字符串后的 ON ANY NODE 指令即可。

如果只有 1000 个文件而不是 60 个文件,您最终可能会达到性能下降的程度(例如,有几 TB 的数据,具体取决于节点的 RAM 大小) - 然后您可能想要使用通常的分而治之的方法拆分成几个命令。刚开始尝试一下...

【讨论】:

感谢您的回复。我试过“在任何节点上”,它的性能和以前一样。根据 Vertica 文档,默认情况下 Copy 命令采用“在任何节点上” 为了阐明这个问题:在 COPY 运行时,重复运行查询:SELECT * FROM load_streams WHERE is_executing;。您可以监控已解析了多少百分比的行,并且一旦全部解析完毕,多少百分比的行已被排序。它让您了解您是在读取/解析输入文件时浪费时间,还是在第二阶段对行进行排序以匹配目标投影并编码以写入 ROS 容器时。 谢谢会检查这个。与***.com/questions/58630873/… 中的分隔文件和镶木地板文件相比,我还发布了另一个性能问题的帖子@ 任何指针都会非常有帮助。谢谢

以上是关于从 S3 复制镶木地板文件时出现 Vertica 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

Spark 读取镶木地板文件时出现问题

在 Spark 2.0 中从 AVRO 写入镶木地板时出现 NullPointerException

在火花提交作业中读取镶木地板文件时出现内存不足错误

将火花数据帧写入镶木地板格式时出现内存不足错误

将小 PySpark DataFrame 写入镶木地板时出现内存错误

如何将单个镶木地板文件从 s3 读入 dask 数据帧?