将 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 步:安装连接器

完成以下步骤以安装连接器:

  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/))

  2. 将 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 文件和配置文件添加到正确的目录中。

  3. 在以下目录中创建名为 snowflake-config.xml 的文件:

    Amazon S3 或 Google Cloud Storage:

    Hive 类路径中的 conf 目录。

    Microsoft Azure HDInsight:

    Hive 类路径中的 conf/conf.server 目录。

  4. 在文本编辑器中打开 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 目标数据库中创建使用该名称的第一个表,但跳过具有相同名称的其他表。

    例如,假设数据库 mydb1mydb2mydb3 都包含一个名为 table1 的表。您可以省略所有具有命名约定 mydb<编号> 的数据库,但将正则表达式 mydb[^1] 添加为属性值的 mydb1 除外

    示例属性节点

    <configuration>
      ..
      <property>
        <name>snowflake.hive-metastore-listener.database-filter-regex</name>
        <value>mydb[^1]</value>
      </property>
    </configuration>
    
    Copy

    示例 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>
    
    Copy
  5. 保存对文件所做的更改。

  6. 编辑现有 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>
    
    Copy
    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 群集管理门户中添加自定义属性:

    1. 单击左侧菜单 » Configs » Advanced 中的 Hive 选项卡。

    2. 向下滚动到 Custom Hive Site 选项卡。

    3. 添加自定义属性。

    备注

    如果此文件中已配置其他连接器,请在 <value> 节点的逗号分隔列表中添加 Snowflake 的 Hive 连接器。

  7. 保存对文件所做的更改。

  8. 重新启动 Hive 元存储服务。

第 2 步:验证安装

  1. 在 Hive 中创建一个新表。

  2. 使用 SHOW EXTERNAL TABLES 查询 Snowflake 数据库和架构中的外部表列表:

    SHOW EXTERNAL TABLES IN <database>.<schema>;
    
    Copy

    其中,databaseschema 是在 第 1 步:安装连接器 (本主题内容)的 snowflake-config.xml 文件中指定的数据库和架构的位置。

    结果应显示与新 Hive 表同名的外部表。

连接器记录将写入 Hive 元存储日志。连接器执行的查询可以在 Snowflake QUERY_HISTORY 视图/函数输出中查看,类似于其他查询。

将现有 Hive 表和分区与 Snowflake 集成

要将现有 Hive 表和分区与 Snowflake 集成,请在 Hive 中对每个表和分区执行以下命令:

ALTER TABLE <table_name> TOUCH [PARTITION partition_spec];
Copy

有关更多信息,请参阅 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>;
Copy
未分区的 Hive 表:

执行以下命令:

ALTER TABLE <table_name> TOUCH;
Copy

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';
    
    Copy
列名称:

Hive 列名称不区分大小写,但派生自 VALUES 的 Snowflake 虚拟列区分大小写。如果 Hive 表包含具有混合大小写名称的列,则这些列中的数据可能在 Snowflake 外部表中的相应列中为 NULL。

语言: 中文