基于HMS+HDFS读取Hadoop Hive数据

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

适用范围

目前仅华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华南1(深圳)、中国香港、新加坡和德国(法兰克福)地域支持。

操作步骤

步骤一:前置准备

如已有Hive数据,可忽略此步骤。

  1. 开通E-MapReduce服务

  2. 创建MaxCompute项目

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

  3. 为已创建的MaxCompute项目,开启项目级元数据支持的Schema开关。

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

    2. 在左侧导航栏,选择管理配置 > 项目管理

    3. 项目管理页面,单击目标项目操作列的升级到支持Schema层级

步骤二:准备Hive数据

如已有Hive数据,可忽略此步骤。

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

  2. 我的集群主页面,单击创建集群

    1. 软件配置

      在顶部菜单栏处,根据实际情况选择资源组。资源组默认显示账号全部资源。其他配置参数如下:

      参数名

      说明

      地域

      • 创建的集群会在对应的地域内,一旦创建便无法修改。

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

      业务场景

      本示例中选择自定义集群

      产品版本

      根据需求选择,推荐使用最新版本。

      服务高可用

      默认不开启。打开服务高可用开关后,EMR会把Master节点分布在不同的底层硬件上以降低故障风险。

      可选服务(至少一项)

      本文实践选择HADOOP-COMMON(3.2.1)HDFS(3.2.1)HIVE(3.1.3)以及YARN(3.2.1)

      允许采集服务运行日志

      默认开启采集。

      如果您有采集需求,可以在集群信息中,修改服务运行日志采集状态。

      元数据

      本示例中使用自建 RDS

      云上创建RDS步骤参见创建RDS MySQL实例与配置数据库

      • 用于生产环境的集群,建议使用 独立 RDS MySQL,可以选择使用阿里云高可用版本的 RDS MySQL 5.7

      • 填写RDS连接信息hivemetastore-site.xml

        • javax.jdo.option.ConnectionURL

          JDBC元数据连接,例如:jdbc:mysql://rds.host.name/hive_db_name

        • javax.jdo.option.ConnectionUserName

          元数据的数据库账号名。

        • javax.jdo.option.ConnectionPassword

          元数据的数据库密码。

      上述配置仅适用于本文实践,关于通过E-MapReduce控制台创建分析集群的详细操作请参见快速创建和使用数据湖分析集群

    2. 硬件配置

      参数名

      说明

      付费类型

      • 包年包月

      • 按量付费

      在测试场景下,建议使用按量付费,测试正常后可以释放该集群,再新建一个包年包月的生产集群正式使用。

      可用区

      集群创建后,无法直接更改可用区,请谨慎选择。

      专有网络

      选择对应区域下的专有网络。如果没有,单击创建VPC前往新建。创建专有网络完成后,单击刷新,可以选择刚创建的VPC。

      交换机

      选择在对应专有网络下可用区的交换机,如果在这个可用区没有可用的交换机,则需要新创建一个。

      默认安全组

      重要

      不支持使用ECS上创建的企业安全组。

      如果已有在使用的安全组,可以直接选择使用或新建安全组。

      节点组

      根据业务诉求,配置Master节点组、Core节点组或Task节点组信息。详情请参见选择硬件与网络

      本例中打开Master节点组下的挂载公网开关,其余使用默认值即可。

      集群伸缩

      配置弹性伸缩规则。

    3. 基础配置

      参数名

      说明

      集群名称

      集群的名字,长度限制为1~64个字符,仅可使用中文、字母、数字、短划线(-)和下划线(_)。

      身份凭证

      • 密钥对:如果希望在不输入密码的情况下进行身份验证,可以选择密钥对方式,更多详情请参见管理SSH密钥对

      • 密码:用于远程登录集群的Master节点。请记录该配置,登录集群时您需要输入该密码。

  3. 登录集群Master节点,进入Hive准备数据。

    1. 登录集群Master节点

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

      2. 单击目标集群对应的节点管理

      3. 节点管理页签,单击节点组所在行的image图标,单击节点ID进入实例详情页。

      4. 在节点ID实例页面,单击远程连接

      5. 在弹出的远程连接对话框,使用默认的通过Workbench远程连接,单击立即登录

      6. 在登录实例窗口根据实际情况填写该实例信息。

        说明

        在创建密钥对时,私钥会自动下载保存为.pem格式的私钥文件。认证方式可以选择SSH密钥认证,上传私钥文件,可以在不输入密码的情况下进行身份验证。

    2. 准备Hive测试数据。使用Workbench方式登录集群主节点后,在终端界面输入如下命令:

      [user@emr-node ~]$ hive
      
      -- 创建库
      hive> CREATE database IF NOT EXISTS myhive;
      
      -- 切换库
      hive> USE myhive;
      
      -- 创建非分区表
      hive> CREATE TABLE IF NOT EXISTS employees (
              id INT,
              name STRING,
              age INT,
              department STRING
            )
            ROW FORMAT DELIMITED
            FIELDS TERMINATED BY ','
            STORED AS TEXTFILE;
      
      -- 插入数据
      hive> 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');
      
      -- 创建分区表
      hive> 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);

      查询非分区表和分区表:

      -- 查询非分区表
      hive> 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
      
      -- 查询分区表
      hive> 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

步骤三:创建Hive+HDFS外部数据源

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

  2. 在左侧导航栏,选择管理配置 > 外部数据源 。

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

  4. 在弹出的新增外部数据源对话框,根据界面提示配置相关参数。参数说明如下:

    参数

    是否必填

    说明

    外部数据源类型

    必填

    选择Hive+HDFS

    外部数据源名称

    必填

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

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

    • 不能超过128个字符。

    例如hive_hdfs_mc。

    外部数据源描述

    选填

    根据需要填写。

    网络连接对象

    必填

    网络连接名称,选择或创建MaxCompute到阿里云E-MapReduceHadoop VPC网络的连接。

    重要

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

    参数详情请参见访问VPC方案(专线直连)中的创建MaxCompute与目标VPC网络间的网络连接步骤。

    集群名称

    必填

    Hadoop集群高可用环境下用于指代NameNode的名称。

    EMR集群为例,集群名称的获取方法如下:

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

    2. 单击目标集群ID,进入集群详情页面。

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

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

    NameNode 地址

    必填

    目标Hadoop集群的ActiveStandby NameNode服务地址和端口号(端口号通常是8020)。

    EMR集群为例,NameNode地址的获取方法如下:

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

    2. 单击目标集群ID,进入集群详情页面。

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

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

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

    HMS 服务地址

    必填

    目标Hadoop集群的ActiveStandby NameNodeHive元数据服务地址和端口号(端口号通常是9083)。

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

    2. 单击目标集群ID,进入集群详情页面。

    3. 集群服务页签,单击Hive服务的状态,进入状态页面。

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

    5. 获取master-1-1节点对应的内网 IPHMS 服务地址格式即为内网IP:9083

    认证类型

    必填

    暂时仅支持无认证方式。

    创建交换机

    必填

    MaxCompute通过VPC访问数据源,默认采用反向访问2.0技术方案,该方案需要配置特定可用区的交换机,打通元数据访问链路。

    各个Region可用交换机的可用区在界面提示中有说明,在要访问的数据源所在的VPC中,选择已有或新建满足可用区要求的交换机。

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

  6. 外部数据源页面,单击目标数据源对应的操作详情,可查看数据源详细信息。

步骤四:创建外部Schema

  1. 连接至MaxCompute项目。

  2. 使用如下代码创建外部Schema:

    -- 打开Schema语法开关。 
    SET odps.namespace.schema=true;
    
    CREATE EXTERNAL SCHEMA IF NOT EXISTS <YOUR_EXTERNAL_SCHEMA_NAME>
    WITH  <YOUR_EXTERNAL_DATASOURCE_NAME>
    ON 'myhive' ;

    参数说明

    • your_external_schema_name:创建的外部Schema名称,例如ex_hms_hdfs

    • your_external_datasource_name:在前一步骤MaxCompute中已创建的外部数据源名称,外部Schema归属的项目必须与外部数据源处于同一地域,示例为hive_hdfs_mc

    • myhive:在准备Hive数据阶段创建的Hive数据库名称。

步骤五:使用SQL访问Hadoop Hive数据

  1. 查询外部Schema内的表。

    SET odps.namespace.schema=true;
    SHOW tables IN <YOUR_EXTERNAL_SCHEMA_NAME>;
    
    -- 返回结果如下:
    ALIYUN$xxx:employees
    ALIYUN$xxx:employees_pt
    
    OK
    重要

    如果查询失败,可以尝试登录RDS控制台检查MaxComputeVPC和安全组是否已经添加至RDS白名单。安全组添加至白名单后至少需要等待5分钟才会生效。

  2. 查询外部Schema表明细。

    -- 查询非分区表。
    SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.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 <YOUR_EXTERNAL_SCHEMA_NAME>.employees_pt WHERE department='HR';
    
    -- 返回结果。
    +------------+------------+------------+------------+
    | id         | name       | age        | department | 
    +------------+------------+------------+------------+
    | 8          | Emily      | 27         | HR         | 
    | 9          | Michael    | 33         | HR         | 
    | 10         | Chris      | 26         | HR         | 
    +------------+------------+------------+------------+

步骤六:Hadoop数据源添加新数据

  1. 登录使用EMR创建的集群主节点,向Hive分区表插入新分区数据:

    INSERT INTO employees_pt PARTITION (department='Computer') 
      VALUES(11, 'Cily', 29),(12, 'Miky', 35);
     
     -- Hive侧查询分区表。
     hive> SELECT * FROM employees_pt;
     
     -- 查询结果。
     OK
    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客户端,在MaxCompute侧查询新增分区数据:

    SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.employees_pt WHERE department='Computer';
    
    -- 返回结果。
    +------------+------------+------------+------------+
    | id         | name       | age        | department | 
    +------------+------------+------------+------------+
    | 11         | Cily       | 29         | Computer   | 
    | 12         | Miky       | 35         | Computer   | 
    +------------+------------+------------+------------+

步骤七:将联邦外表的数据复制入数仓

-- 将联邦外表的数据复制到数仓中。
CREATE TABLE employees_copy AS SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.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     | 
+------------+------------+------------+-------------+