私のdjangoプロジェクトには、セロリのタスクを実行するビューがあります。セロリタスク自体がサブプロセス/ファブリックを介していくつかのmap/reduceジョブをトリガーし、hadoopジョブの結果がディスクに保存されます---データベースには実際には何も保存されません。Hadoopジョブが完了すると、セロリタスクは次のように完了したことを示すdjangoシグナルを送信します。
# tasks.py
from models import MyModel
import signals
from fabric.operations import local
from celery.task import Task
class Hadoopification(Task):
def run(self, my_model_id, other_args):
my_model = MyModel.objects.get(pk=my_model_id)
self.hadoopify_function(my_model, other_args)
signals.complete_signal.send(
sender=self,
my_model_id=my_model_id,
complete=True,
)
def hadoopify_function(self, my_model, other_args):
local("""hadoop jar /usr/lib/hadoop/hadoop-streaming.jar -D mapred.reduce.tasks=0 -file hadoopify.py -mapper "parse_mapper.py 0 0" -input /user/me/input.csv -output /user/me/output.csv""")
本当に困惑しているのは、セロリタスクの実行時にdjango runserverがリロードされていることです。まるで、djangoプロジェクトのどこかでコードを変更したかのようです(まだ変更していません)。時々、これはrunserverコマンドでエラーを引き起こし、runserverコマンドがリロードして再びOKになる前に次のような出力が表示されます(注:このエラーメッセージはここで説明する問題と非常によく似ています)。
Unhandled exception in thread started by <function inner_run at 0xa18cd14>
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.6/dist-packages/apport_python_hook.py", line 48, in apport_excepthook
if not enabled():
TypeError: 'NoneType' object is not callable
Original exception was:
Traceback (most recent call last):
File "/home/rdm/Biz/Projects/Daegis/Server_Development/tar/env/lib/python2.6/site-packages/django/core/management/commands/runserver.py", line 60, in inner_run
run(addr, int(port), handler)
File "/home/rdm/Biz/Projects/Daegis/Server_Development/tar/env/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 721, in run
httpd.serve_forever()
File "/usr/lib/python2.6/SocketServer.py", line 224, in serve_forever
r, w, e = select.select([self], [], [], poll_interval)
AttributeError: 'NoneType' object has no attribute 'select'
local("""hadoop ...""")
問題を、django runserverのリロードで問題が発生しlocal("ls")
ないものに置き換えることで、hadoopへの呼び出しが行われる場合に絞り込みました。hadoopコードにバグはありません---セロリによって呼び出されない場合は、それ自体で問題なく動作します。
何がこれを引き起こしているのかについて何か考えはありますか?