添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
English
中文 English

Hive连接器

概述

Hive连接器支持查询存储在Hive数据仓库中的数据。Hive由三个部分组成:

  • 存储在HDFS或Amazon S3中的不同格式的数据文件。
  • 有关数据文件如何映射到模式和表的元数据。该元数据存储在MySQL等数据库中,通过Hive元存储服务访问。
  • 一种称为HiveQL的查询语言。这种查询语言在分布式计算框架(如MapReduce或Tez)上执行。

openLooKeng只使用前两个部分:数据和元数据。不使用HiveQL或Hive的任何部分执行环境。

支持的文件类型

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

  • ORC
  • Parquet
  • Avro
  • RCFile
  • SequenceFile
  • JSON
  • 文本

为了在使用Hive 3.x时能够对Avro表和CSV文件实现一级支持,需要在Hive元存储配置文件 hive-site.xml 中添加如下属性定义:

<property>
     <!-- https://community.hortonworks.com/content/supportkb/247055/errorjavalangunsupportedoperationexception-storage.html -->
     <name>metastore.storage.schema.reader.impl</name>
     <value>org.apache.hadoop.hive.metastore.SerDeStorageSchemaReader</value>
 </property>

配置

Hive连接器支持Apache Hadoop 2.x及其衍生发行版,包括Cloudera CDH 5和Hortonworks Data Platform (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 ,openLooKeng将使用配置的连接器创建一个名为 sales 的目录。

HDFS配置

对于基本设置,openLooKeng自动配置HDFS客户端,不需要任何配置文件。在某些情况下,例如使用联邦HDFS或NameNode高可用性时,需要指定额外的HDFS客户端选项,以便访问HDFS集群。要指定选项,添加 hive.config.resources 属性来引用HDFS配置文件:

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

如果设置需要,只指定附加的配置文件。同时建议减少配置文件,使其具有所需的最小属性集,因为附加属性可能导致问题。

所有openLooKeng节点上必须存在配置文件。如果你正在引用现有的Hadoop配置文件,请确保将其复制到任何没有运行Hadoop的openLooKeng节点。

HDFS用户名和权限

在openLooKeng中对Hive表执行任何 CREATE TABLE CREATE TABLE AS 语句之前,需要确保openLooKeng访问HDFS的用户能够访问Hive的仓库目录。Hive的仓库目录由 hive-site.xml 中的配置变量 hive.metastore.warehouse.dir 指定,默认值为 /user/hive/warehouse

在不使用带HDFS的Kerberos时,openLooKeng会使用openLooKeng进程的操作系统用户来访问HDFS。例如,如果openLooKeng作为 nobody 运行,则openLooKeng将作为 nobody 访问HDFS。可以通过在openLooKeng JVM配置 中设置 HADOOP_USER_NAME 系统属性来覆盖此用户名,用适当的用户名替换 hdfs_user

-DHADOOP_USER_NAME=hdfs_user

hive 用户通常可行,因为Hive通常随 hive 用户启动,并且该用户可以访问Hive仓库。

无论何时修改openLooKeng访问HDFS的用户时,请移除HDFS上的 /tmp/openlookeng-* /tmp/presto-* /tmp/hetu-* ,因为新用户可能无法访问现有的临时目录。

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

HDFS和Hive元存储都支持Kerberos认证。但是,目前还不支持通过票据缓存进行Kerberos身份验证。

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

Hive配置属性

属性名称 说明 默认值
hive.metastore Hive元存储类型 thrift
hive.config.resources 以逗号分隔的可选HDFS配置文件列表。这些文件必须存在于运行openLooKeng的机器上。该属性仅在访问HDFS绝对必要的情况下指定。示例: /etc/hdfs-site.xml
hive.recursive-directories 允许从表或分区位置的子目录读取数据。如果禁用,子目录将被忽略。这相当于Hive中的 hive.mapred.supports.subdirectories 属性。
hive.storage-format 创建新表时使用的默认文件格式。 ORC
hive.compression-codec 写入文件时使用的压缩编解码器。 GZIP
hive.force-local-scheduling 强制将分片调度到与分片数据的Hadoop DataNode进程同一节点。 这对于openLooKeng与每个DataNode并置的安装非常有用。 false
hive.respect-table-format 应该使用现有的表格式还是默认的openLooKeng格式写入新的分区? true
hive.immutable-partitions 新数据是否可以插入到现有分区中? false
hive.create-empty-bucket-files 对于没有数据的桶,是否应该创建空文件? false
hive.max-partitions-per-writers 每个写入进程最大分区数。 100
hive.max-partitions-per-scan 单表扫描最大分区数。 100000
hive.hdfs.authentication.type HDFS身份验证类型。取值为 NONE KERBEROS NONE
hive.hdfs.impersonation.enabled 启用HDFS端用户模拟。 false
hive.hdfs.presto.principal openLooKeng在连接到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 启用写入时自动收集列级统计信息。详见 表统计信息 true
hive.s3select-pushdown.enabled 允许向AWS S3 Select服务的查询下推。 false
hive.s3select-pushdown.max-connections S3 Select下推 同时打开到S3的最大连接数。 500
hive.orc.use-column-names 为了支持alter表drop列,建议在Hive属性中添加 hive.orc.use-column-names=true ,否则drop列可能无法正常工作。 false
hive.orc-predicate-pushdown-enabled 在读取ORC文件时启用算子下推(predicates pushdown)处理。 false
hive.orc.time-zone 为未声明时区的旧ORC文件设置默认时区。 JVM默认值
hive.parquet.time-zone 将时间戳值调整到特定的时区。对于Hive 3.1+,该值应设置为UTC。 JVM默认值
hive.rcfile.time-zone 将二进制编码的时间戳值调整到特定的时区。对于Hive 3.1+,该值应设置为UTC。 JVM默认值
hive.vacuum-service-threads 清空服务中运行的线程数。 2
hive.auto-vacuum-enabled 对Hive表启用自动清空功能。要在引擎侧启用自动清空,请在协调节点的config.properties中添加 auto-vacuum.enabled=true false
hive.vacuum-delta-num-threshold 允许不压缩的增量目录的最大数量。最小值为2。 10
hive.vacuum-delta-percent-threshold 允许不压缩的增量目录的最大百分比。值应在0.1到1.0之间。 0.1
hive.vacuum-cleanup-recheck-interval 清空清理任务重新提交的间隔。最小值为5分钟 5 Minutes
hive.vacuum-collector-interval 清空回收器任务重新提交的间隔。 5 Minutes
hive.max-splits-to-group 可分组的最大拆分数。如果值为1,则不分组。最小值为1。小的拆分越多,创建的驱动越多,因此需要更多内存、调度、上下文切换,这会影响读取性能。将小拆分分组在一起可以减少拆分和创建驱动的数量,因此需要的资源较少,从而提高性能。 1
hive.metastore-client-service-threads 元存储客户端与Hive元存储通信的并行线程数。 4
hive.worker-metastore-cache-enabled 在工作节点上也开启对Hive元存储的缓存。 false
hive.metastore-write-batch-size 每个请求中发送到元存储的分区数。 8
hive.metastore-cache-ttl 表和分区元数据的元存储缓存淘汰时间。 0s
hive.metastore-refresh-interval 从Hive元存储刷新表和分区元数据的元存储缓存条目的时间。 1s
hive.metastore-db-cache-ttl 数据库、角色、配置、表和视图列表对象的元存储缓存淘汰时间。 0s
hive.metastore-db-refresh-interval 从Hive元存储中刷新数据库、表列表、视图列表、角色对象的元存储缓存条目的时间。 1s

Hive Thrift 元存储配置属性说明

属性名称 说明
hive.metastore.uri 使用Thrift协议连接Hive元存储的URI。如果提供了多个URI,则默认使用第一个URI,其余URI为回退元存储。该属性必选。示例: thrift://192.0.2.3:9083 thrift://192.0.2.3:9083,thrift://192.0.2.4:9083
hive.metastore.username openLooKeng用于访问Hive metastore的用户名。
hive.metastore.authentication.type Hive元存储身份验证类型。取值为 NONE KERBEROS (默认为 NONE )。
hive.metastore.thrift.impersonation.enabled 启用Hive元存储用户模拟。
hive.metastore.thrift.client.ssl.enabled 连接元存储时使用SSL。默认为 false 。当为true时,表示需要keystore或truststore其中一个。keystore/truststore的路径和密码需要在 jvm.config 中设置。密钥列表如下: -Djavax.net.ssl.keystoreType= e.g. jks -Djavax.net.ssl.keyStore= -Djavax.net.ssl.keyStorePassword= -Djavax.net.ssl.trustStore= -Djavax.net.ssl.trustStorePassword=
hive.metastore.service.principal Hive元存储服务的Kerberos主体。
hive.metastore.client.principal openLooKeng在连接到Hive元存储服务时将使用的Kerberos主体。
hive.metastore.client.keytab Hive元存储客户端keytab位置。
hive.metastore.thrift.is-role-name-case-sensitive 角色名是否区分大小写,默认值为false。
hive.metastore.krb5.conf.path Kerberos配置文件位置。

AWS Glue目录配置属性

属性名称 说明
hive.metastore.glue.region Glue目录的AWS区域名称。当不在EC2中运行时,或者当目录位于不同区域时,这都是必需的。示例: us-east-1
hive.metastore.glue.pin-client-to-current-region Pin Glue请求与openLooKeng运行所在的EC2实例具有相同的区域(默认为 false )。
hive.metastore.glue.max-connections Glue最大并发连接数(默认为 5 )。
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.iam-role 连接Glue目录时,IAM角色的ARN。

Amazon S3配置

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

openLooKeng对URI前缀 s3:// s3n:// s3a:// 使用自己的S3文件系统。

S3配置属性

属性名称 说明
hive.s3.use-instance-credentials 使用EC2元数据服务检索API凭证(默认为 true )。这与EC2中的IAM角色一起使用。
hive.s3.aws-access-key 默认使用的AWS访问密钥。
hive.s3.aws-secret-key 默认使用的AWS密钥。
hive.s3.iam-role 使用的IAM角色。
hive.s3.endpoint S3存储端点服务器。可用于对接兼容S3的存储系统而不是AWS。当使用v4签名时,建议将该属性设置为AWS区域特定端点(例如 http[s]://.s3-.amazonaws.com )。
hive.s3.signer-type 为S3兼容存储指定不同的签名者类型。示例:对于v2签名者类型为 S3SignerType
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 Pin S3请求与openLooKeng运行所在的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时可以使用的Canned ACL(默认为 Private )。
hive.s3.skip-glacier-objects 忽略Glacier对象,而不是使查询失败。这将跳过可能属于表或分区的数据。默认为 false

S3凭据

如果使用EMR或其他工具在Amazon EC2上运行openLooKeng,强烈建议将 hive.s3.use-instance-credentials 设置为 true 并使用IAM Rolesfor EC2来控制对S3的访问。如果是这种情况,则需要为EC2实例分配一个IAM角色,以授予对存储在希望使用的S3桶中的数据的适当访问权限。还可以通过 hive.s3.iam-role 配置一个IAM角色,访问任何S3桶时都使用该角色。这比在 hive.s3.aws-access-key hive.s3.aws-secret-key 设置中设置AWS访问和密钥要明确得多,而且还允许EC2定期自动轮换凭据,而无需进行任何额外工作。

自定义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配置文件中进行设置。

调优属性

当与S3通信时,以下调优属性会影响openLooKeng S3文件系统所使用客户端的行为。这些参数中的大多数会影响与 AmazonS3Client 关联的 ClientConfiguration 对象上的设置。

属性名称 说明 默认值
hive.s3.max-error-retries S3客户端上设置的最大错误重试次数。 10
hive.s3.max-client-retries 最大读重试次数。 5
hive.s3.max-backoff-time 在与S3通信时,使用从1秒开始到此最大值的指数退避。 10 minutes
hive.s3.max-retry-time 重试与S3通信的最大时间。 10 minutes
hive.s3.connect-timeout TCP连接超时。 5 seconds
hive.s3.socket-timeout TCP套接字读取超时。 5 seconds
hive.s3.max-connections 同时连接到S3的最大开放连接数。 500
hive.s3.multipart.min-file-size 使用分段上传到S3之前的最小文件大小。 16 MB
hive.s3.multipart.min-part-size 分段上传任务的最小段大小。 5 MB

S3数据加密

openLooKeng支持使用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基础架构之外进行管理。数据加解密由openLooKeng完成,不在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连接器进行访问,并且必须能够与自定义密钥管理系统进行通信。如果该类也实现了来自Hadoop Java API的 org.apache.hadoop.conf.Configurable 接口,那么Hadoop配置将在对象实例创建之后,请求提供或检索任何加密密钥之前传入。

S3 Select下推

S3 Select下推功能,可以将下推投影(SELECT)和谓词(WHERE)处理下推到 S3 Select 。使用S3 Select下推,openLooKeng只从S3中而不是从所有S3对象检索所需的数据,从而降低了延迟和网络利用率。

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

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

使用以下准则来确定S3 Select是否适合工作负载:

  • 查询过滤掉了超过一半的原始数据集。
  • 查询过滤谓词使用的列具有openLooKeng和S3 Select支持的数据类型。S3 Select下推不支持 TIMESTAMP REAL DOUBLE 数据类型。建议使用十进制数据类型来表示数值数据。有关S3选择所支持的数据类型的详细信息,见 数据类型文档
  • Amazon S3和Amazon EMR集群之间的网络连接具有良好的传输速度和可用带宽。Amazon S3 Select不压缩HTTP响应,因此对于压缩的输入文件,响应大小可能会增加。

注意事项和限制

  • 只支持CSV格式存储的对象。对象可以是未压缩的,也可以是用gzip或bzip2压缩的。
  • 不支持“AllowQuotedRecordDelimiters”属性。如果指定了此属性,则查询失败。
  • 不支持使用客户提供的加密密钥(SSE-C)进行Amazon S3服务器端加密和客户端加密。
  • S3 Select下推不能替代ORC、Parquet等列存或压缩文件格式。

开启S3 Select下推

可以通过 s3_select_pushdown_enabled Hive会话属性或 hive.s3select-pushdown.enabled 配置属性启用S3 Select下推。会话属性将重写配置属性,允许按查询启用或禁用。

了解和调优最大连接数

openLooKeng可以使用其原生的S3文件系统或EMRFS。使用原生FS时,最大连接是通过 hive.s3.max-connections 配置属性配置的。当使用EMRFS时,最大连接是通过 fs.s3.maxConnections Hadoop配置属性配置的。

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

如果工作负载遇到错误“ 等待池中连接超时 ”,增加 hive.s3select-pushdown.max-connections 以及正在使用的文件系统的最大连接配置的值。

Google云存储配置

Hive连接器可以通过 gs:// URI前缀访问存储在GCS中的数据。请参阅 hive-gcs-tutorial 以获取详细说明。

GCS配置属性

属性名称 说明
hive.gcs.json-key-file-path 用来与Google云存储进行身份验证的JSON密钥文件。
hive.gcs.use-access-token 使用客户端提供的OAuth令牌访问Google云存储。这与全局JSON密钥文件互斥。

ORC缓存配置

Hive连接器缓存ORC文件数据,以提供更好的性能并减少查询时延。工作节点将数据缓存在本地内存中。当启用ORC缓存时,工作节点会缓存ORC文件的尾部信息,stripe的页脚(stripe-footer)信息, 行索引(row-index), 布隆过滤(bloom-filter)信息。然而, 工作节点只会缓存特定的数据行,这些行应该与 cache table 语句中谓语词相匹配。

ORC缓存属性

属性名称 说明 默认值
hive.orc.file-tail.cache.enabled 启用ORC文件尾缓存 false
hive.orc.file-tail.cache.ttl ORC文件尾缓存TTL 4 hours
hive.orc.file-tail.cache.limit ORC文件尾缓存最大条目数 50,000
hive.orc.stripe-footer.cache.enabled 启用ORC分条页脚缓存 false
hive.orc.stripe-footer.cache.ttl ORC分条页脚缓存的TTL 4 hours
hive.orc.stripe-footer.cache.limit ORC分条页脚缓存最大条目数 250,000
hive.orc.row-index.cache.enabled 启用ORC行索引缓存 false
hive.orc.row-index.cache.ttl ORC行索引缓存TTL 4 hours
hive.orc.row-index.cache.limit ORC行索引缓存最大条目数 250,000
hive.orc.bloom-filters.cache.enabled 启用ORC布隆过滤器缓存 false
hive.orc.bloom-filters.cache.ttl ORC布隆过滤器缓存TTL 4 hours
hive.orc.bloom-filters.cache.limit ORC布隆过滤器缓存最大条目数 250,000
hive.orc.row-data.block.cache.enabled 启用ORC行组块缓存 false
hive.orc.row-data.block.cache.ttl ORC行组缓存TTL 4 hours
hive.orc.row-data.block.cache.max.weight ORC行组缓存最大权重。 20 GB

TTL: 是指自最后一次读写cache到现在的时间间隔。如后文所讲, 在写cache阶段会周期性执行时间过期验证,在读cache的时也会触发过期验证。

表统计信息

Hive连接器在写入数据时,总是收集基本的统计信息( numFiles numRows rawDataSize totalSize ),默认还会收集列级统计信息:

列类型 可收集的统计数据
TINYINT Null值个数,非重复值个数,最小值/最大值
SMALLINT Null值个数,非重复值个数,最小值/最大值
INTEGER Null值个数,非重复值个数,最小值/最大值
BIGINT Null值个数,非重复值个数,最小值/最大值
DOUBLE Null值个数,非重复值个数,最小值/最大值
REAL Null值个数,非重复值个数,最小值/最大值
DECIMAL Null值个数,非重复值个数,最小值/最大值
DATE Null值个数,非重复值个数,最小值/最大值
TIMESTAMP Null值个数,非重复值个数,最小值/最大值
VARCHAR Null值数,非重复值数
CHAR Null值数,非重复值数
VARBINARY Null值数
BOOLEAN Null值个数,true/false值数

更新表和分区统计信息

如果查询较复杂且包括联接大型数据集,那么在表/分区上运行 /sql/analyze 可能会通过收集有关数据的统计信息来提高查询性能。

在分析分区表时,可以通过可选 partitions 属性指定要分析的分区,该属性是一个数组,包含分区键的值,其顺序与在表模式中所声明的顺序一致:

ANALYZE table_name WITH (
    partitions = ARRAY[
        ARRAY['p1_value1', 'p1_value2'],
        ARRAY['p2_value1', 'p2_value2']])

此查询将收集具有键 p1_value1, p1_value2 p2_value1, p2_value2 的两个分区的统计信息。

Hive ACID支持

openLooKeng支持Hive事务表上的ACID事务(INSERT,UPDATE,DELETE)。

使用Hive连接器创建事务表

要支持ACID事务,必须满足以下前提条件:

  1. 创建表应启用了“事务性”属性。
  2. 格式为ORC。参见 限制

示例:

CREATE TABLE hive_acid_table (
    id int,
    name string )
  WITH (format='ORC', transactional=true);

对事务表执行INSERT

对于事务和非事务表,插入操作在最终用户的角度来看保持不变。

示例:

INSERT INTO hive_acid_table
  VALUES
     (1, 'foo'),
     (2, 'bar');

对事务表执行UPDATE

对事务表的UPDATE操作允许用户更新与WHERE子句匹配的特定行的列。

示例:

UPDATE hive_acid_table
  SET name='john'
  WHERE id=2;

上述示例将值为 2 的列 id 的行的列 name 的值更新为 john

UPDATE前的SELECT结果:

lk:default> SELECT * FROM hive_acid_table;
id | name
----+------
  2 | bar
  1 | foo
(2 rows)

UPDATE后的SELECT结果

lk:default> SELECT * FROM hive_acid_table;
 id | name
----+------
  2 | john
  1 | foo
(2 rows)

对事务表执行DELETE

事务表的DELETE操作允许用户更新与WHERE子句匹配的特定行的列。

示例:

DELETE FROM hive_acid_table
  WHERE id=2;

以上示例删除了值为 2 的列 id 的行。

DELETE前的SELECT结果:

lk:default> SELECT * FROM hive_acid_table;
 id | name
----+------
  2 | john
  1 | foo
(2 rows)

DELETE后的SELECT结果:

lk:default> SELECT * FROM hive_acid_table;
 id | name
----+------
  1 | foo
(1 row)

对事务表执行VACUUM

Hive将所有事务(INSERT/UPDATE/DELETE)保存在单独的delta目录中,以进行簿记。DELETE事务并不物理删除存储数据中的旧行,而是在新文件中将其标记为已删除。UPDATE使用分片更新机制更新数据。由于这些原因,对表的读操作需要读取许多文件,这增加了额外的开销。所有这些增量文件都需要合并,以获得合并后的数据,从而加快处理速度。openLooKeng中的VACUUM操作负责合并这些增量文件。

VACUUM操作在Hive中转换为 compaction 。在Hive中有两种类型的压缩, Major Minor

VACUUM和Hive compaction的映射关系如下:

  • VACUUM FULL 转换为Major compaction。

  • VACUUM 转换为Minor compaction。

VACUUM

VACUUM TABLE hive_acid_table;

上述操作触发对 hive_acid_table 的VACUUM操作,将合并所有delta目录到单个delta目录。一旦操作达到RUNNING状态,它将继续异步运行,解除客户机的阻塞。


说明: 目前没有命令来获取异步VACUUM的结果,但是可以从UI监视。


VACUUM FULL

Full Vacuum合并delta目录中的所有事务,并创建只包含最终结果的 base 目录。 该操作将永久删除已删除的行。因此,在读取期间,总的数据读取将非常少,因此提高了性能。

VACUUM TABLE hive_acid_table
  FULL;

上述操作触发对 hive_acid_table 的VACUUM FULL,一旦操作到达RUNNING状态,将继续异步运行,解除客户机的阻塞。

对分区表的VACUUM操作

如果表已分区,那么VACUUM操作可以单独对特定的分区进行操作,而不是对表的所有分区一起操作。

示例:创建分区表并INSERT数据:

CREATE TABLE hive_acid_table_partitioned (
    id int,
    name string,
    class int) 
WITH (format='ORC', transactional=true, partitioned_by=ARRAY['class']);
INSERT INTO hive_acid_table_partitioned
  VALUES
    (1, 'foo', 5),
    (2, 'bar', 10);

对特定分区 class=5 的VACUUM操作运行如下:

VACUUM TABLE hive_acid_table_partitioned
   PARTITION 'class=5';

如果未指定 PARTITION 'class=5' ,则VACUUM操作对所有分区进行,如果任何一个分区中的任何故障都会导致整个操作失败。

AND WAIT选项

默认情况下,VACUUM操作以异步方式运行,即一旦查询达到RUNNING状态,客户端将不再等待操作完成。

为VACUUM操作添加 AND WAIT 选项,使客户端同步等待VACUUM操作完成。

以上带 AND WAIT 选项的示例如下:

VACUUM TABLE hive_acid_table
  AND WAIT;
VACUUM TABLE hive_acid_table
  AND WAIT;
VACUUM TABLE hive_acid_table_partitioned
  PARTITION 'class=5'
  AND WAIT;

模式演进

Hive允许表中的分区与表具有不同的模式。当分区已经存在(使用原始列类型)后,更改表的列类型时会发生这种情况。Hive连接器通过允许与Hive相同的转换来支持此特性:

  • varchar 转换到 tinyint smallint integer bigint 以及相反
  • real 转换到 double
  • 对整数范围进行扩大转换,如从 tinyint 转换到 smallint

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

Avro模式演进

openLooKeng支持对Avro存储格式的Hive表进行查询和操作,Avro存储格式的模式是基于Avro模式文件/原文设置。也可以在openLooKeng中创建表,从本地或远程的HDFS/Web服务器中的有效Avro模式文件中推断模式。

要指定Avro模式应该用于解释表数据,必须使用 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元存储和openLooKeng协调节点/工作节点访问。

在openLooKeng中使用 avro_schema_url 创建的表的行为与设置了 avro.schema.url avro.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模式,因此查询结果将反映模式中的任何变化。因此,openLooKeng利用了Avro的向后兼容性能力。

如果Avro模式文件中的表的模式发生变化,仍然可以使用新模式读取旧数据。Avro模式中新增/重命名的字段 必须 有默认值。

Schema的演进行为如下:

  • 新模式中增加的列:当表使用新模式时,使用旧模式创建的数据将产生默认值。
  • 新模式中移除的列:使用旧模式创建的数据将不再输出已移除列的数据。
  • 列在新的模式中被重命名:这等价于移除列并添加新列,当表使用新模式时,使用旧模式创建的数据将产生默认值。
  • 更改新模式中的列类型:如果Avro或Hive连接器支持类型强制,则发生转换。不兼容的类型将引发错误。

限制

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

  • 不支持 CREATE TABLE AS
  • 不支持在 CREATE TABLE 中使用分区( partitioned_by )列和分桶( bucketed_by )列。
  • 不支持修改列的 ALTER TABLE 命令。

操作步骤

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

    在指定表中创建一个空分区。

  • system.sync_partition_metadata(schema_name, table_name, mode)

    检查并更新元存储中的分区列表。有三种方式:

    • ADD :添加文件系统中存在而元存储中不存在的分区。
    • DROP :删除元存储中存在而文件系统中不存在的分区。
    • FULL :同时执行 ADD DROP

示例

Hive连接器支持查询和操作Hive表和模式(数据库)。虽然有些不常用的操作需要直接通过Hive来执行,但是大多数操作都可以通过openLooKeng来执行。

创建一个名为 web 的新的Hive模式,用于存放名为 my-bucket 的S3桶中的表:

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

web 模式中创建一个名为 page_views 的新的Hive表,以ORC文件格式存储,按日期和国家分区,按用户分为到 50 个桶。(注意Hive要求分区列是表的最后一列):

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 表进行统计:

ANALYZE hive.web.request_logs;

s3:// 替换为 gs:// 后,此处展示的示例应该适用于Google云存储。

清理

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

DROP TABLE hive.web.request_logs

删除模式:

DROP SCHEMA hive.web

元存储缓存:

Hive连接器维护一个元存储缓存,以便更快地提供对各种操作的元存储请求。可在 hive.properties 中配置缓存条目的加载、重新加载和保留时间。

# Table & Partition Cache specific configurations
hive.metastore-cache-ttl=24h
hive.metastore-refresh-interval=23h
# DB, Table & View list, Roles, configurations related cache configuration
hive.metastore-db-cache-ttl=4m
hive.metastore-db-refresh-interval=3m

**说明:**如果用户直接对数据进行操作,并且Hive元存储被外部修改(例如,直接由Hive、Spark修改),则缓存可能包含较旧的数据。对于同一用户,应相应地配置缓存刷新和淘汰时间。

为了减少不一致,Hive连接器还根据表和分区名称缓存(刷新频率更高)验证分区及其统计缓存条目 on read ,避免表刷新时间高于 5mins

REFRESH META CACHE

此外,用户可使用元数据缓存刷新命令重新加载元存储缓存。

性能调优说明:

INSERT

  • 可以通过配置更多数量的 写入器任务 配置来调整大量加载插入操作,如 CREATE TABLE AS INSERT INTO TABLE SELECT COL1, COL2 FROM QUERY

    SET SESSION task_writer_count=<num>;
    #Note: `num' is default number of local parallel table writer jobs per worker, must be a power of 2.
    #Recommended value: 50% of the total cpu cores available in the worker node can be given here
    

    每个工作节点有多个写入器会确保更高的数据消耗,但会导致每个分区生成多个文件;大量小文件对于读取操作来说是不理想的。

    推荐管理员/开发人员可以使用以下方式来确保生成较少文件:-

    • 对于AArch64:

      • 使用 vacuum操作unify 合并每个分区中由多个文件写入创建的多个文件,这样在读取期间调度拆分会更快。

        VACUUM TABLE catalog_sales FULL UNIFY;
        

        Vacuum unify之前 :Insert通过每个写入器为给定分区生成多个文件:

        Vacuum unify之后 VACUUM FULL UNIFY 命令,一个给定分区的所有文件小文件统一为一个文件。

    • 对于Intel x86:

      • 以下会话参数可以通过添加一个计划节点来在工作节点间重排记录,确保每个分区只创建一个文件;这样,只有指定的工作节点才写入特定的分区。

        SET SESSION hive.write_partition_distribution=true
        #Default: false
        
    • Hive元存储超时

      大分区表包含过多分区,导致任务超时。大量分区可能需要更多时间来加载和与元存储缓存同步,因此,为了在更大规模存储中获得更好的性能,建议相应地调整’hive.metastore-timeout’参数。

      应在Hive配置文件中设置以下属性。

      hive.metastore-timeout=<TimeWithUnit>;
      #说明:'TimeWithUnit'为时间,单位为秒或分钟。 
      #默认值:10s(其中's'表示秒)
      #推荐值:对于大分区表中的操作,值可为60s或更大,需要根据数据量进行配置。此处显示的值仅供参考,建议根据实际情况进行调整。
      
  • 并行元存储操作

    应对用户会话设置以下参数。

    SET SESSION hive.metastore-client-service-threads = 4
    #Default: 4
    #Recommended: The number of running hive metastore service instances * 4.
    

    根据许多并行HMS操作可以调用的线程池的数量,这将减少获取分区的总时间。

    说明 :另外,集群中可以添加多个Hive元存储服务,这些服务将以轮询的方式访问,从而保证更佳的Hive元存储负载。

    hive.metastore-write-batch-size = 64
    #Default: 8
    #Recommended: 64 or higher writes to batch together per request to hive metastore service.