2017-05-05 149 views
1

因此,我有一个包含三个节点的Hadoop集群。 Vertica位于群集中。在HDFS上有Parquet文件(由Hive分区)。我的目标是使用Vertica查询这些文件。通过Vertica查询Parquet数据(Vertica Hadoop集成)

现在我所做的是使用HDFS连接器,基本都在Vertica的创建外部表,然后将其链接到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+),它现在可以使用配置单元的元数据。所以没有HCatalog需要。

回答

2

术语说明:您未使用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)。

Additional partitioning support被添加到8.0.1中。看起来你至少使用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'); 
+0

你好莫妮卡!你救了我的命!是的,我的Parquet数据由Impala分区(月,日)。但我的Vertica版本是7.2.3。我必须升级Vertica,以便它可以使用您所写的查询吗? – Jesse

+0

@Jesse在8.0.1中添加了PARQUET(和ORC)的hive_partition_cols参数。 (对不起,我以为你可能已经在使用8.0了,因为我不记得之前支持的hdfs URI方案,但我想我错了。) –

+1

是hdfs URI被支持,但hive_partition_cols不支持。我正在升级我的Vertica。非常感谢! – Jesse