使用 HCatalog 连接器定义架构

设置 HCatalog 连接器后,您可以用它来定义 Vertica 数据库中的架构,以访问 Hive 数据库中的表。您可以使用 CREATE HCATALOG SCHEMA 语句定义架构。

创建架构时,您必须提供要在 Vertica 中定义的架构名称。其它参数为可选参数。如果您不提供值,Vertica 将使用默认值。Vertica 从 HDFS 配置文件中读取一些默认值;请参阅配置参数

要创建架构,您必须具有对所有 Hive 数据的读取访问权限。验证创建架构的用户是否已直接或通过授权服务(如 Sentry 或 Ranger)被授予访问权限。dbadmin 用户没有自动的特殊权限。

创建架构后,您可以使用 ALTER HCATALOG SCHEMA 语句更改多个参数。

定义架构后,您可以按照与查询原生 Vertica 表相同的方式,查询 Hive 数据仓库中的数据。下面的示例演示了,如何创建 HCatalog 架构并随后查询几个系统表以检查新架构的内容。有关这些表的详细信息,请参阅查看 Hive 架构和表元数据

=> CREATE HCATALOG SCHEMA hcat WITH HOSTNAME='hcathost' PORT=9083
   HCATALOG_SCHEMA='default' HIVESERVER2_HOSTNAME='hs.example.com'
   SSL_CONFIG='/etc/hadoop/conf/ssl-client.xml' HCATALOG_USER='admin';
CREATE SCHEMA
=> \x
Expanded display is on.

=> SELECT * FROM v_catalog.hcatalog_schemata;
-[ RECORD 1 ]----------------+-------------------------------------------
schema_id                    | 45035996273748224
schema_name                  | hcat
schema_owner_id              | 45035996273704962
schema_owner                 | admin
create_time                  | 2017-12-05 14:43:03.353404-05
hostname                     | hcathost
port                         | -1
hiveserver2_hostname         | hs.example.com
webservice_hostname          |
webservice_port              | 50111
webhdfs_address              | hs.example.com:50070
hcatalog_schema_name         | default
ssl_config                   | /etc/hadoop/conf/ssl-client.xml
hcatalog_user_name           | admin
hcatalog_connection_timeout  | -1
hcatalog_slow_transfer_limit | -1
hcatalog_slow_transfer_time  | -1
custom_partitions            | f

=> SELECT * FROM v_catalog.hcatalog_table_list;
-[ RECORD 1 ]------+------------------
table_schema_id    | 45035996273748224
table_schema       | hcat
hcatalog_schema    | default
table_name         | nation
hcatalog_user_name | admin
-[ RECORD 2 ]------+------------------
table_schema_id    | 45035996273748224
table_schema       | hcat
hcatalog_schema    | default
table_name         | raw
hcatalog_user_name | admin
-[ RECORD 3 ]------+------------------
table_schema_id    | 45035996273748224
table_schema       | hcat
hcatalog_schema    | default
table_name         | raw_rcfile
hcatalog_user_name | admin
-[ RECORD 4 ]------+------------------
table_schema_id    | 45035996273748224
table_schema       | hcat
hcatalog_schema    | default
table_name         | raw_sequence
hcatalog_user_name | admin

配置参数

如果您在创建架构时未覆盖这些值,HCatalog 连接器将使用 Hadoop 配置文件中的以下值。

使用分区数据

Hive 支持对数据进行分区,如下例所示:

hive> create table users (name varchar(64), address string, city varchar(64))
    partitioned by (state varchar(64)) stored as orc;

Vertica 利用元数据(ORC 和 Parquet)中提供的格式的分区信息。查询可以完全跳过不相关的分区(分区修剪),Vertica 不需要实体化分区列。有关如何在 Vertica 中使用分区的详细信息,请参阅分区文件路径。有关如何在 Hive 中创建兼容分区的详细信息,请参阅适用于 Vertica 集成的 Hive 入门知识

默认情况下,Hive 将分区信息存储在表定义的路径下,可能成为 Hive 本地的信息。但是,Hive 用户也可以选择将分区信息存储在其他位置,例如 S3 等共享位置,如下例所示:

hive> alter table users add partition (state='MA')
    location 's3a://DataLake/partitions/users/state=MA';

因此,在查询执行期间,Vertica 必须查询 Hive 以获取表分区信息的位置。

由于额外的 Hive 查询可能很昂贵,因此 Vertica 默认仅在 Hive 的默认位置查找分区信息。如果您的 Hive 表指定了自定义位置,请使用 CUSTOM_PARTITIONS 参数:

=> CREATE HCATALOG SCHEMA hcat WITH HOSTNAME='hcathost' PORT=9083
    HCATALOG_SCHEMA='default' HIVESERVER2_HOSTNAME='hs.example.com'
    SSL_CONFIG='/etc/hadoop/conf/ssl-client.xml' HCATALOG_USER='admin'
    CUSTOM_PARTITIONS='yes';

Vertica 可以访问 S3 和 S3a 方案中的分区位置,不支持 S3n 方案。

HIVE_CUSTOM_PARTITIONS_ACCESSED 系统表记录了查询中使用的所有自定义分区位置。

将 HCatalog 连接器与 WebHCat 一起使用

默认情况下,HCatalog 连接器使用 HiveServer2 访问 Hive 数据。如果您改用 WebHCat,请在创建架构之前将 HCatalogConnectorUseHiveServer2 配置参数设置为 0,如下例所示。

=> ALTER DATABASE DEFAULT SET PARAMETER HCatalogConnectorUseHiveServer2 = 0;
=> CREATE HCATALOG SCHEMA hcat WITH WEBSERVICE_HOSTNAME='webhcat.example.com';

如果您之前使用过 WebHCat,则可以通过将配置参数设置为 1 并使用 ALTER HCATALOG SCHEMA 设置 HIVESERVER2_HOSTNAME 来切换到使用 HiveServer2。您不需要移除 WebHCat 值;HCatalog 连接器使用 HCatalogConnectorUseHiveServer2 的值来确定要使用的参数。