このトピックでは、JindoFS SDK を使用し、E-MapReduce (EMR) クラスター外のクライアントから EMR 上の JindoFS ファイルシステムへのパスワードなしのアクセスを有効にする方法を説明します。
前提条件
この手順は、EMR クラスター外にあり、Hadoop と Java SDK がインストールされている ECS インスタンスが対象です。
背景情報
JindoFS SDK を使用する場合、環境から関連する Jindo パッケージ (jboot.jar や smartdata-aliyun-jfs-*.jar など) を削除する必要があります。Spark を使用する場合は、正常に機能させるために、/opt/apps/spark-current/jars/ ディレクトリからもパッケージを削除する必要があります。
ステップ 1: インスタンス RAM ロールの作成
-
Alibaba Cloud アカウントを使用して、Resource Access Management (RAM) コンソールにログインします。
-
左側のナビゲーションペインで、 を選択します。
-
[ロールの作成] をクリックします。[Alibaba Cloud サービス] で、Alibaba Cloud サービス を選択します。
-
[次へ] をクリックします。
-
[ロール名] を入力します。[信頼できるサービスの選択] リストから、[Elastic Compute Service] を選択します。
-
[Complete] をクリックします。
ステップ 2: RAM ロールへの権限の付与
-
Alibaba Cloud アカウントを使用して、RAM コンソールにログインします。
-
(オプション) システムポリシーが要件を満たしていない場合は、カスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。
-
左側のナビゲーションペインで、 を選択します。
-
作成したロールの名前をクリックします。
-
[Input and Attach] をクリックします。
-
[システムポリシー] で、システムポリシー または [カスタムポリシー] を選択します。
例えば、
AliyunOSSReadOnlyAccessポリシーを使用できます。ニーズに応じてポリシーを選択してください。 -
名前でポリシーを検索し、クリックして右側のパネルに追加します。
-
[OK] をクリックします。
ステップ 3: インスタンスへの RAM ロールのアタッチ
-
ECS コンソールにログインします。
-
左側のナビゲーションペインで、 を選択します。
-
上部のナビゲーションバーで、インスタンスのリージョンを選択します。
-
対象の ECS インスタンスを見つけます。アクション 列で、 を選択します。
-
ダイアログボックスで、作成したインスタンス RAM ロールを選択し、[OK] をクリックします。
ステップ 4: 環境変数の設定
ECS インスタンスで次のコマンドを実行して、CLASSPATH 環境変数を設定します。プレースホルダーパスを JindoFS SDK ファイルのパスに置き換えてください。
export CLASSPATH=/path/to/jindofs-x.y.z-sdk.jar
または、次のコマンドを実行して HADOOP_CLASSPATH 変数を更新します。プレースホルダーパスを JindoFS SDK ファイルのパスに置き換えてください。
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/path/to/jindofs-x.y.z-sdk.jar
ステップ 5: パスワードなしのアクセスの確認
-
シェルから Object Storage Service (OSS) にアクセスします。
hdfs dfs -ls oss://<your-bucket-name>/ -
Hadoop ファイルシステム API を使用して OSS にアクセスします。
JindoFS SDK を使用すると、Hadoop ファイルシステム API を使用して OSS にアクセスできます。以下はコード例です。この例では、
ossPathをoss://your-bucket-name/your-directory/などの 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 { String ossPath = "oss://your-bucket-name/your-directory/"; 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); } } }