私はPythonスクリプトを使用してLinuxの外部ディスクから読み書きを試みていますが、うまくいきます。タスクスケジューラを使用してPythonプログラムを実行すると問題が発生します。
私はこれらすべてをRocks Cluster(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
次に、小さなbashスクリプト(job_submit.sh)を作成し、次のようにスケジューラ(SGE)に送信します。
#!/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の書き込み場所を外部ディスクではなくローカルディスクの場所に変更すると、問題を解決できます(ファイルを読み取るときに同様のエラーが発生します)。 )/書き込みの代わりにディレクトリ)。そのため、スケジューラがマウントされたドライブとうまく機能しないようです。確かに問題があるようですが、次に何を試すべきかわかりません。どんな助けでも大変感謝します。
答え1
クラスタジョブスケジューラ(Sun Grid Engine、HTCondor、SLURMなど)は、マスターまたはジョブ送信ホスト以外のシステムでジョブを実行できます。そのため、マスターまたはジョブ送信ホストにのみ公開されるファイルシステムは、クラスタのジョブ実行システムで使用できない可能性があります。ジョブスケジューラには、ジョブが実行されているシステムを示すログまたはフラグが含まれている場合があります。ジョブを送信するか、ジョブが実行されているシステムls
でdf
使用可能なファイルシステムを確認してジョブを実行することもできます。利用できないNFSハードマウントがある場合は、ディレクトリまたはどのファイルシステムが利用可能かを確認するために操作が中断されます(クラスタソフトウェアによって異なります)。ファイルシステムが利用できない場合は、NFS(または他のネットワークファイルシステム)を介して使用できるようにする必要があります。別のオプションは、ジョブスケジューラソフトウェアが必要なファイルをジョブが実行されるホストにコピーすることです。ただし、これを行う方法は使用されるジョブスケジューラによって異なり、出力をコピーする必要があるかもしれません。ファイルは他の場所にコピーされます。作業が完了しました。)
ネットワークファイルシステムを複製するか依存するかは、データ量によって異なります。少量のデータは簡単に複製できますが、作業に必要な大規模なデータストアにはネットワークファイルシステムを使用することをお勧めします。さらに、多数のクライアントは簡単にNFSサーバーに過負荷を引き起こす可能性があります。出力(特に一時出力)は、ジョブが実行されているシステムのローカルファイルシステムに書き込まれ、結果のみがNFSサーバーに書き込まれます。 。