将 Apache Beeline 客户端与 Apache Hive 配合使用

本文介绍如何使用命令行 Apache Beeline 客户端通过 SSH 连接创建和执行 Apache Hive 查询。

背景

Beeline 是一个 Hive 客户端,包含在 HDInsight 群集的头节点上。 本文以示例方式介绍如何通过 Hive 查询HiveQL 文件来使用此工具。

若要连接到 HDInsight 群集上安装的 Beeline 客户端,或在本地安装 Beeline,请遵循连接或安装 Apache Beeline 的指南

Beeline 使用 JDBC 连接到 HiveServer2,后者是 HDInsight 群集上托管的一项服务。 还可以使用 Beeline 通过 Internet 远程访问 Hive on HDInsight。 以下示例提供用于从 Beeline 连接到 HDInsight 的最常见连接字符串。

先决条件示例

  • Azure HDInsight 上的 Hadoop 群集。 如果需要群集,请遵循创建 HDInsight 群集的指南

  • 请记下群集主存储的 URI 方案。 例如,对于 Azure 存储,此方案为 wasb://;对于 Azure Data Lake Storage Gen2,此方案为 abfs://。 如果为 Azure 存储启用了安全传输,则 URI 将为 wasbs://。 有关详细信息,请参阅安全传输

  • SSH 客户端。 有关详细信息,请参阅使用 SSH 连接到 HDInsight (Apache Hadoop)。 本文档中的大多数步骤都假定你从连接到群集的 SSH 会话使用 Beeline。 还可以使用本地 Beeline 客户端,但本文未介绍这些步骤。

运行 Hive 查询

此示例的基础是通过 SSH 连接使用 Beeline 客户端。

  1. 使用以下代码打开到群集的 SSH 连接。 将 sshuser 替换为群集的 SSH 用户,并将 CLUSTERNAME 替换为群集的名称。 出现提示时,输入 SSH 用户帐户的密码。

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.cn
    
  2. 输入以下命令,通过 Beeline 客户端从打开的 SSH 会话连接到 HiveServer2:

    beeline -u 'jdbc:hive2://headnodehost:10001/;transportMode=http'
    

    注意

    如果使用的是启用了企业安全性套餐 (ESP) 的群集,请参阅使用 Beeline 连接到 HiveServer2 或在本地安装 Beeline 以从本地连接中的“使用 Kerberos 连接到 HDInsight 企业安全性套餐 (ESP) 群集”部分

  3. Beeline 命令以 ! 字符开头,例如,!help 显示帮助。 但是,! 对于某些命令可以省略。 例如,help 也是有效的。

    !sql,用于执行 HiveQL 语句。 但是,由于 HiveQL 非常流行,因此可以省略前面的 !sql。 以下两个语句等效:

    !sql show tables;
    show tables;
    

    在新群集上,只会列出一个表:hivesampletable

  4. 使用以下命令显示 hivesampletable 的架构:

    describe hivesampletable;
    

    此命令返回以下信息:

    +-----------------------+------------+----------+--+
    |       col_name        | data_type  | comment  |
    +-----------------------+------------+----------+--+
    | clientid              | string     |          |
    | querytime             | string     |          |
    | market                | string     |          |
    | deviceplatform        | string     |          |
    | devicemake            | string     |          |
    | devicemodel           | string     |          |
    | state                 | string     |          |
    | country               | string     |          |
    | querydwelltime        | double     |          |
    | sessionid             | bigint     |          |
    | sessionpagevieworder  | bigint     |          |
    +-----------------------+------------+----------+--+
    

    此信息描述表中的列。

  5. 输入以下语句,以使用 HDInsight 群集随附的示例数据来创建名为 log4jLogs 的表:(基于 URI 方案根据需要进行修改。)

    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 'wasbs:///example/data/';
    SELECT t4 AS sev, COUNT(*) AS count FROM log4jLogs
        WHERE t4 = '[ERROR]' AND INPUT__FILE__NAME LIKE '%.log'
        GROUP BY t4;
    

    这些语句执行以下操作:

    语句 说明
    DROP TABLE 如果该表存在,则将其删除。
    CREATE EXTERNAL TABLE 在 Hive 中创建一个外部表。 外部表只会在 Hive 中存储表定义。 数据保留在原始位置。
    ROW FORMAT 如何设置数据的格式。 在此情况下,每个日志中的字段以空格分隔。
    STORED AS TEXTFILE LOCATION 数据存储的位置和文件格式。
    SELECT 选择 t4 列包含值 [ERROR] 的所有行的计数。 此查询返回值 3,因为有三行包含此值。
    INPUT__FILE__NAME LIKE '%.log' Hive 会尝试对目录中的所有文件应用架构。 在此示例中,目录包含与架构不匹配的文件。 为防止结果中包含垃圾数据,此语句指示 Hive 应当仅返回以 .log 结尾的文件中的数据。

    注意

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

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

    此命令的输出类似于以下文本:

    INFO  : Tez session hasn't been created yet. Opening session
    INFO  :
    
    INFO  : Status: Running (Executing on YARN cluster with App id application_1443698635933_0001)
    
    INFO  : Map 1: -/- Reducer 2: 0/1
    INFO  : Map 1: 0/1      Reducer 2: 0/1
    INFO  : Map 1: 0/1      Reducer 2: 0/1
    INFO  : Map 1: 0/1      Reducer 2: 0/1
    INFO  : Map 1: 0/1      Reducer 2: 0/1
    INFO  : Map 1: 0(+1)/1  Reducer 2: 0/1
    INFO  : Map 1: 0(+1)/1  Reducer 2: 0/1
    INFO  : Map 1: 1/1      Reducer 2: 0/1
    INFO  : Map 1: 1/1      Reducer 2: 0(+1)/1
    INFO  : Map 1: 1/1      Reducer 2: 1/1
    +----------+--------+--+
    |   sev    | count  |
    +----------+--------+--+
    | [ERROR]  | 3      |
    +----------+--------+--+
    1 row selected (47.351 seconds)
    
  6. 退出 Beeline:

    !exit
    

运行 HiveQL 文件

本示例是上一示例的延续部分。 使用以下步骤创建文件,并使用 Beeline 运行该文件。

  1. 使用以下命令创建一个名为 query.hql 的文件:

    nano query.hql
    
  2. 将以下文本用作文件的内容。 此查询创建名为 errorLogs 的新“内部”表:

    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]' AND INPUT__FILE__NAME LIKE '%.log';
    

    这些语句执行以下操作:

    语句 说明
    CREATE TABLE IF NOT EXISTS 如果该表尚不存在,则创建它。 由于未使用 EXTERNAL 关键字,因此此语句会创建内部表。 内部表存储在 Hive 数据仓库中,由 Hive 全权管理。
    STORED AS ORC 以优化的行纵栏式 (ORC) 格式存储数据。 ORC 格式是高度优化且有效的 Hive 数据存储格式。
    INSERT OVERWRITE ...SELECT 从包含 [ERROR]log4jLogs 表中选择行,然后将数据插入 errorLogs 表中。

    注意

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

  3. 如果要保存文件,请使用 Ctrl+X,并输入 Y,最后按 Enter 。

  4. 使用以下命令通过 Beeline 运行该文件:

    beeline -u 'jdbc:hive2://headnodehost:10001/;transportMode=http' -i query.hql
    

    注意

    -i 参数启动 Beeline,并运行 query.hql 文件中的语句。 查询完成后,会出现 jdbc:hive2://headnodehost:10001/> 提示符。 还可以使用 -f 参数运行文件,该参数在查询完成后会退出 Beeline。

  5. 若要验证是否已创建 errorLogs 表,请使用以下语句从 errorLogs 返回所有行:

    SELECT * from errorLogs;
    

    应返回三行数据,所有行都包含 t4 列中的 [ERROR]

    +---------------+---------------+---------------+---------------+---------------+---------------+---------------+--+
    | errorlogs.t1  | errorlogs.t2  | errorlogs.t3  | errorlogs.t4  | errorlogs.t5  | errorlogs.t6  | errorlogs.t7  |
    +---------------+---------------+---------------+---------------+---------------+---------------+---------------+--+
    | 2012-02-03    | 18:35:34      | SampleClass0  | [ERROR]       | incorrect     | id            |               |
    | 2012-02-03    | 18:55:54      | SampleClass1  | [ERROR]       | incorrect     | id            |               |
    | 2012-02-03    | 19:25:27      | SampleClass4  | [ERROR]       | incorrect     | id            |               |
    +---------------+---------------+---------------+---------------+---------------+---------------+---------------+--+
    3 rows selected (0.813 seconds)
    

后续步骤