복붙노트

[HADOOP] hadoop은 스파크 상태에서 실행될 때 stderr을 stdout에 병합합니다.

HADOOP

hadoop은 스파크 상태에서 실행될 때 stderr을 stdout에 병합합니다.

입력 할 때

hadoop fs -text /foo/bar/baz.bz2 2>err 1>out

비어 있지 않은 두 파일이 있습니다.

2015-05-26 15:33:49,786 INFO  [main] bzip2.Bzip2Factory (Bzip2Factory.java:isNativeBzip2Loaded(70)) - Successfully loaded & initialized native-bzip2 library system-native
2015-05-26 15:33:49,789 INFO  [main] compress.CodecPool (CodecPool.java:getDecompressor(179)) - Got brand-new decompressor [.bz2]

파일의 내용과 함께 (예상대로).

파이썬 (2.6)에서 동일한 명령을 호출하면 :

from subprocess import Popen
with open("out","w") as out:
    with open("err","w") as err:
        p = Popen(['hadoop','fs','-text',"/foo/bar/baz.bz2"],
                  stdin=None,stdout=out,stderr=err)
print p.wait()

나는 똑같은 (올바른) 행동을 얻습니다.

그러나 PySpark에서 동일한 코드를 실행하거나 스파크 제출을 사용하면 빈 err 파일이 생성되고 out 파일은 위의 로그 메시지로 시작됩니다 (그리고 실제 데이터가 포함되어 있음).

내가 뭘 잘못하고 있죠?

NB : 파이썬 코드의 의도는 hadoop fs -text의 출력을 다른 프로그램 (즉, stdout = PIPE를 Popen에 전달)에 제공하는 것이므로 hadoop fs -get을 제안하지 마십시오. 감사.

추신. 시간 내에 hadoop을 실행할 때 :

from subprocess import Popen
with open("out","w") as out:
    with open("err","w") as err:
        p = Popen(['/usr/bin/time','hadoop','fs','-text',"/foo/bar/baz.bz2"],
                  stdin=None,stdout=out,stderr=err)
print p.wait()

시간 출력이 올바르게 잘못되지만 hadoop 로그가 잘못 출력됩니다.

즉, hadoop은 스파크 상태에서 stderr을 stdout에 병합합니다.

해결법

    from https://stackoverflow.com/questions/30467502/hadoop-when-run-under-spark-merges-its-stderr-into-stdout by cc-by-sa and MIT license