Linuxの外部ディスクからPythonスクリプトを使用して読み取り/書き込みを行おうとしていますが、これは正常に機能します。問題は、ジョブスケジューラを使用してPythonプログラムを実行するときに発生します。
私はこれらすべてをRocksCluster(LinuxバージョンはCentOS 6.5)で実行しており、ジョブスケジューラはSun Grid Engine(SGE)です。すべてのユーザーが読み取りおよび書き込み権限を持つように、外部ディスクをマウントしました。ディスクをマウントするためのfstabからの行は次のとおりです。
/dev/sdb1 /mnt/drive ntfs-3g auto,users,permissions 0 0
失敗する簡単な例を挙げましょう。次のPythonプログラム(simple_write.py):
#!/usr/bin/env python2.7
f = open('/mnt/drive/sean/test.txt', 'w')
f.write('Writing in the file')
f.close()
次のような端末で実行すると、正常に実行されます。
python2.7 /home/sean/simple_write.py
次に、次のようにスケジューラ(SGE)に送信するための小さなbashスクリプト(job_submit.sh)を作成するとします。
#!/bin/bash
#
#$ -cwd
#$ -j y
#$ -S /bin/bash
python2.7 /home/sean/simple_write.py
ターミナルから送信します。
qsub job_submit.sh
次に、次の(Python)エラーが発生します。
IOError: [Errno 2] No such file or directory: '/mnt/drive/sean/test.txt'
この問題は、(a)simple_write.pyを端末から直接実行するか、(b)simple_write.pyの書き込み場所を外部ディスクではなくローカルディスクのどこかに変更することで解決できます(ファイルの読み取りでも同様のエラーが発生します) / directoryを書き込むのではなく)。したがって、マウントされたドライブでスケジューラーがうまく機能しないという問題があるようですが、次に何を試すか迷っています。どんな助けでも大歓迎です。
クラスタジョブスケジューラ(Sun Grid Engine、HTCondor、SLURMなど)は、マスターまたはジョブ送信ホスト以外のシステムでジョブを実行する場合があります。したがって、マスターまたはジョブ送信ホストでのみ公開されているファイルシステムは、クラスター内のジョブ実行システムで使用できない場合があります。ジョブスケジューラは、ジョブが実行されているものを示すために、システムログまたはフラグを有していてもよく、または利用可能なファイルシステムは、その実行するジョブをサブミットすることによって検査することができますls
かdf
それが実行されているシステムでは(ただし、使用できないNFSハードマウントがある場合、そのようなジョブはI / Oでブロックされる可能性があります。その場合、ジョブはクラスターソフトウェアに従ってスタックします)、ディレクトリかどうかを判断します。ファイルシステムが利用可能です。ファイルシステムが利用できない場合は、NFS(または他のネットワークファイルシステム)を介して利用できるようにする必要があります。別のオプションとして、ジョブスケジューラソフトウェアに、ジョブが実行されるホストに必要なファイルをコピーさせることもできますが、これを行う方法は、使用するジョブスケジューラによって異なります(おそらく、出力ファイルは他の場所にコピーする必要があります)。ジョブが完了したら)。
ネットワークファイルシステムをコピーするか依存するかはデータの量に依存しますが、少量のデータは簡単にコピーできますが、ジョブが処理するデータの大規模なリポジトリはネットワークファイルシステムの使用を優先します。また、多数のクライアントがNFSサーバーに簡単に過負荷をかける可能性があることにも注意してください。出力(特に一時出力)は、ジョブ実行システムのローカルファイルシステムに書き込む必要があり、結果のみをNFSサーバーに書き込む必要がある場合があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加