本文介紹使用JindoFS SDK時(shí),E-MapReduce(簡(jiǎn)稱EMR)集群外如何以免密方式訪問(wèn)E-MapReduce JindoFS的文件系統(tǒng)。

前提條件

適用環(huán)境:ECS(EMR環(huán)境外)+Hadoop+JavaSDK。

背景信息

使用JindoFS SDK時(shí),需要把環(huán)境中相關(guān)Jindo的包從環(huán)境中移除,如jboot.jarsmartdata-aliyun-jfs-*.jar。如果要使用Spark則需要把/opt/apps/spark-current/jars/里面的包也刪除,從而可以正常使用。

步驟一:創(chuàng)建實(shí)例RAM角色

  1. 使用云賬號(hào)登錄RAM的控制臺(tái)
  2. 單擊左側(cè)導(dǎo)航欄的RAM角色管理
  3. 單擊創(chuàng)建 RAM 角色,選擇當(dāng)前可信實(shí)體類型為阿里云服務(wù)
  4. 單擊下一步
  5. 輸入角色名稱,從選擇授信服務(wù)列表中,選擇云服務(wù)器
  6. 單擊完成

步驟二:為RAM角色授予權(quán)限

  1. 使用云賬號(hào)登錄RAM的控制臺(tái)
  2. (可選)如果您不使用系統(tǒng)權(quán)限,可以參見(jiàn)賬號(hào)訪問(wèn)控制創(chuàng)建自定義權(quán)限策略章節(jié)創(chuàng)建一個(gè)自定義策略。
  3. 單擊左側(cè)導(dǎo)航欄的RAM角色管理
  4. 單擊新創(chuàng)建RAM角色名稱所在行的精確授權(quán)
  5. 選擇權(quán)限類型為系統(tǒng)策略自定義策略
  6. 輸入策略名稱。
  7. 單擊確定

步驟三:為實(shí)例授予RAM角色

  1. 登錄ECS管理控制臺(tái)
  2. 在左側(cè)導(dǎo)航欄,單擊實(shí)例與鏡像 > 實(shí)例
  3. 在頂部狀態(tài)欄左上角處,選擇地域。
  4. 找到要操作的ECS實(shí)例,選擇更多 > 實(shí)例設(shè)置 > 授予/收回RAM角色
    授予/收回RAM角色
  5. 在彈窗中,選擇創(chuàng)建好的實(shí)例RAM角色,單擊確定完成授予。

步驟四:在ECS上設(shè)置環(huán)境變量

執(zhí)行如下命令,在ECS上設(shè)置環(huán)境變量。
export CLASSPATH=/xx/xx/jindofs-2.5.0-sdk.jar
或者執(zhí)行如下命令。
HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/xx/xx/jindofs-2.5.0-sdk.jar

步驟五:測(cè)試免密方式訪問(wèn)的方法

  1. 使用Shell訪問(wèn)OSS。
    hdfs dfs -ls/-mkdir/-put/....... oss://<ossPath>
  2. 使用Hadoop FileSystem訪問(wèn)OSS。
    JindoFS SDK支持使用Hadoop FileSystem訪問(wèn)OSS,示例代碼如下。
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.LocatedFileStatus;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.fs.RemoteIterator;
    
    import java.net.URI;
    
    public class test {
        public static void main(String[] args) throws Exception {
            FileSystem fs = FileSystem.get(new URI("ossPath"), new Configuration());
            RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path("ossPath"), false);
            while (iterator.hasNext()){
                LocatedFileStatus fileStatus = iterator.next();
                Path fullPath = fileStatus.getPath();
                System.out.println(fullPath);
            }
        }
    }