Hive连接器

更新时间:

使用 Hive 连接器可以查询和分析存储在 Hive 数据仓库中的数据。

背景信息

Hive数仓系统由以下三部分内容组成:
  • 不同格式的数据文件,通常存储在 Hadoop 分布式文件系统(HDFS)或对象存储系统(例如,阿里云 OSS)中。
  • 存储着数据文件到 Schema Table 映射的元数据。该元数据存储在数据库(例如,MySQL)中,并通过 Hive Metastore Service(HMS)访问。
  • 一种称为 HiveQL 的查询语言。该查询语言在分布式计算框架(例如,MapReduce Tez)上执行。
本文为您介绍Hive连接器相关的内容和操作,具体如下:

前提条件

已创建集群,详情请参见 创建集群

使用限制

  • 配置 Hive 连接器需要配置 Hive Metastore Service。
  • Hive 连接器支持多种分布式存储系统,包括 HDFS、阿里云 OSS OSS 的兼容系统,都可以使用 Hive 连接器查询。Coordinator 节点和所有 worker 节点必须能够通过网络访问 Hive Metastore 以及存储系统。通过 Thrift 协议访问 Hive Metastore 的默认端口是 9083。

修改 Hive 连接器配置

修改 Hive 连接器配置,详情请参见 配置连接器

连接器默认配置

进入EMR控制台的Presto服务的 配置 页面,在 服务配置 区域,单击 hive.properties 页签。您可以看到以下参数,参数值请根据您实际情况修改。
参数 描述
hive.recursive-directories 允许从表或分区所在位置的子目录读取数据,类似 Hive hive.mapred.supports.subdirectories 属性。

默认值为 false。

hive.metastore.uri Hive Metastore 使用 Thrift 协议连接的 URI。

默认值格式 thrift://emr-header-1.cluster-24****:9083

hive.config.resources HDFS 配置文件的列表,多个配置文件时以逗号(,)分隔。这些配置文件必须存在于 Presto 运行的所有主机上。
重要 仅在必须访问 HDFS 的情况下配置此项。

默认值为 /etc/ecm/hadoop-conf/core-site.xml, /etc/ecm/hadoop-conf/hdfs-site.xml

hive.delta-table-enabled 是否支持 Presto 读取 Delta Lake 表。取值如下:
  • true(默认值):Presto 可以读取 Delta Lake 表。
  • false:Presto 不可以读取 Delta Lake 表。
hive.delta-compatible-mode-enabled Delta Lake 表是否启用兼容模式。取值如下:
  • true(默认值):Delta Lake 表启用兼容模式。
  • false:Delta Lake 表不启用兼容模式。
hive.hdfs.impersonation.enabled 是否启用用户代理。取值如下:
  • true(默认值):启用用户代理。
  • false:不启用用户代理。
hive.metastore.use-dlf-catalog 是否将 Datalake Formation Catalog 用作 Hive Metastore。

默认值为 default。

多个 Hive 集群配置

如果您有多个 Hive 集群,可以在 etc/catalog 路径下增加相应数量的 Catalog 文件,确保文件后缀名为 .properties

例如,如果属性文件名为 sales.properties ,则 Presto 将使用其中配置的连接器创建一个叫 sales Catalog。

HDFS 配置

通常情况下,Presto会自动配置HDFS客户端,不需要任何配置文件。在某些情况下,例如启用联合HDFS或NameNode高可用时,需要额外指定HDFS客户端选项才能访问HDFS集群,此时需要添加 hive.config.resources 属性以引用所需的HDFS配置文件。
重要
  • 仅在需要配置时,才需要额外指定配置文件。建议减少配置文件以包含所需的最少属性集,防止属性间不兼容。
  • 配置文件必须存在于 Presto 运行的所有主机上。如果要引用现有的 Hadoop 配置文件,请确保将其拷贝到任何未运行 Hadoop Presto 节点上。

HDFS 用户名与权限

Presto 中为 Hive 表运行任何 CREATE TABLE CREATE TABLE AS 语句之前,都需要检查 Presto 用于访问 HDFS 的用户是否有权访问 Hive 的仓库目录。 Hive 仓库目录由 hive-site.xml 中的配置变量 hive.metastore.warehouse.dir 指定,默认值为 /user/hive/warehouse

支持的文件类型

Hive连接器支持下列文件类型。
文件类型 备注
ORC
Parquet
Avro
RCText 使用 ColumnarSerDe RCFile。
RCBinary 使用 LazyBinaryColumnarSerDe RCFile。
SequenceFile
JSON 使用 org.apache.hive.hcatalog.data.JsonSerDe
CSV 使用 org.apache.hadoop.hive.serde2.OpenCSVSerde
TextFile

支持的表类型

Hive连接器支持下列表类型。
表类型 描述
ACID 在连接 3.x 版本的 Hive Metastore 时,Hive 连接器支持 insert-only ACID 表的读写,且完全支持分区和分桶。

ACID 表支持行级的 DELETE UPDATE,不支持分区键列和桶列的 UPDATE,不支持使用 Hive Streaming Ingest 创建的 ACID 表,详情 Streaming Data Ingest

物化视图 Hive 连接器支持从 Hive 的物化视图中读取数据。在 Presto 中,这些视图将以常规的、只读表的形式展示。

Hive 视图

Hive 视图由 HiveQL 定义,存储在 Hive Metastore Service 中。

Hive连接器包含以下三种不同模式的Hive视图。
模式 描述
Disabled 视图中编码的业务逻辑和数据在 Presto 中是不可见的。

默认行为是忽略 Hive 视图。

Legacy Hive 视图的简单实现,可以读取 Presto 中的数据。

可以通过配置 hive.translate-hive-views=true hive.legacy-hive-view-translation=true 启用此模式。

如果想为特定的 Catalog 临时启用此传统访问方式,可以将 Catalog Session 属性 legacy_hive_view_translation 设置为 true。

由于 HiveQL SQL 非常相似,因此 Legacy 方式可以通过 SQL 语言解释任何定义了视图的 HiveQL 查询,不做任何转换。

此方式适用于简单的 Hive 视图,但可能会导致复杂的查询出现问题。例如,如果 HiveQL 函数具有与 SQL 相同的签名,但具有不同行为,则返回的结果可能会有所不同。在更极端的情况下,查询可能会失败,甚至无法解析和执行。

Experimental 可以分析、处理与重写 Hive 视图,包括其包含的表达式和语句。

可以通过配置 hive.translate-hive-views=true 启用此模式。

使用此模式时,暂不支持以下功能:
  • HiveQL current_date current_timestamp ,及其它若干类似的语句。
  • translate() 、窗口函数以及其他若干类似的 Hive 函数调用。
  • 公用表表达式和简单的 Case 表达式。
  • 设置时间戳精度。
  • 将全部 Hive 数据类型正确映射到 Presto 类型。
  • 处理自定义 UDF 的能力。

配置属性

Hive 配置属性

Hive 连接器支持使用 Jindo Table 加速。EMR 集群中内置了两个 Hive 连接器,分别为 hive.properties hive-acc.properties hive-acc.properties 内置了 JindoTable Native Engine,对 ORC Parquet 格式的文件进行加速优化,请根据您 SmartData 的版本查看相应的文档,详情请参见 开启 native 查询加速

下表列出了Hive连接器的各项配置属性。
属性名 描述
hive.config.resources HDFS 配置文件的列表,多个文件时以逗号(,)分隔。这些文件必须存在于 Presto 运行的所有主机上。例如, /etc/hdfs-site.xml
说明 仅在必须访问 HDFS 的情况下配置该属性。
hive.recursive-directories 允许从表或分区所在位置的子目录读取数据,类似 Hive hive.mapred.supports.subdirectories 属性。

默认值为 false。

hive.ignore-absent-partitions 当文件系统位置不存在时,忽略该分区而不是报查询失败,但也有可能会跳过原本可能属于表的一部分数据。

默认值为 false。

hive.storage-format 建表时的默认文件格式。

默认值为 ORC。

hive.compression-codec 写文件时使用的文件编码方式。取值可以为 NONE、SNAPPY、LZ4、ZSTD GZIP。

默认值为 GZIP。

hive.force-local-scheduling 强制将分片规划到与处理该分片数据的 Hadoop DataNode 服务相同的节点上。此配置方式对于 Presto 与每个 DataNode 并置的安装很有用,可以提升并置安装的效率。

默认值为 false。

hive.respect-table-format 新分区应使用现有的表格式还是 Presto 的格式。取值如下:
  • true(默认值):使用现有的表格式。
  • false:使用 Presto 的格式。
hive.immutable-partitions 新数据能否插入到现存的分区中。

设置为 true 时, hive.insert-existing-partitions-behavior 将不允许设置为 APPEND

默认值为 false。

hive.insert-existing-partitions-behavior 数据插入现有分区时的行为。取值如下:
  • APPEND(默认值):在现有分区追加数据。
  • OVERWRITE:覆盖现有分区。
  • ERROR:不允许修改现有分区。
hive.create-empty-bucket-files 是否应为没有数据存储的桶创建空文件。取值如下:
  • true:创建空文件。
  • false(默认值):不创建空文件。
hive.max-partitions-per-writers 每个 writer 的最大分区数。

默认值为 100。

hive.max-partitions-per-scan 一次表扫描的最大分区数。

默认值为 100,000。

hive.hdfs.authentication.type HDFS 身份验证类型。取值如下:
  • NONE(默认值):表示普通模式,不进行 Kerberos 认证。
  • KERBEROS:表示使用安全模式,进行 Kerberos 认证。
hive.hdfs.impersonation.enabled 是否启用 HDFS 端用户模拟。取值如下:
  • true:启用 HDFS 端用户模拟。
  • false(默认值):不启用 HDFS 端用户模拟。
hive.hdfs.trino.principal Presto 连接 HDFS 时使用的 Kerberos 主体。
hive.hdfs.trino.keytab HDFS 客户端密钥文件的位置。
hive.dfs.replication HDFS 副本因子。
hive.security 默认值为 legacy。详情请参见 Hive connector security configuration
security.config-file 当设置 hive.security=file 时使用的配置文件路径。
hive.non-managed-table-writes-enabled 启用对非托管(外部)Hive 表的写入。

默认值为 false。

hive.non-managed-table-creates-enabled 启用对非托管(外部)Hive 表的创建。

默认值为 true。

hive.collect-column-statistics-on-write 启用在写入时以列为单位自动收集统计信息。详情请参见 配置属性

默认值为 true。

hive.file-status-cache-tables 特定表的缓存路径列表。

例如, fruit.apple,fruit.orange 表示仅缓存 Schema fruit 中的 apple orange 表。 fruit.*,vegetable.* 表示缓存 Schema fruit vegetable 中的所有表。 * 表示缓存所有 Schema 中的所有表。

hive.file-status-cache-size 缓存文件状态条目的最大总数。

默认值为 1000000。

hive.file-status-cache-expire-time 缓存路径列表的有效时间。

默认值为 1m。

hive.rcfile.time-zone 将时间戳的二进制编码值调整到指定时区。

默认值为 JVM default。

说明 Hive 3.1 及后续版本,需要将此值设为 UTC。
hive.timestamp-precision 指定 Timestamp 类型 Hive 列的精度。取值如下:
  • MILLISECONDS:毫秒。
  • MICROSECONDS:微秒。
  • NANOSECONDS:纳秒。

默认值为 MILLISECONDS。

说明 精度高于配置的值时将会四舍五入。
hive.temporary-staging-directory-enabled 控制是否将在 hive.temporary-staging-directory-path 中配置的临时模拟目录用于写入操作。 临时模拟目录不会用于写入 OSS、加密 HDFS 或外部位置的无序表。写入排序表时会在排序操作期间使用此路径暂存临时文件。设置为禁用时,目标存储将用于在写入排序表时进行暂存,此方式在写入对象存储时效率低下。

默认值为 true。

hive.temporary-staging-directory-path 控制用于写操作的临时暂存目录的位置。
默认值为 /tmp/presto-${USER}
说明 ${USER} 占位符可用于让每个用户使用不同的位置。
hive.translate-hive-views 启用 Hive 视图的变换操作。

默认值为 false。

hive.legacy-hive-view-translation 使用传统算法转换 Hive 视图。可以将 legacy_hive_view_translation catalog session 属性用于特定的 Catalog。

默认值为 false。

hive.parallel-partitioned-bucketed-writes 提高分区表和分桶表写入的并行性。

默认值为 true。

说明 禁用时,写入线程的数量将仅限于存储桶的数量。

ORC 格式配置属性

以下属性用于配置由Hive连接器执行ORC文件的读写操作。
属性名 描述
hive.orc.time-zone 为未声明时区的旧版 ORC 文件设置默认时区。

默认值为 JVM default。

hive.orc.use-columns-names 按名称访问 ORC 列。

默认情况下,ORC 文件中的列按它们在 Hive 表定义中的顺序位置进行访问。 catalog session 属性和 orc_use_column_names 功能一样。

默认值为 false。

Parquet 格式配置属性

以下属性用于配置由Hive连接器执行Parquet文件的读写操作。
属性名 描述
hive.parquet.time-zone Timestamp 的值调整到指定时区。

默认值为 JVM default。

说明 Hive 3.1 及后续版本,需要将此值设为 UTC。
hive.parquet.use-columns-names 访问 Parquet 列的方式。取值如下:
  • true(默认值):按名称访问 Parquet 列,无需保持列名顺序与文件一致。
  • false:按列在 Hive 表定义中的顺序位置访问 Parquet 列。
catalog session 属性和 parquet_use_column_names 功能一样。

Metastore 配置属性

Hive metastore可以使用下列属性进行配置,使用特定的属性可以进一步配置Thrift,详情请参见 Thrift Metastore配置属性
属性名 描述
hive.metastore Hive Metastore 使用的类型。Presto 支持默认的 Hive Thrift metastore(thrift)及其衍生产品。

默认值为 thrift。

hive.metastore-cache-ttl Hive Metastore 缓存的 Metastore 数据被视为可用的持续时间。

默认值为 0s。

hive.metastore-cache-maximum-size Hive Metastore 缓存的 Metastore 数据对象的最大个数。

默认值为 10000。

hive.metastore-refresh-interval 访问后异步刷新缓存的 Metastore 数据。如果缓存的数据是尚未过期的旧数据,则允许后续访问查看新数据。
hive.metastore-refresh-max-threads 刷新 Metastore 数据缓存的最大线程数。

默认值为 10。

hive.metastore-timeout Hive Metastore 请求的超时时间。

默认值为 10s。

Thrift Metastore 配置属性

下表介绍了Hive连接器的Thrift Metastore配置属性。
属性名 描述
hive.metastore.uri Hive Metastore 使用 Thrift 协议连接的 URI。

如果提供了多个 URI,则会默认使用第一个,其余的当作备用 Metastore。此属性是必填项。示例: thrift://192.0.**.**:9083 thrift://192.0.**.**:9083,thrift://192.0.**.**:9083

hive.metastore.username Presto 用于访问 Hive Metastore 的用户名。
hive.metastore.authentication.type Hive Metastore 身份验证的方式类型。取值如下:
  • NONE(默认值):表示普通模式,不进行 Kerberos 认证。
  • KERBEROS:表示使用安全模式,进行 Kerberos 认证。
hive.metastore.thrift.impersonation.enabled 启用 Hive Metastore 端用户模拟。
hive.metastore.thrift.delegation-token.cache-ttl Metastore Delegation Token 缓存的有效期限。

默认值为 1h。

hive.metastore.thrift.delegation-token.cache-maximum-size Delegation Token 缓存的最大值。

默认值为 1000。

hive.metastore.thrift.client.ssl.enabled 连接到 Metastore 时是否启用 SSL。取值如下:
  • true:连接到 Metastore 时使用 SSL。
  • false(默认值):连接到 Metastore 时不启用 SSL。
hive.metastore.thrift.client.ssl.key 私钥和客户端证书(keyStore)的路径。
hive.metastore.thrift.client.ssl.key-password 私钥的密码。
hive.metastore.thrift.client.ssl.trust-certificate 服务器证书链(trustStore)的路径。
说明 启用 SSL 时必填。
hive.metastore.thrift.client.ssl.trust-certificate-password 服务器证书链的密码。
hive.metastore.service.principal Hive Metastore 服务的 Kerberos 规则。
hive.metastore.client.principal Presto 连接 Hive Metastore 服务时使用的 Kerberos 规则。
hive.metastore.client.keytab Hive Metastore 客户端 keytab 文件的位置。

性能调优配置属性

下表介绍了Hive连接器的性能调优配置属性。
重要 更改下表属性的默认值可能会导致不稳定和性能下降,请谨慎操作。
属性名 描述
hive.max-outstanding-splits Scheduler 尝试暂停之前,一次查询中每个表扫描的缓存 split 的目标数量。

默认值为 1000。

hive.max-splits-per-second 每次表扫描每秒生成的最大 split 数,可用于减少存储系统的负载。默认情况下没有限制,即 Presto 将最大化数据访问的并行度。
hive.max-initial-splits 对于每次表扫描,coordinator 首先分配大小不超过 max-initial-split-size 的文件片段。在分配了 max-initial-splits 个片段之后,剩余 split 的最大值由 max-split-size 决定。

默认值为 200。

hive.max-initial-split-size 在已分配的片段数不超过 max-initial-splits 时,分配给 worker 节点的单个文件片段的大小。较小的 split 会导致更高的并行度,从而加速小查询。

默认值为 32 MB。

hive.max-split-size 分配给 worker 节点的单个文件片段的最大值。较小的 split 会导致更高的并行度,从而可以减少延迟,但也会产生更大的开销并增加系统负载。

默认值为 64 MB。

表统计数据

Hive 连接器支持收集和管理表统计数据以改进查询过程的性能。

写数据时,Hive连接器默认会收集基础信息,例如,文件数、行数、原始数据大小和总大小,及下表的列级统计数据。
列类型 可收集信息
TINYINT 空值数量、不同的值数量、最大值或最小值
SMALLINT 空值数量、不同的值数量、最大值或最小值
INTEGER 空值数量、不同的值数量、最大值或最小值
BIGINT 空值数量、不同的值数量、最大值或最小值
DOUBLE 空值数量、不同的值数量、最大值或最小值
REAL 空值数量、不同的值数量、最大值或最小值
DECIMAL 空值数量、不同的值数量、最大值或最小值
DATE 空值数量、不同的值数量、最大值或最小值
TIMESTAMP 空值数量、不同的值数量、最大值或最小值
VARCHAR 空值数量、不同的值数量
CHAR 空值数量、不同的值数量
VARBINARY 空值数量
BOOLEAN 空值数量、true false 值数量