2011-07-12 9 views
1

marshalライブラリを使用してTCPソケットを介して渡された後に、デシリアライズされたマップ関数とreduce関数を使用してDiscoジョブを実行しようとしています。具体的には、私はすでに、同じシステム上で(ローカルに定義された機能を持つ)無地ディスコジョブをテストしてみた、と彼らは正常に動作ディスコの「ワーカーイベントを解析できませんでした」とはどういう意味ですか?

code = marshal.loads(data_from_tcp) 
func = types.FunctionType(code, globals(), "func") 

でそれらを開梱しています。しかし、新しい機能を使ってディスコジョブを実行すると、エラーメッセージが表示され続けます。localhost WARNING: [map:0] Could not parse worker event: invalid_length

私はドキュメントを検索しましたが、「ワーカーイベント"、またはinvalid_lengthのいずれかです。ソースコードでgrepを実行した後、具体的にはmaster/src/disco_worker.erlというファイルに、「ワーカーイベントを解析できませんでした」というフレーズのインスタンスが1つ見つかります。私はアーランに精通しておらず、どのように動作しているのか分かりません。

この問題の原因は何ですか?私はそれを回避するために他の何かをする必要がありますか?

編集:さらにデバッグした後、私はこのエラーが私のテストケース関数内でstring.split()メソッドを使用することに結びついていることに気付きました。入力の一部ではない文字列であっても、このエラーが発生します。私はメソッドがオブジェクト上に存在することを確認しましたが、それを呼び出すことは問題を引き起こすようです。何かご意見は?

編集2:また、re.split関数を使用すると、同じ効果が得られます。

編集3:マップ関数の入力文字列で任意の文字列関数を呼び出すと、同じエラーが発生するようです。

答えて

2

私の場合、この警告は、マップ機能でsys.stderrに何かを印刷したときに(そしてジョブが最後に失敗した)常に発生しました。 worker protocolのドキュメントには次のように書かれています。作業者は、以下に説明するようにフォーマットされたメッセージを除き、何も標準エラー出力に書き込まないでください。 stdoutも最初はstderrにリダイレクトされます。

+0

ありがとうございました。 stdoutで出力を生成しないようにワーカーを変更すると、これも私の仕事で修正されたようです。 –

関連する問題