CDP中的Hive3

Apache Hive3的主要功能

  1. Cloudera RuntimeCR)服务包括HiveHive MetastoreHive服务基于Apache Hive3.X(基于SQL的数据仓库系统)。Hive3.X与以前的版本相比的增强功能可以提高查询性能并符合Internet法规。

ACID事务处理

Hive3表符合ACID(原子性、一致性、隔离性和持久性)标准,这对于遵守GDPR(通用数据保护法规)被遗忘的权利至关重要。

共享的Hive Metastore

Hive Metastore(HMS)可与多个引擎(例如Impala和Spark)互操作,从而简化了引擎与用户数据访问之间的互操作

低延迟分析处理(CDP公共云)

Hive使用低延迟分析处理(LLAP)或Apache Tez执行引擎来处理事务。Hive LLAP服务在CDP数据中心不可用。

Hive集成Spark

可以使用HIve从Apache Spark应用程序查询结果,而无需解决方法。Hive Warehouse Connector支持从Spark读取和写入Hive表。

安全改进

默认情况下,Apache Ranger保护Hive数据。为了满足对并发性改进的需求,对GDPR的ACID支持,渲染安全性和其他功能,Hive严格控制了仓库在文件系统或对象存储以及内存资源上的位置。

查询级别的工作负载管理

可以配置谁使用查询资源,可以使用多少资源以及Hive对资源请求的影响速度。工作负载管理可以改善并行查询的执行,查询的集群共享以及查询功能。

物化视图

因为多个查询经常需要相同的中间汇总表或联接表,所以可以通过将中间表预先计算和缓存到视图中来避免昂贵、重复的查询部分共享。

查询过缓存

配置单元过滤并缓存相似或相同的查询。Hive不会重新计算未更改的数据。当数百个或数千个BI工具和Web服务的用户查询Hive时,缓存重复查询可以大大减少负载。

information_schema

启动后,Hive从JDBC数据源创建两个数据库:information_schema和sys。所有Metastore表都映射到表空间中,并且在sys中可用。information_schema数据显示系统状态,类似于sys数据库数据,可以使用SQL标准查询来查询information_schema。

接口不可用或者不支持

S3和LLAP(仅CDP数据中心7.0)

Hive CLI(由Beeline取代)

WebHCat

Hcat CLI

SQL标准授权

MapReduce执行引擎(由Tez取代)

Apache Hive3架构概述

Apache Tez

Apache Tez是Cloudera Manager中Hive-on-Tez服务的Hive执行引擎。不支持MapReduce。在Cloudera集群中,如果旧脚本或应用程序指定MapReduce执行,则会发生异常。大多数用户定义函数(UDF)不需要更改即可在Tez上执行,而无需执行MapReduce。

使用有向无环图(DAG)的表达式和数据传输原句,在Tez上而不是MapReduce上执行Hive查询可以提高查询性能。在Cloudera Data Plane(CDP)中,Tez通常仅由Hive使用,并且HiveSever会在HiveSever2启动时自动启动并管理Tez AM。提交给Hive的SQL查询的执行方式如下:

1.Hive编译查询

2.Tez执行查询

3.资源是为整个集群中的应用程序分配的

4.Hive更新数据源中的数据并返回查询结果

Hive on Tez在临时容器上运行任务,并使用标准的Yarn Shuffle服务

数据存储和访问控制

支持Hive3设计的主要架构更改之一使Hive对原数据内存资源和Vfile系统或对象存储有了更多的控制。从Hive2到Hive3的一下架构变更提供了更高的安全性:

1.严格控制的文件系统和计算机内存资源,替代了灵活的边界:明确的边界提高了可预测性,更好的文件系统控制可提高安全性

2.优化共享文件和Yarn容器中的工作负载

默认情况下 ,CDP数据中心将Hive数据存储在HDFS上,CDP公共云将Hive数据存储在S3上。在云中,Hive仅将HDFS用于存储临时文件。Hive3通过以下方式针对对象存储(例如S3)进行了优化:

1.Hive使用ACID来确定要读取的文件,而不是依赖于存储系统

2.在Hive3中,文件移动比在Hive2中减少

3.Hive积极地缓存元数据和数据,以减少文件系统的操作

Hive的主要授权模型是Ranger。Hive强制实施Ranger中指定的访问控制,与其他安全方案相比,该模型提供了更强的安全性,并且在管理策略方面具有强大的灵活性。

此模型仅允许Hive访问数据仓库,如果未启用Ranger安全服务或其他安全性,则默认情况下,Hive会根据用户模拟使用CDP数据中心基于存储的授权(SBA)。

HDFS权限更改

在CDP数据中心中,SBA严重依赖于HDFS访问控制表(ACL)。ACL是HDFS中权限系统的扩展,默认情况下,CDP数据中心在HDFS中打开ACL,提供以下优势:

1.授予多个组和用户特定权限时增加了灵活性

2、方便的将权限应用于目录树,而不是单个文件

事务处理

可以利用以下事务处理特性来部署新的Hive应用程序类型:

1.ADID事务处理的成熟版本,ACID表是默认的表类型,默认情况下启用ACID不会导致性能或操作过载。

2.简化应用程序开发,具有强大事务保证的操作以及SQL命令的简单语义。不需要存储ACID表

3.物化视图重写

4.自动查询缓存

5.高级优化

Hive客户端变更

CDP数据中心支持在命令行上使用客户端Beeline。可以从命令行运行Hive管理命令。Beeline使用与HiveSever的JDBC连接来执行命令。解析、编译和执行操作偶在HiveSever中进行。Beeline支持Hive CLI支持的许多命令行选项。`Beeline不支持Hive -e set key=value来配置Hive Metastore`。

使用Hive关键字、命令选项和命令来调用Beeline,可以输入受支持的Hive CLI命令。例如:`hive -e set。`使用Beeline代替不再受支持的客户端Hive CLI具有许多优点。包括降低开销。Beeline不会使用整个Hive代码库,执行查询所需的少量守护程序简化了监视和调试。

HiveServer强制执行可以使用SET命令更改的白名单和黑名单设置,使用黑名单,可以限制内存配置更改,以防止HiveServer不稳定,可以使用不同的白名单和黑名单配置多个HiveServer实例,建立不同级别的稳定性。

可以使用grunt命令与Apache Pig一起使用。

Apache Hive Metastore共享

HiveServer,Impala和其他组件可以共享远程Hive元存储。在CDP公共云中,HMS使用预安装的MySQL数据库。所以几乎没有执行HMS或仅在云中进行HMS的配置。

Spark集成

在某些情况下,Spark和Hive表可以使用Hive Warehouse连接器进行互操作。

可以使用Hive Warehouse连接器从Spark访问ACID和外部表,不需要Hive Warehouse Connector即可从Spark读取Hive外部表并从Spark写入Hive外部表。

查询批处理和交互式工作负载的执行

可以使用JDBC命令行工具(例如Beeline)或使用JDBC/ODBC驱动程序和BI工具(例如Tableau)连接到Hive。客户端与相同HiveServer版本的实例进行通信。可以为每个实例配置设置文件以执行批处理或交互式处理。

Apache Hive3性能调优

低延迟分析处理

CDP公共云支持Hive查询的低延迟分析处理(LLAP)。使用CDP数据仓库服务中可使用LLAP,可以调整数据仓库基础结构、组件和客户端连接参数,以提高性能和与商务智能和其他应用程序的相关性。

企业越来越希望运行SQL工作负载,这些工作负载返回的结果要比批处理提供的结果更快,这些企业通常希望数据分析应用程序支持交互式查询。低延迟分析处理(LLAP)可以提高交互式查询的性能。在CDP公共云上运行的Hive交互式查询满足了低延迟、可变参数基准,Hive LLAP在15秒或更短的时间内响应了该基准。LLAP使应用程序开发和IT基础结构能够运行返回实时或接近实时结果的查询。

CDP数据中心版不支持LLAP。

高性能Hive的最佳做法

在调整Apache Hive之前,应该遵循最佳实践。这些准则包括如何配置集群,存储数据和编写查询。

1.在需要资源来处理查询时,可以在CDP公共云中调整自动缩放以扩大规模。

2.接受默认设置以使用Tez作为执行引擎,在CDP中,MapReduce执行引擎由Tez代替。

3.接受默认设置以禁用用户模拟,如果启用,请`使用Cloudera Manager安全阀功能hive.server2.enable.doAs在hive-site.xml中禁用`,LLAP缓存用于多个查询的数据,并且此功能不支持用户模拟

4.使用Ranger安全服务来保护集群和相关服务

5.使用ORC文件格式存储数据

6.通过检查解释计划,确保查询被安全矢量化

7.使用SmartSense工具检测常见的系统错误配置

使用ORC最大化存储资源

可以通过多种方式来节省存储空间,但是使用优化队列(ORC)文件格式存储Apache Hive数据最为有效。ORC是Hive数据的默认存储。出于以下原因,建议使用Hive数据存储的ORC文件格式:

1.高效压缩:存储为列并进行压缩,这回导致较小的磁盘读取。列格式也是Tez中矢量化优化的理想选择。

2.快速读取:ORC具有内置索引,最小/最大值和其他值聚合,导致在读取期间跳过整个条带。另外,谓词下推将过滤器推入读取,以便读取最少的行。布隆过滤器进一步减少了返回的行数。

3.ORC总体上提供最佳的Hive性能。此外,要指定存储格式,还可以为表指定压缩算法,方法如下所示:

`CREATE TABLE addresses(`

`name string,`

`street string`

`city string`

`state string`

`zip int`

`)STORED AS orc TBLPROPERTIES("orc,compress"="Zlib")`

通常不需要设置压缩算法,因为Hive设置包括默认算法。使用ORC高级属性,可以为点查找中经常使用的列创建Bloom过滤器

4.Hive支持仅用于插入式的ACID表和外部表的Parquet和其他格式。还有编写自己的SerDes(序列化器,反序列化器)接口以支持自定义文件格式

高级ORC属性

通常不需要修改ORC属性,但是偶尔,Cloudera支持建议进行此类修改。可以使用Cloudera Manager中的安全阀功能来更改属性

使用分区来提高性能

可以使用分区来显著提高性能。设计Hive表和物化视图分区以映射到文件系统/对象存储上的物理目录。例如:按日期时间划分的表可以组织每天加载到Hive中的数据。

大型部署可以具有成千上万个分区,当Hive在查询处理期间发现分区键时,分区修剪将间接发生。例如:在加入维表后,分区键可能来自维表。查询按分区过滤列,从而将扫描限制在一个或几个匹配的分区上。当WHERE子句中存在分区键时,将直接进行分区修剪。分区是虚拟的,不写入主表,因为这些列对于整个分区都是相同的。在SQL查询中,定义分区,如以下所示:

`CREATE TABLE sale(id in,amount decimal)`

`PARTITIONED BY (xdate string,state string);`

要将数据插入此表中,需要制定用于快速加载的分区键:

`INSERT INTO sale(xdate='2021-05-13',state='CA')`

`SELECT * FROM staging_table`

`WHERE xdate='2021-05-13'AND state='CA';`

不需要指定动态分区列。如果启用动态分区,则Hive会生成分区规范。

用于加载1-9个分区的hive-site.xml设置:

`SET hive.exec.dynamic.partition.mode=nonstrict;`

`SET hive.exec.dynamic.partition=true;`

要将数据批量加载到分区的ORC表中,使用一下属性,该属性可优化将数据加载到10个或者更多分区中的性能。

用于加载10个或更多分区的hive-site.xml设置:

`hive.optimize.sort.dynamic.partition=true`

查询分区数据的示例

`INSERT INTO sale(xdate,state)`

`SELECT * FROM staging_table;`

对表进行分区和查询时,需要遵循以下最佳实践:

1.切勿在唯一ID上分区

2.分区的大小平均大于或等于1GB

3.设计查询以处理不超过1000个分区

处理分桶表

如果将数据从Apache Hive的早起版本迁移到Hive3,则可能需要处理影响性能的存储分桶表。

可以将表或分区划分为存储区,这些存储区可以通过以下方式存储:

1.作为表目录中的文件

2.如果表已分区,则作为分区目录

无需在新的Hive3表中使用存储分桶

与存储分桶相关的一个常见挑战是在增加或减少工作负载或数据时保持查询性能。例如:拥有一个使用16个存储分桶来支持1000个用户的平稳运行的环境,但是如果不及时调整存储桶和分区,则用户数量激增到一两天就打到了100000,这会产生问题。在使用表构建表之后,必须重新加载包含表数据的整个表,以减少、添加或删除表分桶,这使表桶调优变得很复杂。

使用Tez,只需要处理最大的表上的分桶。如果工作负载需求快速变化,则较小表的存储分桶会动态更改以完成表JOIN。

执行与存储分桶相关的任务,如下所示:

1.设置hive-site.xml以启用存储分桶

`SET hive.tez.bucket.pruning=true`

2.既有分区又有分桶的批量加载表:

将数据加载到即分区又存储分桶的表中时,请设置以下属性以优化过程:

`SET hive.optimize.sort.dynamic.partition=true`

如果有20个存储在user_id数据上的存储分桶,则以下查询仅返回与user_id = 1关联的数据:

`SELECT * FROM tab WHERE user_id = 1;`

为了更好的利用Tez上表分桶的动态功能,请采取以下做法:

1.对最大表的存储分桶使用单个键

2.通常,需要按最大维表对主表进行存储。例如:销售表可能是按客户存储的,而不是按商品或商店存储的。但是,在这种情况下,销售表是按物料和商店排序的。

3.通常,不要在同一列上进行存储和排序

如果表的存储分桶文件数超过行数,则表明应该重新考虑建表的存储方式