使用 Hive 连接器可以查询和分析存储在 Hive 数据仓库中的数据。
背景信息
- 不同格式的数据文件,通常存储在 Hadoop 分布式文件系统(HDFS)或对象存储系统(例如,阿里云 OSS)中。
- 存储着数据文件到 Schema 和 Table 映射的元数据。该元数据存储在数据库(例如,MySQL)中,并通过 Hive Metastore Service(HMS)访问。
- 一种称为 HiveQL 的查询语言。该查询语言在分布式计算框架(例如,MapReduce 或 Tez)上执行。
前提条件
已创建集群,详情请参见 创建集群 。
使用限制
- 配置 Hive 连接器需要配置 Hive Metastore Service。
- Hive 连接器支持多种分布式存储系统,包括 HDFS、阿里云 OSS 或 OSS 的兼容系统,都可以使用 Hive 连接器查询。Coordinator 节点和所有 worker 节点必须能够通过网络访问 Hive Metastore 以及存储系统。通过 Thrift 协议访问 Hive Metastore 的默认端口是 9083。
修改 Hive 连接器配置
修改 Hive 连接器配置,详情请参见 配置连接器 。
连接器默认配置
| 参数 | 描述 |
| hive.recursive-directories |
允许从表或分区所在位置的子目录读取数据,类似
Hive
的
hive.mapred.supports.subdirectories
属性。
默认值为 false。 |
| hive.metastore.uri |
Hive Metastore
使用
Thrift
协议连接的
URI。
默认值格式
|
| hive.config.resources |
HDFS
配置文件的列表,多个配置文件时以逗号(,)分隔。这些配置文件必须存在于
Presto
运行的所有主机上。
重要
仅在必须访问
HDFS
的情况下配置此项。
默认值为
|
| hive.delta-table-enabled |
是否支持
Presto
读取
Delta Lake
表。取值如下:
|
| hive.delta-compatible-mode-enabled |
Delta Lake
表是否启用兼容模式。取值如下:
|
| hive.hdfs.impersonation.enabled |
是否启用用户代理。取值如下:
|
| hive.metastore.use-dlf-catalog |
是否将
Datalake Formation Catalog
用作
Hive Metastore。
默认值为 default。 |
多个 Hive 集群配置
如果您有多个 Hive 集群,可以在 etc/catalog 路径下增加相应数量的 Catalog 文件,确保文件后缀名为 .properties 。
例如,如果属性文件名为 sales.properties ,则 Presto 将使用其中配置的连接器创建一个叫 sales 的 Catalog。
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
。
支持的文件类型
| 文件类型 | 备注 |
| 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 | 无 |
支持的表类型
| 表类型 | 描述 |
| 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 中。
| 模式 | 描述 |
| Disabled |
视图中编码的业务逻辑和数据在
Presto
中是不可见的。
默认行为是忽略 Hive 视图。 |
| Legacy |
Hive
视图的简单实现,可以读取
Presto
中的数据。
可以通过配置
如果想为特定的
Catalog
临时启用此传统访问方式,可以将
Catalog Session
属性
由于 HiveQL 与 SQL 非常相似,因此 Legacy 方式可以通过 SQL 语言解释任何定义了视图的 HiveQL 查询,不做任何转换。 此方式适用于简单的 Hive 视图,但可能会导致复杂的查询出现问题。例如,如果 HiveQL 函数具有与 SQL 相同的签名,但具有不同行为,则返回的结果可能会有所不同。在更极端的情况下,查询可能会失败,甚至无法解析和执行。 |
| Experimental |
可以分析、处理与重写
Hive
视图,包括其包含的表达式和语句。
可以通过配置
使用此模式时,暂不支持以下功能:
|
配置属性
Hive 配置属性
Hive
连接器支持使用
Jindo Table
加速。EMR
集群中内置了两个
Hive
连接器,分别为
hive.properties
和
hive-acc.properties
。
hive-acc.properties
内置了
JindoTable Native Engine,对
ORC
或
Parquet
格式的文件进行加速优化,请根据您
SmartData
的版本查看相应的文档,详情请参见
开启
native
查询加速
。
| 属性名 | 描述 |
| 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
的格式。取值如下:
|
| hive.immutable-partitions |
新数据能否插入到现存的分区中。
设置为
true
时,
默认值为 false。 |
| hive.insert-existing-partitions-behavior |
数据插入现有分区时的行为。取值如下:
|
| hive.create-empty-bucket-files |
是否应为没有数据存储的桶创建空文件。取值如下:
|
| hive.max-partitions-per-writers |
每个
writer
的最大分区数。
默认值为 100。 |
| hive.max-partitions-per-scan |
一次表扫描的最大分区数。
默认值为 100,000。 |
| hive.hdfs.authentication.type |
HDFS
身份验证类型。取值如下:
|
| hive.hdfs.impersonation.enabled |
是否启用
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 |
特定表的缓存路径列表。
例如,
|
| 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。
说明
精度高于配置的值时将会四舍五入。
|
| 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.time-zone |
为未声明时区的旧版
ORC
文件设置默认时区。
默认值为 JVM default。 |
| hive.orc.use-columns-names |
按名称访问
ORC
列。
默认情况下,ORC
文件中的列按它们在
Hive
表定义中的顺序位置进行访问。
默认值为 false。 |
Parquet 格式配置属性
| 属性名 | 描述 |
| hive.parquet.time-zone |
将
Timestamp
的值调整到指定时区。
默认值为 JVM default。
说明
Hive 3.1
及后续版本,需要将此值设为
UTC。
|
| hive.parquet.use-columns-names |
访问
Parquet
列的方式。取值如下:
catalog session
属性和
parquet_use_column_names
功能一样。
|
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.metastore.uri |
Hive Metastore
使用
Thrift
协议连接的
URI。
如果提供了多个
URI,则会默认使用第一个,其余的当作备用
Metastore。此属性是必填项。示例:
|
| hive.metastore.username | Presto 用于访问 Hive Metastore 的用户名。 |
| hive.metastore.authentication.type |
Hive Metastore
身份验证的方式类型。取值如下:
|
| 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。取值如下:
|
| 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.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 连接器支持收集和管理表统计数据以改进查询过程的性能。
| 列类型 | 可收集信息 |
| TINYINT | 空值数量、不同的值数量、最大值或最小值 |
| SMALLINT | 空值数量、不同的值数量、最大值或最小值 |
| INTEGER | 空值数量、不同的值数量、最大值或最小值 |
| BIGINT | 空值数量、不同的值数量、最大值或最小值 |
| DOUBLE | 空值数量、不同的值数量、最大值或最小值 |
| REAL | 空值数量、不同的值数量、最大值或最小值 |
| DECIMAL | 空值数量、不同的值数量、最大值或最小值 |
| DATE | 空值数量、不同的值数量、最大值或最小值 |
| TIMESTAMP | 空值数量、不同的值数量、最大值或最小值 |
| VARCHAR | 空值数量、不同的值数量 |
| CHAR | 空值数量、不同的值数量 |
| VARBINARY | 空值数量 |
| BOOLEAN | 空值数量、true 或 false 值数量 |