通过 Vertica 查询 Parquet 数据(Vertica Hadoop Integration)

Query Parquet data through Vertica (Vertica Hadoop Integration)

所以我有一个包含三个节点的 Hadoop 集群。 Vertica 位于集群上。 HDFS 上有 Parquet 文件(由 Hive 分区)。我的目标是使用 Vertica 查询这些文件。

现在我所做的是使用 HDFS 连接器,基本上是在 Vertica 中创建一个外部 table,然后 link 它到 HDFS:

CREATE EXTERNAL TABLE tableName (columns)
AS COPY FROM "hdfs://hostname/...../data" PARQUET;

因为数据量很大。这种方法不会达到很好的性能。

我做了一些研究,Vertica Hadoop Integration

我已经尝试过 HCatalog,但我的 Hadoop 上存在一些配置错误,因此无法正常工作。

我的用例是不更改 HDFS(Parquet) 上的数据格式,同时使用 Vertica 查询它。关于如何做到这一点有什么想法吗?

编辑:Vertica 性能低下的唯一原因是它无法使用 Parquet 的分区。使用更高版本的 Vertica(8+),它现在可以使用 hive 的元数据。所以不需要 HCatalog。

术语说明:您没有使用 HDFS 连接器。这很好,因为它已从 8.0.1 开始弃用。您正在使用 Reading Hadoop Native File Formats 中描述的直接接口,使用 libhdfs++(hdfs 方案)而不是 WebHDFS(webhdfs 方案)。到目前为止一切都很好。 (您也可以使用 HCatalog 连接器,但是您需要做一些额外的配置,并且它不会比外部更快 table。)

您的 Hadoop 集群只有 3 个节点,而 Vertica 位于它们的同一位置,因此您应该自动获得节点局部性的好处——Vertica 将在计划查询时使用在本地具有数据的节点。

您可以通过对数据进行分区和排序来提高查询性能,以便 Vertica 可以使用谓词下推,也可以通过压缩 Parquet 文件来提高查询性能。您说您不想更改数据,所以这些建议可能对您不起作用;它们并不特定于 Vertica,因此无论如何它们都值得考虑。 (如果您正在使用其他工具与您的 Parquet 数据交互,它们也会从这些更改中受益。)这些技术的文档是 improved in 8.0.x(link 是 8.1,但这是在 8 .0.x 也是)。

Additional partitioning support 是在 8.0.1 中添加的。看起来你至少使用 8.0;我不知道你是否使用 8.0.1。如果是,您可以创建外部 table 以仅关注您关心的分区,例如:

CREATE EXTERNAL TABLE t (id int, name varchar(50), 
                        created date, region varchar(50))
AS COPY FROM 'hdfs:///path/*/*/*' 
PARQUET(hive_partition_cols='created,region');