CDP中的Hive3系列之计划查询

2021-08-20 11:57:36 浏览数 (1)

如果您需要一种简单但强大且安全的方式来创建、管理和监控计划作业,您可以使用 Apache Hive 计划查询。您可以使用计划查询替换操作系统级别的调度程序,例如 cron、Apache Oozie 或 Apache Airflow。

使用 SQL 语句,您可以安排 Hive 查询重复运行、监控查询进度并可选择禁用查询计划。您可以执行查询以定期摄取数据、刷新物化视图、复制数据以及执行其他重复性任务。例如,您可以每 10 分钟将流中的数据插入到事务表中,每小时刷新一次用于 BI 报告的物化视图,并每天将数据从一个集群复制到另一个集群。

Hive 计划查询由以下部分组成:

  • 调度器中的唯一名称
  • 要执行的 SQL 语句
  • 由 Quartz cron 表达式定义的执行计划。

Quartz cron 表达式富有表现力且灵活。例如,表达式可以描述简单的计划,例如每 10 分钟一次,但也可以描述在 2021 年 1 月和 2021 年 2 月的第一个星期日上午 10 点执行。您可以用易于理解的格式描述常见的计划,例如例如每 20 分钟或每天“3:25:00”。

操作

计划查询属于命名空间,它是负责执行查询的 HiveServer (HS2) 实例的集合。计划查询存储在 Hive 元存储中。Metastore 存储计划查询、正在进行和先前执行的语句的状态以及其他信息。HiveServer 会定期轮询 Metastore 以检索将要执行的预定查询。如果您在单个部署中运行多个 HiveServer 实例,则元存储保证在任何给定时间只有其中一个执行某个预定查询。

您可以使用专用 SQL 语句创建、更改和删除计划查询。

启用计划查询

您需要知道如何启用和禁用计划查询,并了解默认状态如何防止您无意中运行查询。

默认情况下,计划查询在 CDP 中以禁用模式创建。此默认设置有助于防止您无意中运行新的计划查询。您必须显式启用新的计划查询。调度查询可以在错误的时间保持集群处于唤醒状态。要启用特定计划,例如 schedule1,请执行 ALTER SCHEDULED QUERY 语句:

代码语言:javascript复制
ALTER SCHEDULED QUERY schedule1 ENABLE;

要禁用此计划:

代码语言:javascript复制
 ALTER SCHEDULED QUERY schedule1 DISABLE;

启用所有计划查询

您可以使用 SQL 命令启用单个计划查询,但要启用多个计划查询,您需要在 Cloudera Manager 中执行几个步骤。

要在CDP Private Cloud Base 中启用所有新创建的计划,请执行以下步骤:

  1. 在 Cloudera Manager 中,单击集群> Hive on TEZ >配置
  2. 在搜索中,输入安全。
  3. 在hive-site.xml HIVE_ON_TEZ-1 (Service-Wide) 的 Hive 服务高级配置片段(安全阀)中,单击 并添加以下属性:hive.scheduled.queries.create.as.enabled
  4. 将值设置为true。
  5. 在 Tez 上保存并重新启动 Hive。

定期重建物化视图

使用物化视图可以提高查询性能。当新数据添加到基础表时,您需要刷新物化视图内容。您可以安排此任务,而不是手动重建实体化视图。重建会定期发生,并且对用户是透明的。

在此任务中,您将创建一个用于存储员工信息的架构。想象一下,您将许多员工的数据添加到表中。假设您的数据库的许多用户发出查询以访问有关去年雇用的员工的数据,包括他们所属的部门。您创建表的物化视图来处理这些查询。想象一下,招聘了新员工,您将他们的记录添加到表中。这些更改使物化视图内容过时。您需要刷新其内容。您创建计划查询来执行此任务。除非输入表发生更改,否则不会发生计划的重建。您可以通过绕过计划并立即执行计划来测试计划查询。最后,您更改计划以减少重建频率。

  1. 为员工数据创建数据库Schema。
代码语言:javascript复制
CREATE TABLE emps (
empid INTEGER,
deptno INTEGER,
name VARCHAR(256),
salary FLOAT,
hire_date TIMESTAMP);
CREATE TABLE depts (
deptno INTEGER,
deptname VARCHAR(256),
locationid INTEGER);
  1. 要处理许多查询以访问最近雇用的员工和部门数据,创建物化视图。
代码语言:javascript复制
CREATE MATERIALIZED VIEW mv_recently_hired AS
SELECT empid, name, deptname, hire_date FROM emps
JOIN depts ON (emps.deptno = depts.deptno)
WHERE hire_date >= '2020-01-01 00:00:00';
  1. 通过查询员工数据使用物化视图。
代码语言:javascript复制
SELECT empid, name FROM emps
JOIN depts  ON (emps.deptno = depts.deptno)
WHERE hire_date >= '2020-03-01 00:00:00' AND deptname = 'finance';
  1. 假设发生了新招聘并且您向emps表中添加了新记录 ,则重建物化视图。
代码语言:javascript复制
ALTER MATERIALIZED VIEW mv_recently_hired REBUILD;

重建会刷新物化视图的内容。

  1. 创建计划查询以每 10 分钟调用一次重建语句。
代码语言:javascript复制
CREATE SCHEDULED QUERY scheduled_rebuild
EVERY 10 MINUTES AS
ALTER MATERIALIZED VIEW mv_recently_hired REBUILD;

除非emps表没有更改,否则每 10 分钟执行一次重建 。如果物化视图可以增量重建,则除非输入表发生更改,否则不会发生计划的重建。

  1. 要测试计划,请立即执行计划查询。
代码语言:javascript复制
ALTER SCHEDULED QUERY scheduled_rebuild EXECUTE;
  1. 改变重建的频率。
代码语言:javascript复制
ALTER SCHEDULED QUERY scheduled_rebuild EVERY 20 MINUTES;

获取预定查询信息并监控查询

创建计划查询后,您可以在 Hive 信息架构表中访问有关scheduled_queries 的信息。您还可以使用信息架构来监控计划的查询执行。

  1. 查询信息模式以获取有关计划的信息。
代码语言:javascript复制
SELECT *
FROM information_schema.scheduled_queries
WHERE schedule_name = 'scheduled_rebuild';

将显示有关计划查询的以下信息:

schedule_query_id

计划查询的唯一数字标识符。

Schema_name

计划查询的名称。

Enabled

当前是否启用了计划查询。

cluster_namespace

预定查询所属的命名空间。

Schedule

调度描述为 Quartz cron 表达式。

User

计划查询的所有者。

Query

要执行的 SQL 查询。

Next_execution

当此预定查询的下一次执行到期时。

  1. 监视最近的计划查询执行。
代码语言:javascript复制
SELECT *
FROM information_schema.scheduled_executions;

您可以在 Hive 元存储中配置此信息的保留期。

schedule_execution_id

计划查询执行的唯一数字标识符。

Schedule_name

与此执行关联的计划查询的名称。

executor_query_id

分配给 HiveServer (HS2) 执行的查询 ID。

state

以下执行阶段之一。

  • STARTED。预定查询到期并且 HiveServer 实例已检索其信息。
  • EXECUTING。HiveServer 正在以可配置的时间间隔执行查询和报告进度。
  • FAILED。由于错误或异常,查询执行已停止。
  • FINISHED。查询执行成功。
  • TIME_OUT。HiveServer 未提供超过可配置超时的查询状态更新。

Start_time

开始执行时间。

End_time

执行结束时间。

elapsed

开始时间和结束时间之间的差异。

Error_message

如果计划查询失败,则它包含与其失败相关的错误消息。

Last_update_time

HiveServer 上次更新查询状态的时间。

原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/using-hiveql/topics/hive_scheduling.html

0 人点赞