全部產品
Search
文件中心

E-MapReduce:通過RootPolicy訪問OSS-HDFS

更新時間:Jul 05, 2025

OSS-HDFS服務支援RootPolicy。通過RootPolicy,您可以為OSS-HDFS服務設定自訂首碼。此功能使得Serverless Spark能夠在無需修改原有訪問hdfs://首碼的任務的情況下,直接操作OSS-HDFS上的資料。

前提條件

  • 已建立Serverless Spark工作空間,詳情請參見建立工作空間

  • 已建立開通OSS-HDFS服務的EMR on ECS叢集,詳情請參見建立叢集

配置RootPolicy

說明

若您已為叢集的OSS-HDFS服務配置了RootPolicy,請跳過配置章節,直接閱讀使用RootPolicy

  1. 配置環境變數。

    1. 串連ECS執行個體。具體操作,請參見串連ECS執行個體

    2. 下載JindoFS命令列工具

    3. 配置存取金鑰和環境變數。

      1. 進入已安裝的Jindofs JAR包下的bin目錄。

        以下以jindofs-sdk-x.x.x-linux為例,x.x.x替換為對應的版本號碼。

        cd jindofs-sdk-x.x.x-linux/bin/
      2. 在bin目錄下建立設定檔jindofs.cfg,並配置阿里雲帳號的存取金鑰(包括Accesskey ID和Accesskey Secret),或者滿足許可權要求的RAM使用者的存取金鑰。

        [client]
        fs.oss.accessKeyId = <key>              
        fs.oss.accessKeySecret = <secret>
      3. 設定環境變數。

        說明

        <JINDOSDK_CONF_DIR>填寫jindofs.cfg設定檔所在的絕對路徑。

        export JINDOSDK_CONF_DIR=<JINDOSDK_CONF_DIR>
  2. 設定RootPolicy。

    您可以通過SetRootPolicy命令為指定Bucket註冊自訂首碼訪問地址,配置命令如下:

    ./jindofs admin -setRootPolicy oss://<bucket_name>.<dls_endpoint>/ hdfs://<your_ns_name>/

    以上命令涉及的各項參數說明如下:

    參數

    說明

    bucket_name

    填寫已開通OSS-HDFS服務的Bucket名稱。

    dls_endpoint

    開通OSS-HDFS服務所在地區對應的Endpoint,例如cn-hangzhou.oss-dls.aliyuncs.com

    如果您不希望在每一次使用RootPolicy相關命令時重複添加<dls_endpoint>選項,您可以選擇以下任意方式在Hadoop的core-site.xml檔案中添加配置項。

    • 方式一

      <configuration>
          <property>
              <name>fs.oss.endpoint</name>
              <value><dls_endpoint></value>
          </property>
      </configuration>
    • 方式二

      <configuration> 
       <property>
              <name>fs.oss.bucket.<bucket_name>.endpoint</name>
              <value><dls_endpoint></value>
          </property>
      </configuration>

    your_ns_name

    自訂訪問OSS-HDFS服務的nsname,支援任意非Null 字元串,例如test,目前的版本僅支援根目錄。

  3. 配置Access Policy發現地址和Scheme實作類別。

    您需要在Hadoop的core-site.xml檔案中完成以下配置項。

    <configuration>
        <property>
            <name>fs.accessPolicies.discovery</name>
            <value>oss://<bucket_name>.<dls_endpoint>/</value>
        </property>
        <property>
            <name>fs.AbstractFileSystem.hdfs.impl</name>
            <!-- 請根據Hadoop版本選擇fs.AbstractFileSystem.hdfs.impl -->
            <!-- Hadoop 2.x使用com.aliyun.jindodata.hdfs.v28.HDFS -->
            <!-- hadoop 3.x使用com.aliyun.jindodata.hdfs.v3.HDFS -->
            <value>com.aliyun.jindodata.hdfs.v3.HDFS</value>
        </property>
        <property>
            <name>fs.hdfs.impl</name>
            <!-- 請根據Hadoop版本選擇 fs.hdfs.impl -->
            <!-- Hadoop 2.x使用 com.aliyun.jindodata.hdfs.v28.JindoDistributedFileSystem -->
            <!-- Hadoop 3.x使用 com.aliyun.jindodata.hdfs.v3.JindoDistributedFileSystem -->
            <value>com.aliyun.jindodata.hdfs.v3.JindoDistributedFileSystem</value>
        </property>
    </configuration>

    如果您需要為多個Bucket配置Access Policy發現地址和Scheme實作類別,則多個Bucket之間需使用逗號,分隔,例如<value>oss://<bucket1_name>.<dls_endpoint>, oss://<bucket2_name>.<dls_endpoint>/</value>

  4. 驗證是否已成功配置RootPolicy。

    hadoop fs -ls hdfs://<your_ns_name>/

    返回以下結果,說明已成功配置RootPolicy。

    drwxr-x--x   - hdfs  hadoop          0 2025-06-30 12:27 hdfs://<your_ns_name>/apps
    drwxrwxrwx   - spark hadoop          0 2025-06-30 12:27 hdfs://<your_ns_name>/spark-history
    drwxrwxrwx   - hdfs  hadoop          0 2025-06-30 12:27 hdfs://<your_ns_name>/tmp
    drwxrwxrwx   - hdfs  hadoop          0 2025-06-30 12:27 hdfs://<your_ns_name>/user
  5. 使用自訂首碼訪問OSS-HDFS服務。

    重啟Hive、Spark等服務後,您可以通過使用自訂首碼訪問OSS-HDFS服務。

  6. (可選)RootPolicy其他用法。

    • 列舉指定Bucket當前註冊的所有首碼地址

      您可以通過listAccessPolicies命令列舉指定Bucket當前註冊的所有首碼地址。

      ./jindofs admin -listAccessPolicies oss://<bucket_name>.<dls_endpoint>/
    • 刪除指定Bucket當前註冊的所有首碼地址

      您可以通過unsetRootPolicy命令刪除指定Bucket當前註冊的所有首碼地址。

      ./jindofs admin -unsetRootPolicy oss://<bucket_name>.<dls_endpoint>/ hdfs://<your_ns_name>/

使用RootPolicy

情境一:在Notebook會話中使用

  1. 配置Spark配置。

    1. EMR Serverless Spark頁面,單擊左側導覽列中的會話管理

    2. Notebook會話頁面,單擊建立Notebook會話

    3. 建立Notebook會話頁面,配置以下Spark 配置

    spark.hadoop.fs.accessPolicies.discovery      oss://<buckename>.cn-<region>.oss-dls.aliyuncs.com
    spark.hadoop.fs.AbstractFileSystem.hdfs.impl  com.aliyun.jindodata.hdfs.v3.HDFS
    spark.hadoop.fs.hdfs.impl                     com.aliyun.jindodata.hdfs.v3.JindoDistributedFileSystem
  2. 在資料開發Notebook任務中直接使用通過RootPolicy為OSS-HDFS服務設定自訂首碼。

    --建表
    spark.sql("""CREATE TABLE default.my_orc_table (
        id INT,
        name STRING,
        age INT
    ) 
    location 'hdfs://<ns_name>/user/hive/warehouse/ads_user_info_1d_emr/my_orc_table/'""")
    
    --插入資料
    spark.sql("""INSERT INTO table default.my_orc_table(id, name, age) VALUES (1, 'Alice', 30)""");
    
    --查詢
    spark.sql("SELECT * FROM default.my_orc_table").show()
    說明

    建表語句中“<ns_name>”需替換成您訪問OSS-HDFS服務的自訂首碼。

    image

說明

Notebook的!hadoop fs命令暫不支援RootPolicy。

情境二:在SQL會話中使用

  1. 配置Spark配置。

    1. EMR Serverless Spark頁面,單擊左側導覽列中的會話管理

    2. SQL會話頁面,單擊建立SQL會話

    3. 建立SQL會話頁面,配置以下Spark 配置

    spark.hadoop.fs.accessPolicies.discovery      oss://<buckename>.cn-<region>.oss-dls.aliyuncs.com
    spark.hadoop.fs.AbstractFileSystem.hdfs.impl  com.aliyun.jindodata.hdfs.v3.HDFS
    spark.hadoop.fs.hdfs.impl                     com.aliyun.jindodata.hdfs.v3.JindoDistributedFileSystem
  2. 在資料開發SparkSQL任務中直接使用通過RootPolicy為OSS-HDFS服務設定自訂首碼。

    --建表
    CREATE TABLE default.my_orc_table1 (
        id INT,
        name STRING,
        age INT
    ) 
    location "hdfs://<ns_name>/user/hive/warehouse/ads_user_info_1d_emr/my_orc_table1/";
    --插入資料
    INSERT INTO table default.my_orc_table1(id, name, age)
    VALUES (1, 'Alice', 30);
    --查詢
    select * from default.my_orc_table1;
    說明

    建表語句中“<ns_name>”需替換成您訪問OSS-HDFS服務的自訂首碼。

    image

情境三:在批任務中使用

  1. 上傳檔案。本文示範樣本SQL檔案test.sql

    1. EMR Serverless Spark頁面,單擊左側導覽列中的檔案管理

    2. 託管檔案目錄頁面,單擊上傳檔案

    3. 上傳檔案對話方塊中,單擊待上傳檔案地區選取項目本地檔案,或者直接拖拽目標檔案到待上傳檔案地區。

  2. 配置Spark配置。

    1. EMR Serverless Spark頁面,單擊左側導覽列中的資料開發

    2. 開發目錄頁簽下,單擊image(建立)表徵圖。

    3. 在彈出的對話方塊中,輸入名稱,選擇批任務類型下的SQL任務,然後單擊確定

    4. 任務配置頁面,配置以下Spark 配置

      spark.hadoop.fs.accessPolicies.discovery      oss://<buckename>.cn-<region>.oss-dls.aliyuncs.com
      spark.hadoop.fs.AbstractFileSystem.hdfs.impl  com.aliyun.jindodata.hdfs.v3.HDFS
      spark.hadoop.fs.hdfs.impl                     com.aliyun.jindodata.hdfs.v3.JindoDistributedFileSystem
  3. 在資料開發頁面單擊運行,單擊運行,結果如下。image

常見問題

!Hadoop fs命令使用RootPolicy設定的自訂首碼報錯。

  • 問題現象:在Notebook任務中,執行!hadoop fs -ls hdfs://<ns_name>/命令,出現一下錯誤資訊。

    init failed, Caused by error 30004: Invalid argument: Neither fs.hdfs.test.dfs.ha.namenodes nor dfs.ha.namenodes.test is configured for HA namenodes
    ERROR: code=1002, message=ERROR: failed to init filesystem.
  • 問題原因:目前Notebook的!hadoop fs命令暫不支援RootPolicy。

  • 解決方案:Notebook的!hadoop fs命令建議使用原OSS-HDFS地址。