1

サーバーからHadoopにファイルをコピーするために使用される python-file について、私はとても混乱しています。

コマンドは次hadoop fs -put /localhost/* /hadoop/* のとおりです。コードは次のとおりです。

    cmd = exc_path + ' ' + 'fs -put' + ' ' + src_path + item + ' ' + dst_path
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
    code = process.wait()
    logfile.info('type(code) is %s, code is %s\n', type(code), code)

ここ数日、問題なく動いています。しかし、一昨日それは戻ってきましたcode!=0 、そして昨日、それはうまくいきましたcode == 0、そして今日は失敗して戻ってきました:type(code) is <type 'int'>, code is 255

ドキュメントには、wait()は 0 または None を返す必要があると書かれていますが、なぜ 255 が返されるのでしょうか? また、hadoop の cmd 'put' は 0 (成功した場合) と -1 (失敗した場合) を返す必要があります。

役立つ情報をいくつか見つけました。 から

4

2 に答える 2

4

ドキュメントには、wait()は0またはNoneを返す必要があると書かれていますが、なぜ255を取得するのですか。

これは間違っています。ドキュメントには次のように書かれています。

Popen.wait()子プロセスが終了するのを待ちます。リターンコード属性を設定して返します。

Popen.returncode poll()およびwait()によって(および間接的にcommunicate()によって)設定される子の戻りコード。None値は、プロセスがまだ終了していないことを示します。負の値-Nは、子がシグナルN(Unixのみ)によって終了したことを示します。

コマンドがゼロ以外の出口コードで終了する場合は、それを取得します。

また、hadoopのcmd'put'は、0(成功した場合)と-1(失敗した場合)を返す必要があります。

なぜあなたが 255むしろ得るのかについてのこの説明-1は非常に単純であり、すでに ここここで説明されています。基本的には、Javaが符号付き32ビット値を終了コード(私たちの場合は-1)として許可しているためですが、Posixの終了ステータスは符号なし8ビット値です。

要約すると、ゼロ以外の終了コードは、コマンドが失敗したことを示します。特別な終了コードと照合する場合は、コードが0〜255の範囲にないときに特別な注意を払う必要があります。

于 2013-03-22T07:36:47.273 に答える
1

戻りコード255は、Hadoopプロセスが-1戻りコードで終了したことを意味します(理由はわかりません)。

-1が得られない理由wait()は、サブプロセスがシグナルのために終了した場合に負の数が予約されているためです(たとえば、シグナル11のために終了した場合、戻りコードは-11になります)。

于 2013-03-22T07:33:35.113 に答える