升级到 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 后创建一个外部表,就像升级前一样。
当您配置旧行为时,CREATE TABLE 在您指定的仓库中创建一个外部表,即/warehouse/tablespace/external/hive by default. 要在会话级别配置旧行为,您可以在启动 Hive 时在 Beeline 连接字符串中将属性传递给 HiveServer (HS2)。或者,您可以在 Hive 命令行上传递该属性以切换到旧行为。您还可以通过在 Cloudera Manager 中配置属性在站点级别配置旧的创建表行为。在站点级别进行配置时,旧行为会在会话之间持续存在。
步骤 1 描述了两种配置传统 CREATE TABLE 行为的方法。您可以按照步骤 2 中的说明覆盖配置的旧行为以创建托管表。
beeline -u jdbc:hive2://10.65.13.98:10000/default;hiveCreateAsExternalLegacy=true \
-n <your user name> -p
hive> SET hive.create.as.external.legacy=true;
CREATE MANAGED TABLE test (id INT);
当您的会话结束时,创建遗留行为也会结束。如果您发出 CREATE TABLE 语句,Hive 将创建仅插入或完整 ACID 表,具体取决于您设置以下表属性的方式:
在站点级别配置旧式创建表行为时,旧式行为会在会话之间持续存在。您可以使用 Cloudera Manager 在站点级别配置此行为,如下所示:
2. 通过以下方式之一配置属性:
<property>
<name>hive.create.as.insert.only</name>
<value>false</value>
</property>
<property>
<name>hive.create.as.acid</name>
<value>false</value>
</property>
为了防止恶意应用程序重复连接并独占 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。
2. 在 hive-site.xml 的 HiveServer2 高级配置片段(安全阀)中,单击 + 并添加hive.server2.limit.connections.per.user属性。
3. 输入一个表示最大并发连接数的值:例如 25。
4. 点击保存。
5. 单击操作>部署客户端配置。
6. 重启 HIVE。
了解 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 ( default.queues)x ( sessions.per.default.queue)池化的 Tez 会话始终在运行,即使在空闲集群上也是如此。 | 使用 Cloudera Manager 安全阀。值为 1 表示一次只能运行一个查询 |
hive.server2.tez.initialize.default.sessions(默认值:true) | 如果启用,HiveServer (HS2) 在启动时将在指定范围内启动所有必要的 Tez 会话default.queues以满足 sessions.per.default.queue要求。 | 使用 Cloudera Manager 安全阀。 |
您需要知道如何配置 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。
基于成本的优化器 (CBO) 生成高效的查询计划。在您为表生成列统计信息之前,Hive 不会使用 CBO。默认情况下,Hive 仅收集表统计信息。您需要配置 Hive 以启用列统计信息的收集。
CBO 由 Apache Calcite 提供支持,是 Hive 查询处理引擎中的核心组件。CBO 优化执行查询的计划,计算成本,并选择使用成本最低的计划。除了提高执行计划的效率之外,CBO 还可以节省资源。
解析查询后,进程将查询转换为逻辑树(抽象语法树),表示要执行的操作,例如读取表或执行 JOIN。Calcite 应用优化,例如查询重写、JOIN 重新排序、JOIN 消除以及为查询导出隐含谓词以生成逻辑上等效的计划。Bushy 计划提供最大的并行性。每个逻辑计划都被分配了一个基于不同的、基于价值的启发式的成本。
Calcite 计划修剪器选择成本最低的逻辑计划。Hive 将选择的逻辑计划转换为物理运算符树,优化树,并将树转换为 Tez 作业以在 Hadoop 集群上执行。
您可以使用基于成本的优化器 (CBO) 和统计信息来开发可以提高性能的高效查询执行计划。您必须生成列统计信息才能使 CBO 发挥作用。
在此任务中,您将启用和配置基于成本的优化器 (CBO),并将 Hive 配置为收集列统计信息和表统计信息以评估查询性能。列和表统计信息对于估计谓词选择性和计划成本至关重要。某些高级重写需要列统计信息。
在此任务中,您将检查并设置以下属性:
控制表级统计信息的收集。
控制列级统计信息的收集。
指示 Hive 在生成查询计划时使用统计信息。
您可以使用 ANALYZE TABLE 语句为新创建的表和表分区手动生成表级统计信息。
如果该属性在您的 Cloudera Manager 版本中不可见,请使用 Cloudera Manager 安全阀(请参阅下面的链接)将该属性添加到 Hive 站点。将该属性设置为启用。
您可以使用统计信息来优化查询以提高性能。基于成本的优化器 (CBO) 还使用统计信息来比较查询计划并选择最佳计划。通过查看统计数据而不是运行查询,您通常可以更快地获得数据问题的答案。
此任务显示如何生成有关表的不同类型的统计信息。
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;
您可以手动生成表和列统计信息,然后使用 Hive 查询查看统计信息。默认情况下,Hive 生成表统计信息,而不是列统计信息,您必须手动生成列统计信息才能使基于成本的优化 (CBO) 发挥作用。
以下 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 列的统计信息。
您可以使用以下命令查看表和列的统计信息:
DESCRIBE [EXTENDED] table_name;
查看表统计信息。只有hive.stats.autogather在hive-site.xml配置文件中启用了该属性时, 才能使用 EXTENDED 关键字 。使用 Cloudera Manager 安全阀功能。
DESCRIBE FORMATTED [db_name.]table_name [column_name] [PARTITION (partition_spec)];
查看列统计信息。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/configuring-apache-hive/topics/hive_create_table_default.html
您需要知道如何定期清除 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 秒
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/configuring-apache-hive/topics/hive_scratch_directory.html