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

背景信息

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

前提条件

已创建DataLake集群或Hadoop集群,并选择了Presto服务,详情请参见创建集群

使用限制

  • 配置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属性。
hive.metastore.uri Hive Metastore使用Thrift协议连接的URI。

默认值格式thrift://<主节点名称>.cluster-24****:9083

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

如果您有多个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 TABLECREATE 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=truehive.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_datecurrent_timestamp,及其它若干类似的语句。
  • translate()、窗口函数以及其他若干类似的Hive函数调用。
  • 公用表表达式和简单的Case表达式。
  • 设置时间戳精度。
  • 将全部Hive数据类型正确映射到Presto类型。
  • 处理自定义UDF的能力。

配置属性

Hive配置属性

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

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