什么是 Azure HDInsight 中的 Apache Hive 和 HiveQL?

Apache Hive 是适用于 Hadoop 的数据仓库系统。 使用 Hive 可以汇总、查询和分析数据。 Hive 查询使用 HiveQL 编写,它是类似于 SQL 的查询语言。

Hive 可以实现将结构投影到很大程度上未结构化的数据上。 定义结构后,可以使用 HiveQL 来查询这些数据,而无需具备 Java 或 MapReduce 方面的知识。

HDInsight 提供了已针对特定工作负荷进行了优化的多种群集类型。 以下群集类型最常用于 Hive 查询:

如何使用 Hive

使用下表来了解将 Hive 与 HDInsight 配合使用的各种方法:

使用此方法,如果想要... ...交互式查询 ...批处理 ...使用此 群集操作系统 ...从此 客户端操作系统
Visual Studio Code 的 HDInsight 工具 Linux Linux、Unix、Mac OS X 或 Windows
用于 Visual Studio 的 HDInsight 工具 Linux 或 Windows* Windows
Hive 视图 Linux 任何(基于浏览器)
Beeline 客户端 Linux Linux、Unix、Mac OS X 或 Windows
REST API   Linux 或 Windows* Linux、Unix、Mac OS X 或 Windows
Windows PowerShell   Linux 或 Windows* Windows

Important

* Linux 是 HDInsight 3.4 或更高版本上使用的唯一操作系统。 有关详细信息,请参阅 HDInsight 在 Windows 上停用

HiveQL 语言参考

语言手册 (https://cwiki.apache.org/confluence/display/Hive/LanguageManual) 中提供了 HiveQL 语言参考。

Hive 和数据结构

Hive 知道如何处理结构化和半结构化数据。 例如,其中的字段由特定字符分隔的文本文件。 以下 HiveQL 语句基于空格分隔的数据创建一个表:

CREATE EXTERNAL TABLE log4jLogs (
    t1 string,
    t2 string,
    t3 string,
    t4 string,
    t5 string,
    t6 string,
    t7 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE LOCATION '/example/data/';

Hive 还支持对复杂或不规则的结构化数据使用自定义序列化程序/反序列化程序 (SerDe)。 有关详细信息,请参阅如何将自定义 JSON SerDe 与 HDInsight 配合使用文档。

有关 Hive 支持的文件格式的详细信息,请参阅语言手册 (https://cwiki.apache.org/confluence/display/Hive/LanguageManual)

Hive 内部表与外部表

使用 Hive 可以创建两种类型的表:

  • 内部:数据存储在 Hive 数据仓库中。 数据仓库位于群集的默认存储中的 /hive/warehouse/ 上。

    当下列条件之一成立时,请使用内部表:

    • 数据是临时性的。
    • 希望 Hive 管理表和数据的生命周期。
  • 外部:数据存储在数据仓库外部。 数据可以存储在可由群集访问的任何存储中。

    当下列条件之一成立时,请使用外部表:

    • 数据也在 Hive 外部使用。 例如,另一个进程(不会锁定文件)会更新数据文件。
    • 数据需要保留在基础位置,即使在删除表之后。
    • 需要一个自定义位置,例如非默认存储帐户。
    • 由 Hive 以外的某个程序管理数据格式、位置等。

有关详细信息,请参阅 Hive 内部和外部表简介博客文章。

用户定义函数 (UDF)

还可以通过用户定义函数 (UDF) 扩展 Hive。 UDF 允许实现 HiveQL 中不容易建模的功能或逻辑。 有关将 UDF 与 Hive 配合使用的示例,请参阅以下文档:

示例数据

Hive on HDInsight 中预先加载了名为 hivesampletable 的内部表。 HDInsight 还提供了可与 Hive 配合使用的示例数据集。 这些数据集存储在 /example/data/HdiSamples 目录中。 这些目录存在于群集的默认存储中。

Hive 查询示例

以下 HiveQL 语句将各列投影到 /example/data/sample.log 文件上:

set hive.execution.engine=tez;
DROP TABLE log4jLogs;
CREATE EXTERNAL TABLE log4jLogs (
    t1 string,
    t2 string,
    t3 string,
    t4 string,
    t5 string,
    t6 string,
    t7 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE LOCATION '/example/data/';
SELECT t4 AS sev, COUNT(*) AS count FROM log4jLogs 
    WHERE t4 = '[ERROR]' AND INPUT__FILE__NAME LIKE '%.log' 
    GROUP BY t4;

在上例中,HiveQL 语句执行以下操作:

  • set hive.execution.engine=tez;:将执行引擎设置为使用 Tez。 使用 Tez 可以提高查询性能。 有关 Tez 的详细信息,请参阅使用 Apache Tez 提高性能部分。

    Note

    仅在使用基于 Windows 的 HDInsight 群集时需要此语句。 Tez 是用于基于 Linux 的 HDInsight 的默认执行引擎。

  • DROP TABLE:如果该表已存在,则删除它。

  • CREATE EXTERNAL TABLE:在 Hive 中创建一个新的外部表。 外部表只会在 Hive 中存储表定义。 数据以原始格式的形式保留在原始位置中。

  • ROW FORMAT:告知 Hive 如何设置数据的格式。 在此情况下,每个日志中的字段以空格分隔。

  • STORED AS TEXTFILE LOCATION:让 Hive 知道数据的存储位置(example/data 目录),并且数据已存储为文本。 数据可以在一个文件中,也可以分散在目录的多个文件内。

  • SELECT:选择 t4 列中包含值 [ERROR] 的所有行的计数。 此语句返回的值为 3,因为有三行包含此值。

  • INPUT__FILE__NAME LIKE '%.log' - Hive 会尝试向目录中的所有文件应用架构。 在此示例中,目录包含与架构不匹配的文件。 为防止结果中包含垃圾数据,此语句指示 Hive 应当仅返回以 .log 结尾的文件中的数据。

Note

如果希望通过外部源更新基础数据,应使用外部表。 例如,自动化数据上传过程或 MapReduce 操作。

删除外部表不会删除数据,只会删除表定义。

若要创建内部表而非外部表,请使用以下 HiveQL:

set hive.execution.engine=tez;
CREATE TABLE IF NOT EXISTS errorLogs (
    t1 string,
    t2 string,
    t3 string,
    t4 string,
    t5 string,
    t6 string,
    t7 string)
STORED AS ORC;
INSERT OVERWRITE TABLE errorLogs
SELECT t1, t2, t3, t4, t5, t6, t7 
    FROM log4jLogs WHERE t4 = '[ERROR]';

这些语句执行以下操作:

  • CREATE TABLE IF NOT EXISTS:如果该表不存在,则创建该表。 由于未使用 EXTERNAL 关键字,因此,此语句创建一个内部表。 该表存储在 Hive 数据仓库中,并完全由 Hive 管理。

  • STORED AS ORC:以优化的行纵栏式 (ORC) 格式存储数据。 ORC 是高度优化且有效的 Hive 数据存储格式。

  • INSERT OVERWRITE ... SELECT:从包含 [ERROR]log4jLogs 表中选择行,然后将数据插入到 errorLogs 表中。

Note

与外部表不同,删除内部表会同时删除基础数据。

提高 Hive 查询性能

Apache Tez

Apache Tez 是让数据密集型应用程序(例如 Hive)能够大规模高效运行的框架。 基于 Linux 的 HDInsight 群集在默认情况下会启用 Tez。

Note

对于基于 Windows 的 HDInsight 群集来说,Tez 目前默认处于关闭状态,因此必须启用。 要充分利用 Tez,必须设置 Hive 查询的以下值:

set hive.execution.engine=tez;

Tez 是用于基于 Linux 的 HDInsight 群集的默认引擎。

Hive on Tez 设计文档包含有关实现选项和优化配置的详细信息。

为了帮助使用 Tez 调试运行的作业,HDInsight 提供了以下 Web UI,使你可以查看 Tez 作业的详细信息:

低延迟分析处理 (LLAP)

LLAP(有时称为 Live Long and Process)是 Hive 2.0 中的一项新功能,可对查询进行内存中缓存。 LLAP 能够大幅加快 Hive 查询的速度,在某些情况下,速度比 Hive 1.x 要快 2.6 倍

HDInsight 在交互式查询群集类型中提供 LLAP。 有关详细信息,请参阅交互式查询入门文档。

计划 Hive 查询

在计划的或按需工作流中,可以使用多个服务来运行 Hive 查询。

Hive 作业和 SQL Server Integration Services

可以使用 SQL Server Integration Services (SSIS) 来运行 Hive 作业。 Azure Feature Pack for SSIS 提供适用于 HDInsight 上的 Hive 作业的以下组件。

有关详细信息,请参阅 Azure 功能包文档。

Apache Oozie

Apache Oozie 是一个管理 Hadoop 作业的工作流和协调系统。 有关将 Oozie 与 Hive 配合使用的详细信息,请参阅使用 Oozie 定义和运行工作流文档。

后续步骤

现在,已了解什么是 Hive,以及如何将它与 HDInsight 中的 Hadoop 配合使用,请使用以下链接来学习 Azure HDInsight 的其他用法。