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服务。