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上建立叢集,具體操作請參見建立叢集。
操作流程
步驟一:開啟OSS-HDFS
開通並授權訪問OSS-HDFS服務,具體操作請參見開通並授權訪問OSS-HDFS服務。
步驟二:擷取HDFS服務網域名稱
在OSS管理主控台的概覽頁面,複製HDFS服務的網域名稱,在步驟三:在EMR叢集中使用OSS-HDFS中建立Hive表時會用到。

步驟三:在EMR叢集中使用OSS-HDFS
說明 本樣本以Hive操作OSS-HDFS為例介紹。您也可以參照此方式使用Spark操作OSS-HDFS。
- 登入叢集,具體操作請參見登入叢集。
- 建立指向OSS-HDFS的Hive表。
- 執行以下命令,進入Hive命令列。
hive - 執行以下命令,建立指向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的其他方式。
- 上述命令中的
- 執行以下命令,使用新建立的資料庫。
use dw; - 執行以下命令,在建立的資料庫下建立表。
CREATE TABLE IF NOT EXISTS employee(eid int, name String,salary String,destination String) COMMENT 'Employee details'; - 執行以下命令,查看錶資訊。
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
- 執行以下命令,進入Hive命令列。
- 向表中插入資料。使用INSERT INTO語句向表寫入資料,該語句會產生MapReduce作業。
INSERT INTO employee(eid, name, salary, destination) values(1, 'liu hua', '100.0', ''); - 驗證表資料。
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服務。