所以我有一个包含三个节点的Hadoop集群。 Vertica位于群集上。 HDFS上有Parquet文件(由Hive分区)。我的目标是使用Vertica查询这些文件。
现在我所做的是使用HDFS Connector,基本上在Vertica中创建一个外部表,然后将其链接到HDFS:
CREATE EXTERNAL TABLE tableName (columns)
AS COPY FROM "hdfs://hostname/...../data" PARQUET;
由于数据量很大。这种方法不会取得良好的效果。
我做了一些研究,Vertica Hadoop Integration
我已经尝试过HCatalog,但我的Hadoop上有一些配置错误,因此无效。
我的用例是不使用Vertica查询HDFS(Parquet)上的数据格式。关于如何做到的任何想法?
编辑:Vertica性能低下的唯一原因是因为它无法使用Parquet的分区。使用更高版本的Vertica(8+),它现在可以使用配置单元的元数据。所以不需要HCatalog。答案 0 :(得分:5)
术语说明:您没有使用HDFS连接器。哪个好,因为它从8.0.1开始被弃用。您正在使用Reading Hadoop Native File Formats中描述的直接接口,使用libhdfs ++(hdfs方案)而不是WebHDFS(webhdfs方案)。到目前为止,这一切都很好。 (您也可以使用HCatalog连接器,但是您需要进行一些额外的配置,它不会比外部表更快。)
您的Hadoop集群只有3个节点,Vertica位于它们的同一位置,因此您应该自动获得节点局部性的好处 - 在规划查询时,Vertica将使用本地拥有数据的节点。
您可以通过对数据进行分区和排序来提高查询性能,以便Vertica可以使用谓词下推,还可以压缩Parquet文件。你说你不想改变数据,所以这些建议可能不适合你;它们并不是Vertica特有的,所以无论如何它们都值得考虑。 (如果您使用其他工具与您的Parquet数据进行交互,他们也将从这些更改中受益。)这些技术的文档是improved in 8.0.x(链接到8.1,但这也是在8.0.x中)
在8.0.1中添加了Additional partitioning support。看起来你至少使用8.0;我不知道你是否使用8.0.1。如果是,您可以创建外部表,只关注您关心的分区:
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');