将 Apache Hive 元存储与 Snowflake 集成¶
本主题提供有关使用适用于 Snowflake 的 Hive 元存储连接器使用外部表将 Apache Hive (https://hive.apache.org/) 元存储与 Snowflake 集成的说明。连接器检测元存储区事件并将其传输到 Snowflake,以保持外部表与 Hive 元存储的同步。这允许用户在 Hive 中管理架构,同时通过 Snowflake 对其进行查询。
Apache Hive 元存储必须与以下云平台之一上的云存储集成:
Amazon Web Services
Google Cloud Platform
Microsoft Azure
本主题内容:
安装和配置 Hive 元存储连接器¶
本部分提供有关安装和配置适用于 Snowflake 的 Hive 元存储连接器的详细说明。
先决条件¶
Snowflake 的 Hive 连接器具有以下先决条件:
- Snowflake 数据库和架构:
将映射到 Hive 表的外部表存储在元存储中。
- 指定的 Snowflake 用户:
连接器配置为以此用户的身份对外部表执行操作。
- 存储集成:
存储集成支持配置对外部云存储进行安全访问,而无需传递明确的云提供商凭据,例如密钥或访问令牌。创建存储集成以访问 Hive 表中使用 CREATE STORAGE INTEGRATION 引用的云存储位置。
存储集成的 STORAGE_ALLOWED_LOCATIONS 参数必须列出与元存储中 Hive 表参数
Location
中引用的存储容器相同的存储容器。- 角色:
必须将角色分配给指定的 Snowflake 用户,并包含本部分标识的其他 Snowflake 对象的以下对象权限:
对象
权限
数据库
USAGE
架构
USAGE、CREATE STAGE、CREATE EXTERNAL TABLE
存储集成
USAGE
第 1 步:安装连接器¶
完成以下步骤以安装连接器:
从 Maven Central Repository 下载连接器 JAR 文件和配置 XML 文件:
Sonatype (https://central.sonatype.com/search?q=g%3Anet.snowflake%20snowflake-hive-metastore-connector) (或 https://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/ (https://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/))
将 JAR 文件复制到以下目录:
- Amazon S3 或 Google Cloud Storage:
Hive 类路径中的
lib
目录。位置可能因 Hive 安装而异。要确定类路径,请检查 HIVE_AUX_JARS_PATH 环境变量。- Microsoft Azure HDInsight:
用户目录中的
hive
目录;例如/usr/hdp/<hdinsight_version>/atlas/hook/hive/
。位置可能因 Azure HDInsight 版本和安装选项而异。备注
GitHub 项目页面上 (https://github.com/snowflakedb/snowflake-hive-metastore-connector/) 的
scripts
文件夹中提供了一个示例自定义脚本。该脚本将 JAR 文件和配置文件添加到正确的目录中。
在以下目录中创建名为
snowflake-config.xml
的文件:- Amazon S3 或 Google Cloud Storage:
Hive 类路径中的
conf
目录。- Microsoft Azure HDInsight:
Hive 类路径中的
conf/conf.server
目录。
在文本编辑器中打开
snowflake-config.xml
文件,并使用以下<name>
属性和相应的<values>
填充该文件:snowflake.jdbc.username
指定用于对外部表执行刷新操作的 Snowflake 用户登录名。
snowflake.jdbc.password
为登录名指定密码。
备注
您可以根据系统属性或环境变量为密码设置占位符,具体取决于您的 Hadoop 版本。该配置的行为与其他 Hadoop 配置类似。有关更多信息,请参阅 Hadoop 文档 (https://hadoop.apache.org/)。
snowflake.jdbc.privateKey
或者,使用密钥对身份验证进行身份验证。有关生成密钥对和将公钥分配给用户的说明,请参阅 密钥对身份验证和密钥对轮换。
若要将私钥传递给 Snowflake,请将
snowflake.jdbc.privateKey
属性添加到snowflake-config.xml
文件中。在文本编辑器中打开私钥文件(例如rsa_key.p8
)。将-----BEGIN RSA PRIVATE KEY-----
和-----END RSA PRIVATE KEY-----
之间的行复制为属性或环境变量值。snowflake.jdbc.account
指定账户的名称(由 Snowflake 提供),例如
xy12345
。snowflake.jdbc.db
指定要用于 Hive 元存储集成的现有 Snowflake 数据库。有关详细信息,请参阅 先决条件 部分(本主题内容)。
snowflake.jdbc.schema
指定所指定数据库中的现有 Snowflake 架构。有关详细信息,请参阅 先决条件 部分(本主题内容)。
若要将 Hive 元存储中的多个架构映射到 Snowflake 数据库中的相应架构,请在当前属性 之外 设置
snowflake.hive-metastore-listener.schemas
属性。在snowflake.jdbc.schema
属性中指定默认 Snowflake 架构。snowflake.jdbc.role
指定 Hive 连接器要使用的访问控制角色。该角色应为已分配给指定用户的现有角色。
如果此处未指定角色,则 Hive 连接器将使用指定用户的默认角色。
snowflake.jdbc.connection
按以下格式指定 Snowflake 账户的连接字符串:
jdbc:snowflake://<account_identifier>.snowflakecomputing.cn
其中:
<account_identifier>
Snowflake 账户的唯一标识符。
账户标识符的首选格式如下:
organization_name-account_name
Snowflake 组织和账户的名称。有关详细信息,请参阅 格式 1(首选):您所在组织的账户名称。
如果需要,还可以指定 账户定位器,以及托管该账户的地理 区域 和可能的 云平台。有关详细信息,请参阅 格式 2:区域中的账户定位器。
snowflake.hive-metastore-connector.integration
指定用于安全访问元存储的 Hive 表中引用的外部存储位置的存储集成对象的名称。有关详细信息,请参阅 先决条件 部分(本主题内容)。
snowflake.hive-metastore-listener.schemas
指定
snowflake.jdbc.db
中指定的 Snowflake 数据库中存在的 Snowflake 架构的逗号分隔列表。在 Hive 元存储中创建表时,连接器会检查此属性是否列出与包含新表的 Hive 架构/数据库同名的 Snowflake 架构:
如果列出了同名 Snowflake 架构,则连接器将在此架构中创建一个外部表。
如果 未 列出具有相同名称的 Snowflake 架构,则连接器将在
snowflake.jdbc.schema
属性中定义的默认架构中创建一个外部表。
外部表与新的 Hive 表同名。
备注
需要使用 Hive 连接器 0.5.0 版(或更高版本)。
(可选)添加以下属性:
snowflake.hive-metastore-listener.database-filter-regex
指定 Hive 元存储中要跳过集成的任何数据库的名称。使用此属性可以控制要与 Snowflake 集成的数据库。当多个表在 Hive 数据库中具有相同的名称时,此选项特别有用。目前,在此情况下,Hive 连接器会在 Snowflake 目标数据库中创建使用该名称的第一个表,但跳过具有相同名称的其他表。
例如,假设数据库
mydb1
、mydb2
和mydb3
都包含一个名为table1
的表。您可以省略所有具有命名约定mydb<编号>
的数据库,但将正则表达式mydb[^1]
添加为属性值的mydb1
除外。示例属性节点
<configuration> .. <property> <name>snowflake.hive-metastore-listener.database-filter-regex</name> <value>mydb[^1]</value> </property> </configuration>
示例 snowflake-config.xml文件
<configuration> <property> <name>snowflake.jdbc.username</name> <value>jsmith</value> </property> <property> <name>snowflake.jdbc.password</name> <value>mySecurePassword</value> </property> <property> <name>snowflake.jdbc.role</name> <value>custom_role1</value> </property> <property> <name>snowflake.jdbc.account</name> <value>myaccount</value> </property> <property> <name>snowflake.jdbc.db</name> <value>mydb</value> </property> <property> <name>snowflake.jdbc.schema</name> <value>myschema</value> </property> <property> <name>snowflake.jdbc.connection</name> <value>jdbc:snowflake://myaccount.snowflakecomputing.cn</value> </property> <property> <name>snowflake.hive-metastore-listener.integration</name> <value>s3_int</value> </property> <property> <name>snowflake.hive-metastore-listener.schemas</name> <value>myschema1,myschema2</value> </property> </configuration>
保存对文件所做的更改。
编辑现有 Hive 配置文件 (
hive-site.xml
):- Amazon S3 或 Google Cloud Storage:
在文本编辑器中打开
hive-site.xml
文件。将连接器添加到配置文件中,如下所示:<configuration> ... <property> <name>hive.metastore.event.listeners</name> <value>net.snowflake.hivemetastoreconnector.SnowflakeHiveListener</value> </property> </configuration>
- Microsoft Azure HDInsight:
完成 Azure HDInsight 文档 (https://docs.microsoft.com/en-us/azure/hdinsight/hdinsight-hadoop-customize-cluster-bootstrap) 中的步骤以编辑
hive-site.xml
文件。将以下自定义属性添加到群集配置中:hive.metastore.event.listeners=net.snowflake.hivemetastoreconnector.SnowflakeHiveListener
或者,在 HDInsight 群集管理门户中添加自定义属性:
单击左侧菜单 » Configs » Advanced 中的 Hive 选项卡。
向下滚动到 Custom Hive Site 选项卡。
添加自定义属性。
备注
如果此文件中已配置其他连接器,请在
<value>
节点的逗号分隔列表中添加 Snowflake 的 Hive 连接器。保存对文件所做的更改。
重新启动 Hive 元存储服务。
第 2 步:验证安装¶
在 Hive 中创建一个新表。
使用 SHOW EXTERNAL TABLES 查询 Snowflake 数据库和架构中的外部表列表:
SHOW EXTERNAL TABLES IN <database>.<schema>;
其中,
database
和schema
是在 第 1 步:安装连接器 (本主题内容)的snowflake-config.xml
文件中指定的数据库和架构的位置。结果应显示与新 Hive 表同名的外部表。
连接器记录将写入 Hive 元存储日志。连接器执行的查询可以在 Snowflake QUERY_HISTORY 视图/函数输出中查看,类似于其他查询。
将现有 Hive 表和分区与 Snowflake 集成¶
要将现有 Hive 表和分区与 Snowflake 集成,请在 Hive 中对每个表和分区执行以下命令:
ALTER TABLE <table_name> TOUCH [PARTITION partition_spec];
有关更多信息,请参阅 Hive 文档 (https://cwiki.apache.org/confluence/display/Hive/Home)。
或者,Snowflake 可提供一个用于同步现有 Hive 表和分区的脚本。有关信息,请参阅 ` GitHub 项目页面 <https://github.com/snowflakedb/snowflake-hive-metastore-connector/blob/master/scripts/sync_hive_to_snowflake.sh (https://github.com/snowflakedb/snowflake-hive-metastore-connector/blob/master/scripts/sync_hive_to_snowflake.sh)>`_。
备注
如果 snowflake.jdbc.db
属性中指定的数据库的相应 Snowflake 架构中已存在与 Hive 表同名的外部表,则 ALTER TABLE ...TOUCH 命令 不会 重新创建外部表。如果您需要重新创建外部表,请在 Hive 元存储中执行 ALTER TABLE ... TOUCH 命令之前删除外部表(使用 DROP EXTERNAL TABLE)。
功能¶
支持的 Hive 操作和表类型¶
Hive 操作¶
连接器支持以下 Hive 操作:
创建表
删除表
更改表添加列
更改表删除列
更改(即 接触)表
添加分区
删除分区
更改(接触)分区
Hive 表类型¶
连接器支持以下类型的 Hive 表:
外部表和托管表
分区表和未分区表
Hive 和 Snowflake 数据类型¶
下表显示了 Hive 和 Snowflake 数据类型之间的映射:
Hive |
Snowflake |
---|---|
BIGINT |
BIGINT |
BINARY |
BINARY |
BOOLEAN |
BOOLEAN |
CHAR |
CHAR |
DATE |
DATE |
DECIMAL |
DECIMAL |
DOUBLE |
DOUBLE |
DOUBLE PRECISION |
DOUBLE |
FLOAT |
FLOAT |
INT |
INT |
INTEGER |
INT |
NUMERIC |
DECIMAL |
SMALLINT |
SMALLINT |
STRING |
STRING |
TIMESTAMP |
TIMESTAMP |
TINYINT |
SMALLINT |
VARCHAR |
VARCHAR |
所有其他数据类型 |
VARIANT |
支持的文件格式和选项¶
支持以下数据文件格式和 Hive 文件格式选项:
CSV
使用 SerDe (Serializer/Deserializer) 属性支持以下选项:
field.delim
/separatorChar
line.delim
escape.delim
/escapeChar
JSON
AVRO
ORC
PARQUET
使用表属性支持以下选项:
parquet.compression
。
不受支持的 Hive 命令、功能和用例¶
连接器 不 支持以下 Hive 命令、功能和用例:
Hive 视图
ALTER 语句,而不是 TOUCH、ADD COLUMNS 和 DROP COLUMNS
自定义 SerDe 属性。
将现有托管 Hive 表修改为外部 Hive 表,反之亦然
刷新外部表元数据以反映云存储事件¶
在表上执行 受支持的 Hive 操作和表类型 (本主题内容)中列出的任何 Hive 操作时,Hive 连接器将侦听 Hive 事件,随后刷新 Snowflake 中相应外部表的元数据。
但是,连接器 不会 根据云存储中的事件(例如添加或移除数据文件)刷新外部表元数据。要刷新外部表的元数据以反映云存储中的事件,请为已分区或未分区 Hive 表执行相应的 ALTER TABLE ...TOUCH 命令。TOUCH 读取元数据并将其写回。有关该命令的更多信息,请参阅 Hive 文档 (https://cwiki.apache.org/confluence/display/Hive/Home):
- 已分区的 Hive 表:
执行以下命令:
ALTER TABLE <table_name> TOUCH PARTITION <partition_spec>;
- 未分区的 Hive 表:
执行以下命令:
ALTER TABLE <table_name> TOUCH;
Hive 表和 Snowflake 外部表之间的区别¶
本部分介绍 Hive 表和 Snowflake 外部表之间的主要区别。
- 分区:
Snowflake 分区由表引用的存储位置的子路径组成,而 Hive 分区不受此约束。如果在 Hive 表中添加的分区不是存储位置的子路径,则这些分区不会添加到 Snowflake 中的相应外部表中。
例如,如果与 Hive 表(以及相应的 Snowflake 外部表)关联的存储位置为
s3://path/
,则 Hive 表中的所有分区位置也必须以s3://path/
为前缀。单个外部表中的两个 Snowflake 分区不能指向完全相同的存储位置。例如,以下分区相互冲突:
ALTER EXTERNAL TABLE exttable ADD PARTITION(partcol='1') LOCATION 's3:///files/2019/05/12'; ALTER EXTERNAL TABLE exttable ADD PARTITION(partcol='2') LOCATION 's3:///files/2019/05/12';
- 列名称:
Hive 列名称不区分大小写,但派生自 VALUES 的 Snowflake 虚拟列区分大小写。如果 Hive 表包含具有混合大小写名称的列,则这些列中的数据可能在 Snowflake 外部表中的相应列中为 NULL。