全部產品
Search
文件中心

MaxCompute:基於HMS+HDFS讀取Hadoop Hive資料

更新時間:Nov 28, 2025

本文以E-MapReduce的Hive為例,介紹在MaxCompute中如何建立外部schema,並查詢Hadoop中的Hive表資料。

適用範圍

目前僅華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華南1(深圳)、中國香港、新加坡和德國(法蘭克福)地區支援。

操作步驟

步驟一:前置準備

如已有Hive資料,可忽略此步驟。

  1. 開通E-MapReduce服務

  2. 建立MaxCompute專案

    MaxCompute與Hadoop叢集所在的VPC必須部署在同一地區。

  3. 為已建立的MaxCompute專案,開啟專案級中繼資料支援的Schema開關。

    1. 登入MaxCompute控制台,在左上方選擇地區。

    2. 在左側導覽列,選擇管理配置 > 项目管理

    3. 项目管理頁面,單擊目標專案操作列的升级到支持Schema层级

步驟二:準備Hive資料

如已有Hive資料,可忽略此步驟。

  1. 登入E-MapReduce控制台,在左上方選擇地區。

  2. 我的集群首頁面,單擊创建集群

    1. 软件配置

      在頂部功能表列處,根據實際情況選擇資源群組。資源群組預設顯示帳號全部資源。其他配置參數如下:

      參數名

      說明

      地域

      • 建立的叢集會在對應的地區內,一旦建立便無法修改。

      • MaxCompute與Hadoop叢集所在的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節點群組下的挂载公网開關,其餘使用預設值即可。

      集群伸缩

      配置Auto Scaling規則。

    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-MapReduce或Hadoop VPC網路的串連。

    重要

    VPC必須與MaxCompute外部資料源及外部資料源掛載的專案處於同一地區。

    參數詳情請參見訪問VPC方案(專線直連)中的建立MaxCompute與目標VPC網路間的網路連接步驟。

    集群名称

    必填

    在Hadoop叢集高可用環境下用於指代NameNode的名稱。

    以EMR叢集為例,叢集名稱的擷取方法如下:

    1. 登入E-MapReduce控制台,在左上方選擇地區。

    2. 單擊目的地組群ID,進入叢集詳情頁面。

    3. 集群服务頁簽,單擊HDFS服務的配置,進入配置頁面。

    4. 切換至hdfs-site.xml頁簽,在配置项名称欄搜尋dfs.nameservices,該配置項對應的值則為集群名称

    NameNode 地址

    必填

    目標Hadoop叢集的Active和Standby NameNode服務地址和連接埠號碼(連接埠號碼通常是8020)。

    以EMR叢集為例,NameNode地址的擷取方法如下:

    1. 登入E-MapReduce控制台,在左上方選擇地區。

    2. 單擊目的地組群ID,進入叢集詳情頁面。

    3. 集群服务頁簽,單擊HDFS服務的状态,進入状态頁面。

    4. 组件列表地區,單擊NameNode前面的image表徵圖,展開拓撲列表。

    5. 擷取master-1-1節點對應的内网 IPNameNode 地址格式即為內網IP:8020

    HMS 服务地址

    必填

    目標Hadoop叢集的Active和Standby NameNode的Hive中繼資料服務地址和連接埠號碼(連接埠號碼通常是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控制台檢查MaxCompute的VPC和安全性群組是否已經添加至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     | 
+------------+------------+------------+-------------+