Hive 连接器

概述

Hive 连接器允许查询存储在 Hive 数据仓库中的数据。Hive 由三个组件组成

  • 通常存储在 Hadoop 分布式文件系统 (HDFS) 或 Amazon S3 中的不同格式的数据文件。

  • 有关如何将数据文件映射到模式和表的信息。此元数据存储在 MySQL 等数据库中,并通过 Hive 元数据存储服务访问。

  • 一种名为 HiveQL 的查询语言。此查询语言在分布式计算框架(如 MapReduce 或 Tez)上执行。

Presto 仅使用前两个组件:数据和元数据。它不使用 HiveQL 或 Hive 执行环境的任何部分。

支持的文件类型

Hive 连接器支持以下文件类型

  • ORC

  • Parquet

  • Avro

  • RCFile

  • SequenceFile

  • JSON

  • 文本

配置

Hive 连接器支持 Apache Hadoop 2.x 及衍生发行版,包括 Cloudera CDH 5 和 Hortonworks 数据平台 (HDP)。

创建 etc/catalog/hive.properties,内容如下,将 hive-hadoop2 连接器安装为 hive 目录,将 example.net:9083 替换为 Hive 元数据存储 Thrift 服务的正确主机和端口

connector.name=hive-hadoop2
hive.metastore.uri=thrift://example.net:9083

多个 Hive 集群

您可以根据需要创建任意数量的目录,因此如果您有其他 Hive 集群,只需将另一个属性文件添加到 etc/catalog 中,并使用不同的名称(确保以 .properties 结尾)。例如,如果您将属性文件命名为 sales.properties,Presto 将使用配置的连接器创建名为 sales 的目录。

HDFS 配置

对于基本设置,Presto 会自动配置 HDFS 客户端,不需要任何配置文件。在某些情况下,例如使用联合 HDFS 或 NameNode 高可用性时,需要指定其他 HDFS 客户端选项才能访问 HDFS 集群。为此,请将 hive.config.resources 属性添加到您的 HDFS 配置文件中

hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml

仅在您的设置需要时才指定其他配置文件。我们还建议减少配置文件,以包含最少的必要属性,因为其他属性可能会导致问题。

配置文件必须存在于所有 Presto 节点上。如果您正在引用现有的 Hadoop 配置文件,请确保将它们复制到所有未运行 Hadoop 的 Presto 节点上。

HDFS 用户名

在不使用 HDFS 的 Kerberos 的情况下,Presto 将使用 Presto 进程的 OS 用户访问 HDFS。例如,如果 Presto 作为 nobody 运行,它将以 nobody 身份访问 HDFS。您可以通过在 Presto 的 JVM 配置 中设置 HADOOP_USER_NAME 系统属性来覆盖此用户名,将 hdfs_user 替换为适当的用户名

-DHADOOP_USER_NAME=hdfs_user

访问受 Kerberos 身份验证保护的 Hadoop 集群

Kerberos 身份验证支持 HDFS 和 Hive 元数据存储。但是,尚不支持通过票证缓存进行 Kerberos 身份验证。

适用于 Hive 连接器安全性的属性列在 Hive 配置属性 表中。有关 Hive 连接器中安全选项的更详细讨论,请参阅 Hive 安全配置 部分。

Hive 配置属性

属性名称

描述

默认值

hive.metastore.uri

要使用 Thrift 协议连接到的 Hive 元数据存储的 URI。如果提供了多个 URI,则默认情况下使用第一个 URI,其余 URI 是备用元数据存储。此属性是必需的。示例:thrift://192.0.2.3:9083thrift://192.0.2.3:9083,thrift://192.0.2.4:9083

hive.metastore.username

Presto 用于访问 Hive 元数据存储的用户名。

hive.config.resources

HDFS 配置文件的可选逗号分隔列表。这些文件必须存在于运行 Presto 的机器上。仅在绝对需要访问 HDFS 时才指定此项。示例:/etc/hdfs-site.xml

hive.storage-format

创建新表时使用的默认文件格式。

ORC

hive.compression-codec

写入文件时使用的压缩编解码器。

GZIP

hive.force-local-scheduling

强制将拆分调度到与提供拆分数据的 Hadoop DataNode 进程相同的节点上。这对于 Presto 与每个 DataNode 位于同一位置的安装很有用。

false

hive.order-based-execution-enabled

启用基于顺序的执行。启用后,Hive 文件将变得不可拆分,并且表排序属性将公开给计划优化器

false

hive.respect-table-format

是否应使用现有表格式或默认 Presto 格式写入新分区?

true

hive.immutable-partitions

是否可以将新数据插入现有分区?

false

hive.create-empty-bucket-files

是否应为没有数据的存储桶创建空文件?

true

hive.max-partitions-per-writers

每个编写器允许的最大分区数。

100

hive.max-partitions-per-scan

单个表扫描允许的最大分区数。

100,000

hive.dynamic-split-sizes-enabled

启用基于查询扫描的数据动态调整拆分大小。

false

hive.metastore.authentication.type

Hive 元数据存储身份验证类型。可能的值为 NONEKERBEROS

NONE

hive.metastore.service.principal

Hive 元数据存储服务的 Kerberos 主体。

hive.metastore.client.principal

Presto 连接到 Hive 元数据存储服务时将使用的 Kerberos 主体。

hive.metastore.client.keytab

Hive 元数据存储客户端密钥表位置。

hive.hdfs.authentication.type

HDFS 身份验证类型。可能的值为 NONEKERBEROS

NONE

hive.hdfs.impersonation.enabled

启用 HDFS 最终用户模拟。

false

hive.hdfs.presto.principal

Presto 连接到 HDFS 时使用的 Kerberos 主体。

hive.hdfs.presto.keytab

HDFS 客户端 keytab 位置。

hive.security

请参见 Hive 安全配置.

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

启用写入时自动收集列级统计信息。有关详细信息,请参见 表统计信息

false

hive.s3select-pushdown.enabled

启用将查询下推到 AWS S3 Select 服务。

false

hive.s3select-pushdown.max-connections

S3SelectPushdown 对 S3 的同时打开连接的最大数量。

500

hive.metastore.load-balancing-enabled

启用在多个元数据存储实例之间进行负载均衡。

hive.skip-empty-files

启用跳过空文件。否则,将产生遍历空文件的错误。

false

hive.file-status-cache.max-retained-size

目录列表缓存的最大大小(以字节为单位)。

0KB

元数据存储配置属性

所需的 Hive 元数据存储可以使用许多属性进行配置。

属性名称

描述

默认值

hive.metastore-timeout

Hive 元数据存储请求的超时时间。

10s

hive.metastore-cache-ttl

缓存的元数据存储数据应被视为有效的持续时间。

0s

hive.metastore-cache-maximum-size

Hive 元数据存储缓存的最大大小。

10000

hive.metastore-refresh-interval

如果缓存的元数据存储数据比此时间更旧但尚未过期,则在访问后异步刷新该数据,允许后续访问看到最新数据。

0s

hive.metastore-refresh-max-threads

用于刷新缓存的元数据存储数据的最大线程数。

100

AWS Glue 目录配置属性

属性名称

描述

hive.metastore.glue.region

Glue 目录的 AWS 区域。如果不在 EC2 中运行,或者目录位于其他区域,则需要此参数。例如:us-east-1

hive.metastore.glue.pin-client-to-current-region

将 Glue 请求固定到与运行 Presto 的 EC2 实例相同的区域(默认为 false)。

hive.metastore.glue.max-connections

对 Glue 的并发连接的最大数量(默认为 5)。

hive.metastore.glue.max-error-retries

Glue 客户端的最大错误重试次数,默认为 10

hive.metastore.glue.default-warehouse-dir

Hive Glue 元数据存储默认仓库目录。

hive.metastore.glue.aws-access-key

用于连接到 Glue 目录的 AWS 访问密钥。如果与 hive.metastore.glue.aws-secret-key 一起指定,则此参数优先于 hive.metastore.glue.iam-role

hive.metastore.glue.aws-secret-key

用于连接到 Glue 目录的 AWS 秘密密钥。如果与 hive.metastore.glue.aws-access-key 一起指定,则此参数优先于 hive.metastore.glue.iam-role

hive.metastore.glue.catalogid

包含元数据数据库的 Glue 目录的 ID。

hive.metastore.glue.endpoint-url

Glue API 端点 URL(可选)。例如:https://glue.us-east-1.amazonaws.com

hive.metastore.glue.partitions-segments

分区 Glue 表的段数。

hive.metastore.glue.get-partition-threads

从 Glue 并行获取分区的线程数。

hive.metastore.glue.iam-role

连接到 Glue 目录时要假定的 IAM 角色的 ARN。

Amazon S3 配置

Hive 连接器可以读取和写入存储在 S3 中的表。这是通过使用 S3 前缀而不是 HDFS 前缀来完成表或数据库位置来实现的。

Presto 使用自己的 S3 文件系统用于 URI 前缀 s3://s3n://s3a://

S3 配置属性

属性名称

描述

hive.s3.use-instance-credentials

使用 EC2 元数据服务检索 API 凭据(默认为 false)。这适用于 EC2 中的 IAM 角色。

注意:此属性已弃用。

hive.s3.aws-access-key

要使用的默认 AWS 访问密钥。

hive.s3.aws-secret-key

要使用的默认 AWS 秘密密钥。

hive.s3.iam-role

要假定的 IAM 角色。

hive.s3.endpoint

S3 存储端点服务器。这可以用于连接到与 AWS 不兼容的 S3 存储系统。当使用 v4 签名时,建议将其设置为 AWS 区域特定的端点(例如,http[s]://<bucket>.s3-<AWS-region>.amazonaws.com)。

hive.s3.storage-class

写入数据时要使用的 S3 存储类。目前仅支持 STANDARDINTELLIGENT_TIERING 存储类。默认存储类是 STANDARD

hive.s3.signer-type

为与 S3 兼容的存储指定不同的签名类型。例如:S3SignerType 用于 v2 签名类型。

hive.s3.path-style-access

对与 S3 兼容的存储的所有请求使用路径样式访问。这是为不支持虚拟主机样式访问的与 S3 兼容的存储。(默认为 false

hive.s3.staging-directory

写入 S3 的数据的本地暂存目录。这默认为 JVM 系统属性 java.io.tmpdir 指定的 Java 临时目录。

hive.s3.pin-client-to-current-region

将 S3 请求固定到与运行 Presto 的 EC2 实例相同的区域(默认为 false)。

hive.s3.ssl.enabled

使用 HTTPS 与 S3 API 通信(默认为 true)。

hive.s3.sse.enabled

使用 S3 服务器端加密(默认为 false)。

hive.s3.sse.type

S3 服务器端加密的密钥管理类型。对于 S3 管理的密钥,使用 S3,对于 KMS 管理的密钥,使用 KMS(默认为 S3)。

hive.s3.sse.kms-key-id

使用 KMS 管理的密钥的 S3 服务器端加密要使用的 KMS 密钥 ID。如果未设置,则使用默认密钥。

hive.s3.kms-key-id

如果设置,则使用 S3 客户端端加密,并使用 AWS KMS 存储加密密钥,并将此属性的值用作新创建对象的 KMS 密钥 ID。

hive.s3.encryption-materials-provider

如果设置,则使用 S3 客户端端加密,并将此属性的值用作实现 AWS SDK 的 EncryptionMaterialsProvider 接口的 Java 类的完全限定名称。如果该类还实现了 Hadoop API 中的 Configurable,则在创建对象后将传入 Hadoop 配置。

hive.s3.upload-acl-type

将文件上传到 S3 时要使用的预定义 ACL(默认为 Private)。

hive.s3.skip-glacier-objects

忽略 Glacier 对象,而不是使查询失败。这将跳过可能预期为表或分区一部分的数据。默认为 false

S3 凭据

如果使用 EMR 或其他工具在 Amazon EC2 上运行 Presto,建议使用 EC2 的 IAM 角色来控制对 S3 的访问权限。要启用此功能,您的 EC2 实例需要分配一个 IAM 角色,该角色授予对您要使用的 S3 存储桶(S3 存储桶)中存储数据的适当访问权限。也可以使用 hive.s3.iam-role 配置一个 IAM 角色,该角色将在访问任何 S3 存储桶时被假定。这比在 hive.s3.aws-access-keyhive.s3.aws-secret-key 设置中设置 AWS 访问密钥和秘密密钥要干净得多,并且还允许 EC2 在无需您额外操作的情况下定期自动轮换凭据。

在引入 DefaultAWSCredentialsProviderChain 后,如果未配置 IAM 角色或 IAM 凭据,将使用实例凭据,因为它们是 DefaultAWSCredentialsProviderChain 中的最后一项。

自定义 S3 凭据提供程序

可以通过将 Hadoop 配置属性 presto.s3.credentials-provider 设置为自定义 AWS 凭据提供程序实现的完全限定类名来配置自定义 S3 凭据提供程序。此类必须实现 AWSCredentialsProvider 接口,并提供一个带两个参数的构造函数,该构造函数采用 java.net.URI 和 Hadoop org.apache.hadoop.conf.Configuration 作为参数。自定义凭据提供程序可用于从 STS 提供临时凭据(使用 STSSessionCredentialsProvider)、基于 IAM 角色的凭据(使用 STSAssumeRoleSessionCredentialsProvider),或特定用例的凭据(例如,特定于存储桶/用户的凭据)。此 Hadoop 配置属性必须在由 hive.config.resources Hive 连接器属性引用的 Hadoop 配置文件中设置。

AWS 安全映射

Presto 支持 AWS Lake Formation 和 AWS S3 API 调用的灵活映射,允许为特定用户使用单独的凭据或 IAM 角色。

映射可以是两种类型:S3LAKEFORMATION

映射条目按配置文件中列出的顺序处理。更具体的映射应在不太具体的映射之前指定。可以通过不为列表中的最后一个条目包含任何匹配条件来设置默认配置。

当映射类型为 S3 时,每个映射条目都可以指定一个匹配条件。可用的匹配条件

  • user: 用于匹配用户名的正则表达式。例如:alice|bob

映射必须提供一个或多个配置设置

  • accessKeysecretKey: AWS 访问密钥和密钥。这会覆盖任何全局配置的凭据,例如访问密钥或实例凭据。

  • iamRole: 要使用的 IAM 角色。这会覆盖任何全局配置的 IAM 角色。

s3 的示例 JSON 配置文件

{
  "mappings": [
    {
      "user": "admin",
      "accessKey": "AKIAxxxaccess",
      "secretKey": "iXbXxxxsecret"
    },
    {
      "user": "analyst|scientist",
      "iamRole": "arn:aws:iam::123456789101:role/analyst_and_scientist_role"
    },
    {
      "iamRole": "arn:aws:iam::123456789101:role/default"
    }
  ]
}

当映射类型为 LAKEFORMATION 时,每个映射条目可以指定一个匹配条件。可用的匹配条件

  • user: 用于匹配用户名的正则表达式。例如:alice|bob

映射必须提供一个配置设置

  • iamRole: 要使用的 IAM 角色。这会覆盖任何全局配置的 IAM 角色。

lakeformation 的示例 JSON 配置文件

{
  "mappings": [
    {
      "user": "admin",
      "iamRole": "arn:aws:iam::123456789101:role/admin_role"
    },
    {
      "user": "analyst",
      "iamRole": "arn:aws:iam::123456789101:role/analyst_role"
    },
    {
      "iamRole": "arn:aws:iam::123456789101:role/default_role"
    }
  ]
}

属性名称

描述

hive.aws.security-mapping.type

AWS 安全映射类型。可能的值:S3 或 LAKEFORMATION

hive.aws.security-mapping.config-file

包含 AWS IAM 安全映射的 JSON 配置文件

hive.aws.security-mapping.refresh-period

AWS IAM 安全映射配置将刷新后的时间间隔

性能优化属性

以下性能优化属性会影响 Presto S3 文件系统与 S3 通信时使用的客户端的行为。大多数参数会影响与 AmazonS3Client 关联的 ClientConfiguration 对象上的设置。

属性名称

描述

默认值

hive.s3.max-error-retries

在 S3 客户端上设置的最大错误重试次数。

10

hive.s3.max-client-retries

最大重试读取尝试次数。

5

hive.s3.max-backoff-time

在与 S3 通信时使用指数回退,从 1 秒开始,直到达到此最大值。

10 分钟

hive.s3.max-retry-time

与 S3 通信重试的最大时间。

10 分钟

hive.s3.connect-timeout

TCP 连接超时。

5

hive.s3.socket-timeout

TCP 套接字读取超时。

5

hive.s3.max-connections

与 S3 的最大同时打开连接数。

500

hive.s3.multipart.min-file-size

在使用 S3 的多部分上传之前,文件的最小大小。

16 MB

hive.s3.multipart.min-part-size

多部分上传的最小部分大小。

5 MB

S3 数据加密

Presto 支持使用 S3 管理的密钥进行服务器端加密以及使用 Amazon KMS 或软件插件管理 AES 加密密钥进行客户端加密,来读取和写入 S3 中的加密数据。

使用 S3 服务器端加密(在 Amazon 文档中称为SSE-S3),S3 基础设施会处理所有加密和解密工作(除了对客户端的 SSL,假设您已将 hive.s3.ssl.enabled 设置为 true)。S3 还为您管理所有加密密钥。要启用此功能,请将 hive.s3.sse.enabled 设置为 true

使用 S3 客户端加密,S3 会存储加密数据,而加密密钥则在 S3 基础设施之外进行管理。数据由 Presto 加密和解密,而不是在 S3 基础设施中加密和解密。在这种情况下,可以利用 AWS KMS 或您自己的密钥管理系统来管理加密密钥。要使用 AWS KMS 进行密钥管理,请将 hive.s3.kms-key-id 设置为 KMS 密钥的 UUID。您的 AWS 凭据或 EC2 IAM 角色需要被授予使用给定密钥的权限。

要使用自定义加密密钥管理系统,请将 hive.s3.encryption-materials-provider 设置为实现 AWS Java SDK 的 EncryptionMaterialsProvider 接口的类的完全限定名称。此类必须通过类路径对 Hive Connector 可见,并且必须能够与您的自定义密钥管理系统通信。如果此类还实现了 Hadoop Java API 中的 org.apache.hadoop.conf.Configurable 接口,则在创建对象实例之后,但在要求其配置或检索任何加密密钥之前,将传递 Hadoop 配置。

S3SelectPushdown

S3SelectPushdown 能够将投影(SELECT)和谓词(WHERE)处理推送到 S3 Select。使用 S3SelectPushdown,Presto 仅从 S3 中检索所需的数据,而不是整个 S3 对象,从而减少了延迟和网络使用量。

S3 Select 是否适合我的工作负载?

S3SelectPushdown 的性能取决于查询过滤的数据量。过滤大量行应该会导致更好的性能。如果查询没有过滤任何数据,则推送可能不会增加任何额外价值,并且用户将因 S3 Select 请求而付费。因此,我们建议您使用和不使用 S3 Select 对您的工作负载进行基准测试,以查看是否适合您的工作负载。默认情况下,S3SelectPushdown 已禁用,您应该在适当的基准测试和成本分析之后在生产中启用它。有关 S3 Select 请求成本的更多信息,请参阅 Amazon S3 云存储定价

使用以下指南确定 S3 Select 是否适合您的工作负载

  • 您的查询过滤掉了超过一半的原始数据集。

  • 您的查询过滤器谓词使用 Presto 和 S3 Select 支持的数据类型的列。 TIMESTAMPREALDOUBLE 数据类型不受 S3 Select Pushdown 支持。我们建议对数值数据使用 decimal 数据类型。有关 S3 Select 支持的数据类型的更多信息,请参阅 数据类型文档

  • Amazon S3 和 Amazon EMR 集群之间的网络连接具有良好的传输速度和可用带宽。Amazon S3 Select 不压缩 HTTP 响应,因此压缩输入文件的响应大小可能会增加。

注意事项和限制

  • 仅支持存储为 CSV 格式的对象。对象可以是未压缩的,也可以选择使用 gzip 或 bzip2 压缩。

  • 不支持“AllowQuotedRecordDelimiters”属性。如果指定此属性,则查询失败。

  • 不支持使用客户提供的加密密钥 (SSE-C) 的 Amazon S3 服务器端加密和客户端加密。

  • S3 Select Pushdown 不能替代使用 ORC 和 Parquet 等列式或压缩文件格式。

启用 S3 Select Pushdown

您可以使用 s3_select_pushdown_enabled Hive 会话属性或使用 hive.s3select-pushdown.enabled 配置属性来启用 S3 Select Pushdown。会话属性将覆盖配置属性,允许您在每个查询的基础上启用或禁用它。不进行过滤的查询 (SELECT * FROM table) 不会推送到 S3 Select,因为它们会检索整个对象内容。

对于未压缩的文件,使用支持的格式和 SerDes,S3 Select 会并行扫描字节范围。扫描范围请求跨越推送到 S3 Select 的查询片段的内部 Hive 分片的字节范围。并行化由现有的 hive.max-split-size 属性控制。

了解和调整最大连接数

Presto 可以使用其本机 S3 文件系统或 EMRFS。使用本机 FS 时,最大连接数通过 hive.s3.max-connections 配置属性进行配置。使用 EMRFS 时,最大连接数通过 fs.s3.maxConnections Hadoop 配置属性进行配置。

S3 Select Pushdown 在访问 Amazon S3 进行谓词操作时会绕过文件系统。在这种情况下,hive.s3select-pushdown.max-connections 的值决定了工作节点允许进行这些操作的最大客户端连接数。

如果您的工作负载遇到错误连接池等待连接超时,请增加 hive.s3select-pushdown.max-connections 和您使用的文件系统的最大连接数配置的值。

Alluxio 配置

Presto 可以读取和写入存储在 Alluxio 数据编排系统 Alluxio 中的表,利用 Alluxio 的分布式块级读/写缓存功能。表必须在 Hive 元存储中使用 alluxio:// 位置前缀创建(有关详细信息和示例,请参阅 使用 Alluxio 运行 Apache Hive)。然后,Presto 查询将透明地从各种不同的存储系统(包括 HDFS 和 S3)检索和缓存文件或对象。

Alluxio 客户端配置

要在 Presto 上配置 Alluxio 客户端属性,请将 Alluxio 配置目录 (${ALLUXIO_HOME}/conf) 附加到 Presto JVM 类路径,以便可以将 Alluxio 属性文件 alluxio-site.properties 加载为资源。更新 Presto JVM 配置 文件 etc/jvm.config 以包含以下内容

-Xbootclasspath/a:<path-to-alluxio-conf>

这种方法的优点是所有 Alluxio 属性都在单个 alluxio-site.properties 文件中设置。有关详细信息,请参阅 自定义 Alluxio 用户属性

或者,将 Alluxio 配置属性添加到 Hadoop 配置文件 (core-site.xmlhdfs-site.xml),并通过 hive.config.resources 连接器属性配置 Hive 连接器以使用 Hadoop 配置文件

使用 Presto 部署 Alluxio

为了在 Alluxio 上运行 Presto 时获得最佳性能,建议将 Presto 工作节点与 Alluxio 工作节点并置。这允许读取和写入绕过网络。有关更多详细信息,请参阅 Presto 与 Alluxio 的性能优化技巧

Alluxio 目录服务

Presto 与 Alluxio 交互的另一种方法是通过 Alluxio 目录服务。使用 Alluxio 目录服务的主要优势是简化 Alluxio 与 Presto 的部署,以及启用透明缓存和转换等架构感知优化。目前,目录服务支持只读工作负载。

Alluxio 目录服务是一个元数据存储,可以缓存来自不同底层元数据存储的信息。它目前支持 Hive 元数据存储作为底层元数据存储。为了让 Alluxio 目录管理其他现有元数据存储的元数据,这些其他元数据存储必须“附加”到 Alluxio 目录。要将现有 Hive 元数据存储附加到 Alluxio 目录,只需使用 Alluxio CLI attachdb 命令。需要提供适当的 Hive 元数据存储位置和 Hive 数据库名称。

./bin/alluxio table attachdb hive thrift://HOSTNAME:9083 hive_db_name

一旦元数据存储被附加,Alluxio 目录就可以管理并向 Presto 提供信息。要为 Alluxio 目录服务配置 Hive 连接器,只需将连接器配置为使用 Alluxio 元数据存储类型,并提供 Alluxio 集群的位置。例如,你的 etc/catalog/catalog_alluxio.properties 将包含以下内容(将 Alluxio 地址替换为适当的位置)

connector.name=hive-hadoop2
hive.metastore=alluxio
hive.metastore.alluxio.master.address=HOSTNAME:PORT

现在,Presto 查询可以利用 Alluxio 目录服务,例如透明缓存和透明转换,而无需对现有 Hive 元数据存储部署进行任何修改。

表统计信息

Hive 连接器会在 INSERTCREATE TABLE AS 操作中自动收集基本统计信息(numFiles', ``numRowsrawDataSizetotalSize)。

Hive 连接器还可以收集列级统计信息

列类型

可收集统计信息

TINYINT

空值数量、不同值数量、最小/最大值

SMALLINT

空值数量、不同值数量、最小/最大值

INTEGER

空值数量、不同值数量、最小/最大值

BIGINT

空值数量、不同值数量、最小/最大值

DOUBLE

空值数量、不同值数量、最小/最大值

REAL

空值数量、不同值数量、最小/最大值

DECIMAL

空值数量、不同值数量、最小/最大值

DATE

空值数量、不同值数量、最小/最大值

TIMESTAMP

空值数量、不同值数量、最小/最大值

VARCHAR

空值数量、不同值数量

CHAR

空值数量、不同值数量

VARBINARY

空值数量

BOOLEAN

空值数量、真/假值数量

写入时自动收集列级统计信息由 collect_column_statistics_on_write 目录会话属性控制。

收集表和列统计信息

Hive 连接器支持通过 ANALYZE 语句收集表和分区统计信息。在分析分区表时,可以通过可选的 partitions 属性指定要分析的分区,该属性是一个数组,包含分区键的值,按它们在表模式中声明的顺序排列

ANALYZE hive.sales WITH (
    partitions = ARRAY[
        ARRAY['partition1_value1', 'partition1_value2'],
        ARRAY['partition2_value1', 'partition2_value2']]);

此查询将为 2 个分区收集统计信息,其键为

  • partition1_value1, partition1_value2

  • partition2_value1, partition2_value2

快速统计信息

Hive 连接器可以通过检查文件或表元数据为缺少统计信息的分区构建基本统计信息。例如,Parquet 页脚可用于推断行数、空值数量和最小/最大值。这些“快速”统计信息有助于查询规划,并作为尚未对其运行 ANALYZE 的分区的临时统计信息来源。

以下属性可用于控制如何构建这些快速统计信息

属性名称

描述

默认值

hive.quick-stats.enabled

启用通过快速统计信息提供程序收集统计信息。也可以通过 quick_stats_enabled 会话属性切换。

false

hive.quick-stats.max-concurrent-calls

快速统计信息是针对多个分区同时构建的。此属性设置可进行的并发构建的最大数量。

100

hive.quick-stats.inline-build-timeout

启动为分区构建快速统计信息的查询在超时并返回空统计信息之前应等待的持续时间。如果希望快速统计信息仅在后台构建,而不是阻塞查询规划,请将其设置为 0s。也可以通过 quick_stats_inline_build_timeout 会话属性切换。

60s

hive.quick-stats.background-build-timeout

如果查询观察到另一个查询正在为分区构建快速统计信息,则这是它等待这些统计信息构建完成后返回空统计信息的时间。如果只想让一个查询等待快速统计信息构建(针对给定分区),请将其设置为 0s

0s

hive.quick-stats.cache-expiry

在快速统计信息内存中缓存中保留统计信息的时间。

24h

hive.quick-stats.reaper-expiry

如果针对分区的快速统计信息构建卡住了(例如,由于长时间运行的 IO 操作),则清理程序作业将终止任何后台构建线程,以便可以重新触发新的获取。此属性控制后台构建线程启动后清理程序执行终止的时间。

5m

hive.quick-stats.parquet.max-concurrent-calls

多个 Parquet 文件页脚是同时读取和处理的。此属性设置可进行的并发调用次数的最大值。

500

hive.quick-stats.parquet.file-metadata-fetch-timeout

Parquet 快速统计信息构建器在失败并返回空统计信息之前等待的持续时间。

60s

模式演变

Hive 允许表中的分区具有与表不同的模式。当表的分区已存在(使用原始列类型)后,表的列类型发生更改时,就会出现这种情况。Hive 连接器支持这一点,允许与 Hive 相同的转换

  • varchartinyintsmallintintegerbigint 之间相互转换

  • realdouble

  • 整数的扩展转换,例如 tinyintsmallint

除了上述转换之外,Hive 连接器在处理 Parquet 文件格式时还支持以下转换

  • integerbigintrealdouble

  • bigintrealdouble

任何转换失败都会导致空值,这与 Hive 的行为相同。例如,将字符串 'foo' 转换为数字,或将字符串 '1234' 转换为 tinyint(其最大值为 127)。

Avro 模式演变

Presto 支持查询和操作具有 Avro 存储格式的 Hive 表,该格式的模式基于 Avro 模式文件/字面量设置。也可以在 Presto 中创建表,这些表从位于本地或远程 HDFS/Web 服务器上的有效 Avro 模式文件中推断模式。

要指定应使用 Avro 模式来解释表的 data,必须使用 avro_schema_url 表属性。该模式可以远程放置在 HDFS 中(例如,avro_schema_url = 'hdfs://user/avro/schema/avro_data.avsc')、S3 中(例如,avro_schema_url = 's3n:///schema_bucket/schema/avro_data.avsc')、Web 服务器中(例如,avro_schema_url = 'http://example.org/schema/avro_data.avsc')以及本地文件系统中。此模式所在的 URL 必须可以从 Hive 元数据存储和 Presto 协调器/工作节点访问。

在 Presto 中使用 avro_schema_url 创建的表的行为与设置了 avro.schema.urlavro.schema.literal 的 Hive 表相同。

示例

CREATE TABLE hive.avro.avro_data (
   id bigint
 )
WITH (
   format = 'AVRO',
   avro_schema_url = '/usr/local/avro_data.avsc'
)

如果指定了 avro_schema_url,则 DDL 中列出的列(上面示例中的 id)将被忽略。表模式将与 Avro 模式文件中的模式匹配。在任何读取操作之前,都会访问 Avro 模式,因此查询结果会反映模式中的任何更改。因此,Presto 利用了 Avro 的向后兼容功能。

如果表在 Avro 模式文件中的模式发生更改,则新模式仍然可以用于读取旧 data。新添加/重命名的字段必须在 Avro 模式文件中具有默认值。

模式演变行为如下

  • 在新模式中添加的列:使用旧模式创建的 data 在表使用新模式时将生成默认值。

  • 在新模式中删除的列:使用旧模式创建的 data 将不再输出已删除列中的 data。

  • 在新模式中重命名的列:这等效于删除列并添加新列,使用旧模式创建的 data 在表使用新模式时将生成默认值。

  • 在新模式中更改列类型:如果 Avro 或 Hive 连接器支持类型强制转换,则会发生转换。对于不兼容类型,将抛出错误。

限制

设置 avro_schema_url 时,不支持以下操作

  • CREATE TABLE AS 不受支持。

  • CREATE TABLE 中不支持使用分区(partitioned_by)或桶(bucketed_by)列。

  • ALTER TABLE 命令(修改列)不受支持。

Parquet 写入程序版本

Presto 现在支持 Hive 目录的 Parquet 写入程序版本 V1 和 V2。可以使用会话属性 parquet_writer_version 和配置属性 hive.parquet.writer.version 切换它。这些属性的有效值为 PARQUET_1_0PARQUET_2_0。默认值为 PARQUET_1_0

过程

使用 CALL 语句执行 data 操作或管理任务。过程必须包含限定的目录名称,如果你的 Hive 目录名为 web

CALL web.system.example_procedure()

以下过程可用

  • system.create_empty_partition(schema_name, table_name, partition_columns, partition_values)

    在指定的表中创建空分区。

  • system.sync_partition_metadata(schema_name, table_name, mode, case_sensitive)

    检查并更新元存储中的分区列表。 有三种模式可用

    • ADD : 添加文件系统中存在但在元存储中不存在的任何分区。

    • DROP: 删除元存储中存在但在文件系统中不存在的任何分区。

    • FULL: 执行 ADDDROP 两种操作。

    case_sensitive 参数是可选的。 默认值为 true,与 Hive 的 MSCK REPAIR TABLE 行为兼容,该行为期望文件系统路径中的分区列名使用小写(例如 col_x=SomeValue)。 除非将参数设置为 false,否则文件系统上不符合此约定的分区将被忽略。

  • system.invalidate_directory_list_cache()

    刷新完整的目录列表缓存。

  • system.invalidate_directory_list_cache(directory_path)

    使指定目录路径的目录列表缓存失效。

额外的隐藏列

Hive 连接器在 Hive 表中公开额外的隐藏元数据列。 将这些列作为查询的一部分查询,就像表的任何其他列一样。

  • $path : 给定行数据的路径

  • $file_size : 给定行的文件大小 (int64_t)

  • $file_modified_time : 给定行的上次文件修改时间 (int64_t),以 1970 年 1 月 1 日协调世界时 (UTC) 之后的毫秒数表示

如何使元存储缓存失效?

Hive 连接器通过 JMX 公开了一个过程(com.facebook.presto.hive.metastore.CachingHiveMetastore#flushCache)来使元存储缓存失效。 您可以通过 jconsole 或 jmxterm 连接调用此过程来使元存储缓存失效。

这在 Hive 元存储在 Presto 之外更新,并且您希望立即使更改对 Presto 可见时非常有用。

目前,此过程会刷新所有架构中所有表的缓存。 这是一个已知的限制,将来会得到增强。

如何使目录列表缓存失效?

Hive 连接器通过 JMX 公开了一个过程(com.facebook.presto.hive.HiveDirectoryLister#flushCache)来使目录列表缓存失效。 您可以通过 jconsole 或 jmxterm 连接调用此过程来使目录列表缓存失效。

这在缓存目录路径中的文件添加或删除,并且您希望立即使更改对 Presto 可见时非常有用。

目前,此过程会刷新所有缓存条目。 这是一个已知的限制,将来会得到增强。

示例

Hive 连接器支持查询和操作 Hive 表和架构(数据库)。 虽然一些不常见的操作需要直接使用 Hive 执行,但大多数操作可以使用 Presto 执行。

创建架构

创建一个名为 web 的新 Hive 架构,该架构将在名为 my-bucket 的 S3 存储桶中存储表

CREATE SCHEMA hive.web
WITH (location = 's3://my-bucket/')

创建一个托管表

web 架构中创建一个名为 page_views 的新 Hive 表,该表使用 ORC 文件格式存储,按日期和国家/地区分区,并按用户将数据划分为 50 个桶(注意 Hive 要求分区列是表中的最后几列)

CREATE TABLE hive.web.page_views (
  view_time timestamp,
  user_id bigint,
  page_url varchar,
  ds date,
  country varchar
)
WITH (
  format = 'ORC',
  partitioned_by = ARRAY['ds', 'country'],
  bucketed_by = ARRAY['user_id'],
  bucket_count = 50
)

删除分区

page_views 表中删除分区

DELETE FROM hive.web.page_views
WHERE ds = DATE '2016-08-09'
  AND country = 'US'

添加空分区

page_views 表添加空分区

CALL system.create_empty_partition(
    schema_name => 'web',
    table_name => 'page_views',
    partition_columns => ARRAY['ds', 'country'],
    partition_values => ARRAY['2016-08-09', 'US']);

查询表

查询 page_views

SELECT * FROM hive.web.page_views

列出分区

列出 page_views 表的分区

SELECT * FROM hive.web."page_views$partitions"

创建一个外部表

创建一个名为 request_logs 的外部 Hive 表,该表指向 S3 中的现有数据

CREATE TABLE hive.web.request_logs (
  request_time timestamp,
  url varchar,
  ip varchar,
  user_agent varchar
)
WITH (
  format = 'TEXTFILE',
  external_location = 's3://my-bucket/data/logs/'
)

删除外部表

删除外部表 request_logs。 这只会删除表的元数据。 引用的数据目录不会被删除

DROP TABLE hive.web.request_logs

删除架构

删除架构

DROP SCHEMA hive.web

Hive 连接器限制

DELETE 仅在 WHERE 子句与整个分区匹配时才受支持。