この記事では、10 GB のデータを OSS バケットから仮想マシン (VM) のディレクトリにマウントする方法など、バッチコンピューティングでローカルファイルにアクセスしてデータを使用できるようにする方法について説明します。
10 GB のデータが OSS バケットの oss://mybucket/mydir/
ディレクトリに保存されているとします。
この OSS ディレクトリを、タスクプログラムによってローカルディレクトリとして扱われる /home/admin/mydir/
ディレクトリにマウントできます。
注: Windows イメージを使用する場合、ディレクトリはドライブ (「E:」など) にのみマウントでき、フォルダーにはマウントできません。
OSS API は従来のファイルシステム API とは異なります。従来のプログラムの迅速な移行をサポートするために、バッチコンピューティングでは、OSS ディレクトリを VM のローカルファイルシステムに直接マウントできます。これにより、アプリケーションは OSS バケットをプログラミングすることなく、OSS バケット内のデータにアクセスできます。
OSS マウントは、読み取り専用マウントと書き込み可能マウントに分けられます。
読み取り専用マウントモードは、プログラムの入力データにアクセスするために使用されます。読み取り専用マウントポイントでのデータアクセス要求は、OSS アクセス要求に自動的に変換され、データを VM のローカルファイルにダウンロードする必要はありません。
書き込み可能マウントディレクトリに書き込まれた結果データは、VM のローカルファイルに保存され、ジョブの完了時に OSS バケットの対応する場所に自動的にアップロードされます。書き込み可能マウントモードでは、VM に結果データ用の十分なディスク容量が割り当てられていることを確認してください。
1. データディレクトリのマウント
次の例を参照して、ジョブの送信時にマウントパラメータを設定できます。
1.1. Java SDK の使用
TaskDescription taskDesc = new TaskDescription();
taskDesc.addInputMapping("oss://mybucket/mydir/", "/home/admin/mydir/"); //読み取り専用マウント
taskDesc.addOutputMapping("/home/admin/mydir/", "oss://mybucket/mydir/"); //書き込み可能マウント
1.2. Python SDK の使用
# 読み取り専用マウント
job_desc['DAG']['Tasks']['my-task']['InputMapping'] = {
"oss://mybucket/mydir/": "/home/admin/mydir/"
}
# 書き込み可能マウント
job_desc['DAG']['Tasks']['my-task']['OutputMapping'] = {
"/home/admin/mydir/": "oss://mybucket/mydir/"
}
1.3. コマンドラインツールの使用
bcs sub "python main.py" -r oss://mybucket/mydir/:/home/admin/mydir/ // 複数のマッピングを区切るにはコンマを使用します。
注: InputMapping が設定されている場合、読み取り専用マウントモードが使用されます。ディレクトリは読み取ることができますが、書き込みや削除はできません。OutputMapping が設定されている場合、/home/admin/mydir/ ディレクトリに書き込まれたファイルまたはディレクトリは、ジョブの完了後に oss://mybucket/mydir/ に自動的にアップロードされます。InputMapping と OutputMapping を同じディレクトリにマウントすることはできません。
2. プログラムディレクトリのマウント
質問: OSS バケットに main.py というプログラムがあります。このプログラムをバッチコンピューティングでどのように使用できますか?
main.py が OSS バケットの oss://mybucket/myprograms/main.py に保存されているとします。
oss://mybucket/myprograms/ を /home/admin/myprograms/ にマウントします。
コマンドライン python /home/admin/myprograms/main.py を実行します。
2.1. Java SDK の使用
TaskDescription taskDesc = new TaskDescription();
taskDesc.addInputMapping("oss://mybucket/myprograms/", "/home/admin/myprograms/"); //読み取り専用マウント
Command cmd = new Command()
cmd.setCommandLine("python /home/admin/myprograms/main.py")
params.setCommand(cmd);
taskDesc.setParameters(params);
2.2. Python SDK の使用
# 読み取り専用マウント
job_desc['DAG']['Tasks']['my-task']['InputMapping'] = {
"oss://mybucket/myprograms/": "/home/admin/myprograms/"
}
job_desc['DAG']['Tasks']['my-task']['Parameters']['Command']['CommandLine']='python /home/admin/myprograms/main.py'
2.3. コマンドラインツールの使用
bcs sub "python /home/admin/myprograms/main.py" -r oss://mybucket/myprograms/:/home/admin/myprograms/
3. ファイルのマウント
質問: OSS バケット内の異なるプレフィックスのファイルを、バッチコンピューティング上の VM の同じディレクトリにバッチでマウントするにはどうすればよいですか?
bucket1 と bucket2 の 2 つのファイルをそれぞれ VM のローカルディレクトリ /home/data/
にマウントするとします。
oss://bucket1/data/file1
を /home/data/file1
にマウントします。
oss://bucket2/data/file2
を /home/data/file2
にマウントします。
さらに、VM から bucket1 と bucket2 に 2 つのローカルファイルをアップロードするとします。
/home/output/output1
を oss://bucket1/output/file1
にマウントします。
/home/output/output2
を oss://bucket2/output/file2
にマウントします。
次の例を参照してください。
3.1. Java SDK の使用
TaskDescription taskDesc = new TaskDescription();
taskDesc.addInputMapping("oss://bucket1/data/file1", "/home/data/file1");
taskDesc.addInputMapping("oss://bucket2/data/file2", "/home/data/file2");
taskDesc.addOutputMapping("/home/output/output1", "oss://bucket1/output/file1");
taskDesc.addOutputMapping("/home/output/output2", "oss://bucket2/output/file2");
3.2. Python SDK の使用
# 読み取り専用マウント
job_desc['DAG']['Tasks']['my-task']['InputMapping'] = {
"oss://bucket1/data/file1": "/home/data/file1",
"oss://bucket2/data/file2": "/home/data/file2"
}
# 書き込み可能マウント
job_desc['DAG']['Tasks']['my-task']['OutputMapping'] = {
"/home/output/output1": "oss://bucket1/output/file1",
"/home/output/output2": "oss://bucket2/output/file2"
}
4. InputMapping マウントの制限
4.1. OSS 上のストレージオブジェクトの命名
単一のファイル名は最大 255 バイトを含めることができます。他の文字が占めるバイト数は、UTF-8 エンコーディング後の文字が実際に占めるバイト数に従って計算されます。一般的に、漢字は 3 バイトに相当します。
ルートディレクトリから計算されるパス + ファイル名の最大長は 1023 バイトです。
有効なファイル名は、UTF-8 文字セットに従って定義されます。他の文字セットは UTF-8 エンコードしてから、ファイル名の有効性を確認する必要があります。
UTF-8 0x80 以降のすべての文字がサポートされています。
0x00-0x1F と 0x7F の文字、および \, /, :, *, ?, “, <, >, | はサポートされていません。
4.2. InputMapping マウントファイルへのアクセス許可
複数のノードによる OSS バケットへのファイル書き込みの一貫性を考慮して、InputMapping マウントは OSS バケットに対する読み取り専用のアクションであり、ファイルシステムインターフェースを介したアプリケーションの操作では、いかなる状況においても OSS バケット内のファイルが変更または削除されることはありません。
マウントされたディレクトリへの変更はすべてローカルファイルにキャッシュされます。変更後の内容は、アプリケーションがファイルシステムインターフェースを介して読み取ることができますが、OSS バケットに自動的に同期されることはありません。アプリケーションの実行が終了すると、ファイルシステムはアンマウントされ、マウントサービスは無効になり、ローカルにキャッシュされたすべての変更は破棄されます。マウントサービスが有効で、ファイルシステムがマウントされている場合、ローカルファイルは OSS オブジェクト内のオブジェクトの内容と同じであり、最後の変更は保持されません。
マウントされたディレクトリでは、OSS バケット内の既存のファイルには読み取りと実行の権限が割り当てられますが、書き込み権限は割り当てられません。アプリケーションはファイルを読み取ることができますが、ファイルの変更、インターセプト、名前変更、削除はできません。
マウントされたディレクトリでは、アプリケーションは自由にファイルとフォルダーを作成でき、それらには読み取り、書き込み、実行の権限が割り当てられます。アプリケーションはこれらのファイルを変更、インターセプト、名前変更、削除できます。
Windows オペレーティングシステムでは、読み取り専用フォルダーの内容を削除することはできません。したがって、OSS バケット内の既存のフォルダーでは、アプリケーションはフォルダー内のファイルの作成、変更、インターセプトはできますが、ファイルの削除や名前変更はできません。たとえば、\127.0.0.1\ossdata\bucket\dir は OSS バケット内のフォルダーです。アプリケーションがマウント後にこのディレクトリに「file」という名前のファイルを作成した場合、ファイル \127.0.0.1\ossdata\bucket\dir\file は削除または名前変更できません。ただし、\127.0.0.1\ossdata\bucket\dir の下に「local」という名前のフォルダーが作成された場合、\127.0.0.1\ossdata\bucket\dir\local の下に作成されたファイルは削除および名前変更できます (例: \127.0.0.1\ossdata\bucket\dir\local\file)。この制限は Linux オペレーティングシステムには存在しません。
4.3. マウント言語
OSS バケット内のすべてのオブジェクト名は、UTF-8 エンコーディング後に保存されます。マウントサービスは文字セットを変換できます。クラスター/ジョブの説明で、アプリケーションが使用する文字セットを指定する必要があります。マウントサービスによって文字セットが変換された後でのみ、アプリケーションは正しいファイルにアクセスできます。
アプリケーションが使用する文字セットは、オペレーティングシステムのデフォルトの文字セットとは異なる場合があることに注意してください。たとえば、繁体字中国語のアプリケーションが簡体字中国語のオペレーティングシステムで実行されている場合、文字セットは BIG5 である必要があります。このように、マウントサービスは OSS バケット内の UTF-8 エンコードされたパスとファイル名を BIG5 エンコードされたものに自動的に変換します。マウントされたディスク内のファイル名はオペレーティングシステムでは文字化けしますが、アプリケーションがアクセスするファイル名は正しいです。
文字セット変換関数はファイル名にのみ影響します。ファイルの内容には影響しません。
4.4. ファイルロック
NFS ベースの DOS 共有とファイルロックはパフォーマンスに影響します。I/O 操作が頻繁に行われる場合は、マウント中に nolock オプションを追加してファイルロックを無効にすることをお勧めします。ただし、3DSMAX などの一部のアプリケーションでは、ファイルロックを無効にするとアプリケーションの実行に失敗する可能性があるため、ファイルロックを使用する必要があります。
4.5. ファイルマウント
OSS バケット内の個別のファイルを VM のローカルファイルにマウントするには、すべてのファイルにアクセスできるローカルディレクトリが、別のファイルまたはディレクトリがマウントされている親ディレクトリではないことを確認してください。
4.6. その他の規則
OSS アプリケーションの実行中は、アプリケーションがアクセスしているマウントされたフォルダーを変更しないでください。変更すると競合が発生する可能性があります。アプリケーションがアクセスしているデータに対する変更 (ファイルの内容の削除または変更、ファイルのインターセプト、ファイルの内容の追加などを含むがこれらに限定されない) は、アプリケーションの実行エラーにつながる可能性があります。
OSS バケットの容量はほぼ無限です。オペレーティングシステムによって収集された現在のディスク使用状況の統計は、OSS バケットのバケットの現在の使用状況を示すものではなく、したがって意味がありません。
同じバケット内の複数のディレクトリを一度に異なる場所にマウントできます。
同じアカウント内の複数のバケットの内容を一度に異なる場所にマウントできます。
一度にマウントできるのは、複数のアカウントではなく、1 つのアカウントのファイルのみです。