EMR-3.42及后續版本或EMR-5.8.0及后續版本的集群,支持OSS-HDFS(JindoFS服務)作為數據存儲,提供緩存加速服務和Ranger鑒權功能,使得在Hive或Spark等大數據ETL場景將獲得更好的性能和HDFS平遷能力。本文為您介紹E-MapReduce(簡稱EMR)Hive或Spark如何操作OSS-HDFS。

背景信息

OSS-HDFS服務是一款云原生數據湖存儲產品,基于統一的元數據管理能力,在完全兼容HDFS文件系統接口的同時,提供充分的POSIX能力支持,能更好的滿足大數據和AI領域豐富多樣的數據湖計算場景,詳細信息請參見OSS-HDFS服務概述

前提條件

已在EMR上創建集群,具體操作請參見創建集群

操作流程

  1. 步驟一:開啟OSS-HDFS
  2. 步驟二:獲取HDFS服務域名
  3. 步驟三:在EMR集群中使用OSS-HDFS

步驟一:開啟OSS-HDFS

開通并授權訪問OSS-HDFS服務,具體操作請參見開通并授權訪問OSS-HDFS服務

步驟二:獲取HDFS服務域名

在OSS管理控制臺的概覽頁面,復制HDFS服務的域名,在步驟三:在EMR集群中使用OSS-HDFS中創建Hive表時會用到。HDFS Endpoint

步驟三:在EMR集群中使用OSS-HDFS

說明 本示例以Hive操作OSS-HDFS為例介紹。您也可以參照此方式使用Spark操作OSS-HDFS。
  1. 登錄集群,具體操作請參見登錄集群
  2. 創建指向OSS-HDFS的Hive表。
    1. 執行以下命令,進入Hive命令行。
      hive
    2. 執行以下命令,創建指向OSS-HDFS的數據庫。
      CREATE DATABASE if not exists dw LOCATION 'oss://<yourBucketName>.<yourBucketEndpoint>/<path>';
      說明
      • 上述命令中的dw為數據庫名,<path>為任意路徑,<yourBucketName>.<yourBucketEndpoint>步驟二:獲取HDFS服務域名中您獲取到的HDFS服務的域名。
      • 本示例使用OSS-HDFS的域名作為路徑的前綴。如果您希望只使用Bucket名稱來指向OSS-HDFS,則可以配置Bucket級別的Endpoint或全局Endpoint,具體操作請參見附錄一:配置Endpoint的其他方式
    3. 執行以下命令,使用新創建的數據庫。
      use dw;
    4. 執行以下命令,在新建的數據庫下創建表。
      CREATE TABLE IF NOT EXISTS employee(eid int, name String,salary String,destination String)
      COMMENT 'Employee details';
    5. 執行以下命令,查看表信息。
      desc formatted employee;
      返回信息如下所示,通過Location參數可以看到該表指向的路徑已經在OSS-HDFS上。
      # col_name              data_type               comment
      
      eid                     int
      name                    string
      salary                  string
      destination             string
      
      # Detailed Table Information
      Database:               dw
      Owner:                  root
      CreateTime:             Fri May 06 16:40:06 CST 2022
      LastAccessTime:         UNKNOWN
      Retention:              0
      Location:               oss://****.cn-hangzhou.oss-dls.aliyuncs.com/dw/employee
      Table Type:             MANAGED_TABLE
  3. 向表中插入數據。
    使用INSERT INTO語句向表寫入數據,該語句會產生MapReduce作業。
    INSERT INTO employee(eid, name, salary, destination) values(1, 'liu hua', '100.0', '');
  4. 驗證表數據。
    SELECT * FROM employee WHERE eid = 1;
    返回信息中會包含插入的數據。
    OK
    1       liu hua 100.0
    Time taken: 12.379 seconds, Fetched: 1 row(s)

為EMR集群授權

如果您的EMR集群不是使用的默認AliyunECSInstanceForEMRRole實例角色,則需要為EMR集群授權。

當前EMR的實例角色AliyunECSInstanceForEMRRole,其關聯的AliyunECSInstanceForEMRRolePolicy默認已經添加了oss:PostDataLakeStorageFileOperation策略,因此默認情況下,您無需重新對EMR授權訪問OSS-HDFS服務。