基于HMS+HDFS读取EMR Hive数据

本文以E-MapReduceHive为例,为您介绍在MaxCompute中如何创建外部Schema,并查询EMR中的Hive表数据。

前提条件

创建MaxCompute项目,并为MaxCompute项目(即将创建External Schema的目标项目)开启项目级元数据支持的Schema开关

使用限制

  • 仅华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华南1(深圳)、中国香港、新加坡和德国(法兰克福)地域支持构建湖仓一体能力。

  • MaxComputeEMR集群所在的VPC必须部署在同一地域。

步骤一:准备Hive数据

  1. 登录EMR on ECS控制台创建EMR集群,并连接实例。

    1. 在创建EMR集群的过程中,您需要重点关注以下配置项:

      配置区域

      配置项

      描述

      示例

      软件配置

      业务场景

      请根据实际需求选择业务场景。

      自定义集群

      产品版本

      选择基于HadoopHive构建的EMR版本。

      EMR-3.53.0

      可选服务

      选择相关的Hadoop、HDFS、Hive、YARNZooKeeper组件,被选中的组件会默认启动相关的服务进程。

      Hadoop-Common、HDFS、Hive、YARN、Spark3、ZooKeeper

      元数据

      选择自建RDS,并配置相关的数据库连接参数,详情请参见配置自建RDS

      若您的Hive+HDFS外部数据源在EMR集群中,目前仅支持使用自建RDS作为元数据库,不支持DLF统一元数据和内置MySQL。且在读取数据前,需确保EMR集群的Hive组件正常运行。

      自建RDS

    2. 集群创建成功后,单击目标集群操作列的节点管理

    3. 节点管理页面,单击emr-master节点组下的目标节点ID,进入ECS控制台。

    4. 选择合适的工具,连接节点ECS实例,详情请参见ECS远程连接方式概述

      说明

      本文使用Workbench远程连接实例,登录密码为创建集群时所设置的密码。

  2. 进入Hive准备数据。在EMR中使用Workbench方式登录集群主节点,在终端界面输入hive,进入Hive模式,然后执行如下命令。

    1. 创建非分区表,并写入数据。

      -- 创建库
      CREATE DATABASE IF NOT EXISTS myhive;
      
      -- 切换库
      USE myhive;
      
      -- 创建非分区表
      CREATE TABLE IF NOT EXISTS employees (
        id INT,
        name STRING,
        age INT,
        department STRING
      )
      ROW FORMAT DELIMITED
      FIELDS TERMINATED BY ','
      STORED AS TEXTFILE;
      
      -- 插入数据
      INSERT INTO employees VALUES(1, 'John', 25, 'Sales'),(2, 'Jane', 30, 'Marketing'),(3, 'Mike', 35, 'Engineering'),(4, 'Sarah', 28, 'HR'),(5, 'David', 32, 'Finance'),(6, 'Linda', 29, 'IT'),(7, 'Robert', 31, 'Operations'),(8, 'Emily', 27, 'Research'),(9, 'Michael', 33, 'Development'),(10, 'Chris', 26, 'Support');
      
      -- 查询表
      SELECT * FROM employees;

      返回结果如下:

      1       John    25      Sales
      2       Jane    30      Marketing
      3       Mike    35      Engineering
      4       Sarah   28      HR
      5       David   32      Finance
      6       Linda   29      IT
      7       Robert  31      Operations
      8       Emily   27      Research
      9       Michael 33      Development
      10      Chris   26      Support
    2. 创建分区表,并写入数据。

      -- 创建分区表
      CREATE TABLE employees_pt (
          id INT,
          name STRING,
          age INT
      )
      PARTITIONED BY (department STRING)
      ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
      
      -- 插入数据
      INSERT INTO employees_pt PARTITION (department='Sales') VALUES(1, 'John', 25),(2, 'Jane', 30),(3, 'Mike', 35);
      INSERT INTO employees_pt PARTITION (department='Marketing') VALUES(4, 'Sarah', 28),(5, 'David', 32);
      INSERT INTO employees_pt PARTITION (department='Engineering') VALUES(6, 'Linda', 29),(7, 'Robert', 31);
      INSERT INTO employees_pt PARTITION (department='HR') VALUES(8, 'Emily', 27),(9, 'Michael', 33),(10, 'Chris', 26);
      
      -- 查询表
      SELECT * FROM employees_pt;

      返回结果如下:

      6       Linda   29      Engineering
      7       Robert  31      Engineering
      8       Emily   27      HR
      9       Michael 33      HR
      10      Chris   26      HR
      4       Sarah   28      Marketing
      5       David   32      Marketing
      1       John    25      Sales
      2       Jane    30      Sales
      3       Mike    35      Sales

步骤二:在MaxCompute中创建Hive+HDFS外部数据源

  1. 登录MaxCompute控制台,在左上角选择地域。

  2. 在左侧导航栏,选择租户管理 > 外部数据源

  3. 外部数据源页面,单击创建外部数据源

  4. 新增外部数据源对话框,配置如下参数。

    参数

    说明

    示例

    外部数据源类型

    选择Hive+HDFS

    Hive+HDFS

    外部数据源名称

    可自定义命名。命名规则如下:

    • 以字母开头,且只能包含小写字母、下划线和数字。

    • 不能超过128个字符。

    hive_fs

    外部数据源描述

    根据需要填写。

    网络连接对象

    网络连接名称,选择或创建MaxCompute到阿里云E-MapReduceHadoop VPC网络的连接。参数详情请参见访问VPC方案(专线直连)中的创建MaxCompute与目标VPC网络间的网络连接步骤。

    说明
    • 网络连接基本概念请参见Networklink

    • VPC必须与MaxCompute外部数据源及外部数据源挂载的项目处于同一地域。

    networklink

    集群名称

    Hadoop集群高可用环境下用于指代NameNode的名称。获取方法如下:

    1. 登录EMR控制台,单击目标集群ID,进入集群详情页面。

    2. 集群服务页签,单击HDFS服务的配置,进入配置页面。

    3. 切换至hdfs-site.xml页签,在配置项名称栏搜索dfs.nameservices,该配置项对应的值则为集群名称。

    hdfs-cluster

    NameNode 地址

    目标Hadoop集群的ActiveStandby NameNode服务地址和端口号(端口号通常是8020)。获取方式如下:

    1. 登录EMR控制台,单击目标集群ID,进入集群详情页面。

    2. 集群服务页签,单击HDFS服务,进入状态页面。

    3. 组件列表区域,单击NameNode前面的image图标,展开拓扑列表。

    4. 获取master-1-1节点对应的内网IPNameNode 地址格式即为内网IP:8020

    172.22.xx.xxx:8020

    HMS 服务地址

    目标Hadoop集群的ActiveStandby NameNodeHive元数据服务地址和端口号(端口号通常是9083)。格式为内网IP:9083

    说明

    内网IP的获取方式,请参见上述NameNode地址参数说明。

    172.22.xx.xxx:9083

    认证类型

    暂时仅支持无认证方式。

    无认证方式

  5. 单击确认,完成外部数据源的创建。

步骤三:在MaxCompute中创建外部Schema

MaxCompute客户端中执行如下命令,创建外部Schema。

说明

目标MaxCompute项目需要提前开启项目级元数据支持的Schema开关

SET odps.namespace.schema=true;

CREATE EXTERNAL SCHEMA IF NOT EXISTS es_hive
WITH  hive_fs
ON 'myhive' ;

代码说明如下:

  • es_hive:自定义命名,外部Schema名称。

  • hive_fs步骤二中创建的外部数据源名称,外部Schema归属的项目必须与外部数据源处于同一地域。

  • myhive步骤一中创建的Hive数据库名称。

步骤四:在MaxCompute客户端中使用SQL访问Hadoop Hive数据

  1. MaxCompute客户端中查询External Schema内的表。

    SET odps.namespace.schema=true;
    SHOW TABLES IN es_hive;

    返回结果如下:

    ALIYUN$xxx:employees
    ALIYUN$xxx:employees_pt
  2. 查询External Schema内的表明细。

    • 查询非分区表。

      SELECT * FROM es_hive.employees;

      返回结果如下:

      +------------+------------+------------+------------+
      | id         | name       | age        | department  |
      +------------+------------+------------+------------+
      | 1          | John       | 25         | Sales      |
      | 2          | Jane       | 30         | Marketing  |
      | 3          | Mike       | 35         | Engineering|
      | 4          | Sarah      | 28         | HR         |
      | 5          | David      | 32         | Finance    |
      | 6          | Linda      | 29         | IT         |
      | 7          | Robert     | 31         | Operations |
      | 8          | Emily      | 27         | Research   |
      | 9          | Michael    | 33         | Development|
      | 10         | Chris      | 26         | Support    |
      +------------+------------+------------+------------+
    • 查询分区表。

      SELECT * FROM  es_hive.employees_pt WHERE department='HR';

      返回结果如下:

      +------------+------------+------------+------------+
      | id         | name       | age        | department |
      +------------+------------+------------+------------+
      | 8          | Emily      | 27         | HR         |
      | 9          | Michael    | 33         | HR         |
      | 10         | Chris      | 26         | HR         |
      +------------+------------+------------+------------+

步骤五:向Hadoop数据源添加新数据

  1. Hive分区表插入新分区数据。

    EMR中使用Workbench方式登录集群主节点,在终端界面输入hive,进入Hive模式,然后执行如下命令:

    -- 切换至myhive数据库,并向employees_pt表中插入数据
    USE myhive;
    INSERT INTO employees_pt PARTITION (department='Computer') VALUES(11, 'Cily', 29),(12, 'Miky', 35);
    
    -- 在Hive侧查询分区表
    SELECT * FROM employees_pt;

    返回结果如下:

    11      Cily    29      Computer
    12      Miky    35      Computer
    6       Linda   29      Engineering
    7       Robert  31      Engineering
    8       Emily   27      HR
    9       Michael 33      HR
    10      Chris   26      HR
    4       Sarah   28      Marketing
    5       David   32      Marketing
    1       John    25      Sales
    2       Jane    30      Sales
    3       Mike    35      Sales
  2. MaxCompute客户端中查询新增的分区数据。

    SELECT * FROM es_hive.employees_pt WHERE department='Computer';

    返回结果如下:

    +------+------+------+------------+
    | id   | name | age  | department |
    +------+------+------+------------+
    | 11   | Cily | 29   | Computer   |
    | 12   | Miky | 35   | Computer   |
    +------+------+------+------------+

步骤六:在MaxComputeke客户端中将联邦外表的数据复制入数仓

-- 将联邦外表的数据复制到数仓中
CREATE TABLE employees_copy AS SELECT * FROM es_hive.employees;

-- 查询数仓中已复制的表数据
SELECT * FROM employees_copy;

返回结果如下:

+------------+------------+------------+------------+
| id         | name       | age        | department  |
+------------+------------+------------+------------+
| 1          | John       | 25         | Sales      |
| 2          | Jane       | 30         | Marketing  |
| 3          | Mike       | 35         | Engineering|
| 4          | Sarah      | 28         | HR         |
| 5          | David      | 32         | Finance    |
| 6          | Linda      | 29         | IT         |
| 7          | Robert     | 31         | Operations |
| 8          | Emily      | 27         | Research   |
| 9          | Michael    | 33         | Development|
| 10         | Chris      | 26         | Support    |
+------------+------------+------------+------------+