E-MapReduce環境下提供MetaService服務。基於此服務,您可以在E-MapReduce叢集中以免AK的方式訪問阿里雲資源。

預設應用角色

預設地,您在建立叢集時將需要向E-MapReduce服務授權一個應用角色(AliyunEmrEcsDefaultRole)。授權之後,您在E-MapReduce上的作業將可以無需顯式輸入AK來訪問阿里雲資源。AliyunEmrEcsDefaultRole預設授予以下權限原則:
{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:GetObject",
        "oss:ListObjects",
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:ListBuckets",
        "oss:AbortMultipartUpload"
      ],
      "Resource": "*",
      "Effect": "Allow"
    }
  ]
}
所以預設情況下,基於MetaService的作業將只能訪問OSS資料。如果您想基於MetaService訪問其他阿里雲資源,例如LogService等等,則需要給AliyunEmrEcsDefaultRole補充授予相應的許可權。以上操作需要登入RAM控制台完成。
注意 當前metaservice服務只支援OSS,LogService和MNS資料的免AK操作。請謹慎編輯,刪除預設角色,否則會造成叢集建立失敗或者作業運行失敗。

自訂應用角色

大多數情況下,您只需要使用預設應用角色或者修改預設應用角色即可。E-MapReduce同時支援您使用自訂的應用角色。在建立叢集時,您既可以使用預設應用角色,也可以選擇自訂應用角色。如何建立角色並授權給服務,請參考RAM的相關文檔

訪問MetaService

MetaService是一個HTTP服務,您可以直接存取這個HTTP服務來擷取相關Meta資訊:例如 “ curl http://localhost:10011/cluster-region” 可以獲得當前叢集所在Region。

當前MetaService支援以下幾類資訊:
  • Region: /cluster-region
  • 角色名稱: /cluster-role-name
  • AccessKeyId:/role-access-key-id
  • AccessKeySecret:/role-access-key-secret
  • SecurityToken:/role-security-token
  • 網路類型:/cluster-network-type

使用MetaService

基於MetaSerivce服務,我們可以在作業中免AK地訪問阿里雲資源,這樣可以帶來兩個優勢:
  • 降低AK泄漏的風險。基於RAM的使用方式,可以將安全風險降到最低。需要什麼許可權就給角色授予什麼許可權,做到許可權最小化。
  • 提高使用者體驗。尤其在互動式訪問OSS資源時,可以避免寫一長串的OSS路徑。
下面樣本幾種使用方式:
I. Hadoop命令列查看OSS資料
    舊方式: hadoop fs -ls oss://ZaH******As1s:Ba23N**************sdaBj2@bucket.oss-cn-hangzhou-internal.aliyuncs.com/a/b/c
    新方式: hadoop fs -ls oss://bucket/a/b/c
II. Hive建表
    舊方式:
        CREATE EXTERNAL TABLE test_table(id INT, name string)
        ROW FORMAT DELIMITED
        FIELDS TERMINATED BY '/t'
        LOCATION 'oss://ZaH******As1s:Ba23N**************sdaBj2@bucket.oss-cn-hangzhou-internal.aliyuncs.com/a/b/c';
    新方式:
        CREATE EXTERNAL TABLE test_table(id INT, name string)
        ROW FORMAT DELIMITED
        FIELDS TERMINATED BY '/t'
        LOCATION 'oss://bucket/a/b/c';
III. Spark
    舊方式: val data = sc.textFile("oss://ZaH******As1s:Ba23N**************sdaBj2@bucket.oss-cn-hangzhou-internal.aliyuncs.com/a/b/c")
    新方式: val data = sc.textFile("oss://bucket/a/b/c")