这是CDP中Apache Hive3用户指南系列之一,之前的文章请参考<CDP的Hive3系列之Hive Metastore介绍>,<CDP中的Hive3系列之Apache Hive3的特性>,<CDP中的Hive3系列之启动Apache Hive3>,<CDP中的Hive3系列之Hive3使用指南>,<CDP中的Hive3系列之管理Hive3>和<CDP中的Hive3系列之管理Hive的工作负载>
1 配置旧的 CREATE TABLE 行为
升级到 CDP 并迁移旧表后,您可能希望暂时切换到 Hive 旧行为。旧行为可能会解决数据迁移期间脚本的兼容性问题,例如,在运行 ETL 时。
默认情况下,执行 CREATE TABLE 语句会在 Hive 元存储中创建一个托管的 Apache Hive 3 表。您可以更改默认行为以使用旧的 CREATE TABLE 行为。配置旧行为时,CREATE TABLE 会生成外部表。由于完整 ACID 事务表相对于外部表的优势,仅在升级期间建议使用旧行为。
Apache Hive 完整 ACID(事务)表比非事务表提供更好的性能、安全性和用户体验。默认情况下,执行 CREATE TABLE 语句会在 Hive 元存储中创建一个托管的 Apache Hive 3 表。Hive 3 表是符合 ACID 的事务表,仅对 ORC 格式的数据具有以下完整的 ACID 功能:
· 插入
· 更新
· 删除
使用符合 ACID 的事务表不会导致性能或操作过载,也不需要分桶。
如果您是 Spark 用户,则无需切换到旧行为。例如,从SparkSQL 调用“创建表”会在升级到 CDP 后创建一个外部表,就像升级前一样。
1.1 配置旧的 CREATE TABLE 行为
当您配置旧行为时,CREATE TABLE 在您指定的仓库中创建一个外部表,即/warehouse/tablespace/external/hive by default. 要在会话级别配置旧行为,您可以在启动 Hive 时在 Beeline 连接字符串中将属性传递给 HiveServer (HS2)。或者,您可以在 Hive 命令行上传递该属性以切换到旧行为。您还可以通过在 Cloudera Manager 中配置属性在站点级别配置旧的创建表行为。在站点级别进行配置时,旧行为会在会话之间持续存在。
1.2 会话级配置
步骤 1 描述了两种配置传统 CREATE TABLE 行为的方法。您可以按照步骤 2 中的说明覆盖配置的旧行为以创建托管表。
1) 选择以下方法之一来配置旧的 CREATE TABLE 行为:
n 要在任何 JDBC 客户端中配置旧行为,请包含 hiveCreateAsExternalLegacy=true在连接字符串中。例如,在 Beeline 中,包含启动 Hive 的连接字符串:
beeline -u jdbc:hive2://10.65.13.98:10000/default;hiveCreateAsExternalLegacy=true \ -n <your user name> -p
n 要在现有Beeline会话中配置旧行为,请设置 hive.create.as.external.legacy=true. 例如:
hive> SET hive.create.as.external.legacy=true;
2) 您可以从文件系统和元存储中的表中清除。您可以更改 DROP 行为,以仅删除元数据。
3) 使用 MANAGED 关键字覆盖会话级别(仅)配置的旧行为以创建托管表。
CREATE MANAGED TABLE test (id INT);
当您的会话结束时,创建遗留行为也会结束。如果您发出 CREATE TABLE 语句,Hive 将创建仅插入或完整 ACID 表,具体取决于您设置以下表属性的方式:
hive.create.as.insert.only hive.create.as.acid
1.3 站点级配置
在站点级别配置旧式创建表行为时,旧式行为会在会话之间持续存在。您可以使用 Cloudera Manager 在站点级别配置此行为,如下所示:
1) 在 Cloudera Manager > Clusters > Hive On Tez 中,搜索 hive.create。
2) 通过以下方式之一配置属性:
n 如果创建表作为 ACID 仅插入和 创建表作为完整 ACID属性出现并被选中,请取消选中这些属性。
n 如果您的 Cloudera Manager 版本未公开这些属性,请在 hive-site.xml 的 HiveServer2 高级配置片段安全值中添加属性和值。
<property> <name>hive.create.as.insert.only</name> <value>false</value> </property> <property> <name>hive.create.as.acid</name> <value>false</value> </property>
2 限制连接的并发数
为了防止恶意应用程序重复连接并独占 HiveServer,您可以限制与 HiveServer 的并发连接。
作为管理员,您可以使用 Cloudera Manager 安全阀限制并发连接以将以下一项或多项属性添加到 hive-site.xml配置文件:
hive.server2.limit.connections.per.user
每个用户的最大 HiveServer 并发连接数
hive.server2.limit.connections.per.ipaddress
每个 IP 地址的最大 HiveServer 并发连接数
hive.server2.limit.connections.per.user.ipaddress
每个用户和 IP 地址组合的最大 HiveServer 并发连接数
每个参数的默认值为 0。您可以将每个参数的值更改为任意数字。必须在服务器端配置并发连接;因此, hive --hiveconf命令不起作用。
在此任务中,将每个用户的连接数限制为 25。
· 以下组件正在运行:
- HiveServer
- Hive Metastore
- Hive client
· 最低要求角色:配置者(也由集群管理员、完全管理员提供)
1) 在Cloudera Manager > Clusters 中选择 Hive 服务。单击 Configuration,然后搜索 hive-site.xml。
2) 在 hive-site.xml 的 HiveServer2 高级配置片段(安全阀)中,单击 + 并添加hive.server2.limit.connections.per.user属性。
3) 输入一个表示最大并发连接数的值:例如 25。
4) 点击保存。
5) 单击操作>部署客户端配置。
6) 重启 HIVE。
3 Hive on Tez 配置
了解 Tez 上的关键 Hive 属性可能会帮助您调整性能或解决问题,例如当您的默认会话配置仅允许运行一个时运行多个 TEZ Application Master (AM)。升级后,允许的默认会话数可能只有一个。建议知道自己在做什么的用户在 Tez 上进行 Hive 配置更改。
属性和默认值 |
描述 |
如何检查和配置 |
hive.server2.tez.default.queues(默认:“default”) |
与维护 Tez 会话池的 YARN 队列相对应的逗号分隔值列表 |
使用 Cloudera Manager 安全阀。指定其他队列时,它们必须已存在于 YARN 中。 |
hive.server2.tez.sessions.per.default.queue(默认值:1) |
每个 YARN 队列在池中维护的 Tez 会话 (DAGAppMaster) 数量 并发运行的 Tez 会话总数可以通过以下方式计算: ( Tez Sessions)总数= HiveServer2实例x ( 池化的 Tez 会话始终在运行,即使在空闲集群上也是如此。 |
使用 Cloudera Manager 安全阀。值为 1 表示一次只能运行一个查询 |
hive.server2.tez.initialize.default.sessions(默认值:true) |
如果启用,HiveServer (HS2) 在启动时将在指定范围内启动所有必要的 Tez 会话 |
使用 Cloudera Manager 安全阀。 |
4 配置 HiveServer 高可用
您需要知道如何配置 Hive-on-Tez 以使用 ZooKeeper 来实现 HiveServer 高可用性。
当您向 Hive-on-Tez 服务添加一个或多个额外的 HiveServer (HS2) 角色实例时,多个角色实例可以向 ZooKeeper 注册自己。JDBC 客户端(客户端驱动)可以通过 ZooKeeper 找到一个 HiveServer。使用 Beeline,您连接到 Hive,ZooKeeper 发现机制定位并连接到正在运行的 HiveServer 实例之一。
如果在 ZooKeeper 注册了多个 HiveServer 实例,并且除了一个实例之外所有实例都失败了,则 ZooKeeper 将链接传递给正在运行的实例,客户端可以成功连接。失败的实例必须手动重启。
不会发生自动故障转移。如果客户端连接时 HS2 实例失败,会话将丢失。由于这种情况需要交给客户端,所以没有自动故障转移;客户端需要使用 ZooKeeper 重新连接。
在升级到 CDP 之前,您的平台可能支持在 HiveServer (HS2)、Knox 和动态发现中使用二进制传输模式,但 CDP 不支持。使用替代解决方案,例如 HAProxy。
5 生成统计信息
基于成本的优化器 (CBO) 生成高效的查询计划。在您为表生成列统计信息之前,Hive 不会使用 CBO。默认情况下,Hive仅收集表统计信息。您需要配置 Hive 以启用列统计信息的收集。
CBO 由 Apache Calcite 提供支持,是 Hive 查询处理引擎中的核心组件。CBO 优化执行查询的计划,计算成本,并选择使用成本最低的计划。除了提高执行计划的效率之外,CBO 还可以节省资源。
5.1 CBO 如何运作
解析查询后,进程将查询转换为逻辑树(抽象语法树),表示要执行的操作,例如读取表或执行 JOIN。Calcite 应用优化,例如查询重写、JOIN 重新排序、JOIN 消除以及为查询导出隐含谓词以生成逻辑上等效的计划。Bushy 计划提供最大的并行性。每个逻辑计划都被分配了一个基于不同的、基于价值的启发式的成本。
Calcite 计划修剪器选择成本最低的逻辑计划。Hive 将选择的逻辑计划转换为物理运算符树,优化树,并将树转换为 Tez 作业以在 Hadoop 集群上执行。
5.2 设置基于成本的优化器和统计信息
您可以使用基于成本的优化器 (CBO) 和统计信息来开发可以提高性能的高效查询执行计划。您必须生成列统计信息才能使 CBO 发挥作用。
在此任务中,您将启用和配置基于成本的优化器 (CBO),并将Hive 配置为收集列统计信息和表统计信息以评估查询性能。列和表统计信息对于估计谓词选择性和计划成本至关重要。某些高级重写需要列统计信息。
在此任务中,您将检查并设置以下属性:
· hive.stats.autogather
控制表级统计信息的收集。
· hive.stats.fetch.column.stats
控制列级统计信息的收集。
· hive.compute.query.using.stats
指示 Hive 在生成查询计划时使用统计信息。
您可以使用 ANALYZE TABLE 语句为新创建的表和表分区手动生成表级统计信息。
· 以下组件正在运行:
- Hive Server
- Hive Metastore
- Hive Client
· 最低要求角色:配置者(也由集群管理员、完全管理员提供)
1) 在Cloudera Manager > Clusters 中选择 Hive 服务,例如 HIVE。
2) 在配置选项卡上,搜索 hive.cbo.enable.
如果该属性在您的 Cloudera Manager 版本中不可见,请使用 Cloudera Manager 安全阀(请参阅下面的链接)将该属性添加到 Hive 站点。将该属性设置为启用。
3) 接受默认值(已启用),或选中以启用hive.cbo.enableHiveServer 默认组的 属性。
4) 如有必要,搜索并启用 hive.stats.fetch.column.stats.
5) 如有必要,搜索并启用 hive.compute.query.using.stats.
6) 在Cloudera Manager > Clusters > Hive > Actions 中选择 Restart。
5.3 生成和查看 Apache Hive 统计信息
您可以使用统计信息来优化查询以提高性能。基于成本的优化器 (CBO) 还使用统计信息来比较查询计划并选择最佳计划。通过查看统计数据而不是运行查询,您通常可以更快地获得数据问题的答案。
此任务显示如何生成有关表的不同类型的统计信息。
1) 启动 Hive shell 并登录。
2) 收集未分区表的表统计信息 mytable:
ANALYZE TABLE mytable COMPUTE STATISTICS;
3) 查看您生成的表统计信息:
DESCRIBE EXTENDED mytable;
4) 收集表的列级统计信息:
ANALYZE TABLE mytable COMPUTE STATISTICS FOR COLUMNS;
5) 查看列统计信息为col_name列 my_table的my_db数据库:
DESCRIBE FORMATTED my_db.my_table col_name;
5.4 统计生成和查看命令
您可以手动生成表和列统计信息,然后使用 Hive 查询查看统计信息。默认情况下,Hive 生成表统计信息,而不是列统计信息,您必须手动生成列统计信息才能使基于成本的优化 (CBO) 发挥作用。
5.4.1 用于生成统计信息的命令
以下 ANALYZE TABLE 命令生成表和列的统计信息:
ANALYZE TABLE [table_name] COMPUTE STATISTICS;
收集非分区表的表统计信息。
ANALYZE TABLE [table_name] PARTITION(partition_column) COMPUTE STATISTICS;
收集分区表的表统计信息。
ANALYZE TABLE [table_name] COMPUTE STATISTICS for COLUMNS [comma_separated_column_list];
收集整个表的列统计信息。
ANALYZE TABLE partition2 (col1="x") COMPUTE STATISTICS for COLUMNS;
收集在 col1 上使用键 x 分区的表上 partition2 列的统计信息。
5.4.2 查看统计信息的命令
您可以使用以下命令查看表和列的统计信息:
DESCRIBE [EXTENDED] table_name;
查看表统计信息。只有hive.stats.autogather在hive-site.xml配置文件中启用了该属性时, 才能使用 EXTENDED 关键字 。使用 Cloudera Manager 安全阀功能。
DESCRIBE FORMATTED [db_name.]table_name [column_name] [PARTITION (partition_spec)];
查看列统计信息。
6 删除临时目录
您需要知道如何定期清除 Apache Hive 使用的临时目录以防止出现问题,例如失败的作业。
临时存储 Hive 存储中间或临时文件的目录随着时间的推移积累了太多数据并溢出。您可以将 Hive 配置为定期删除临时目录,无需用户干预。使用 Cloudera Manager,添加以下属性,如过程所示:
hive.start.cleanup.scratchdir
值:true
在启动 HiveServer 时清理 Hive 临时目录。
hive.server2.clear.dangling.scratchdir
值:true
在 HiveServer 中启动一个线程以清除文件系统中的悬空目录,例如 HDFS。
hive.server2.clear.dangling.scratchdir.interval
示例值:1800 秒
1) 在 Cloudera Manager 中,单击集群> Tez 上的 Hive >配置。集群 > Tez 上的 Hive > 配置。
2) 搜索hive-site.xml设置的Hive 服务高级配置片段(安全阀)。
3) 在hive-site.xml设置的Hive 服务高级配置片段(安全阀)中,单击+。
4) 在名称中输入属性名称,在值中输入值。