파이썬 래퍼에서 하이브 스크립트를 실행하려고합니다. 코드의 일부는 이것의 출력은 파이썬 스크립트에서 호출 될 때 현재 작업 디렉토리를 읽으려고하는 하이브
print(HiveArgs)
Hive = subprocess.Popen(HiveArgs, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
HiveOutput = Hive.communicate()
print("Out:" + HiveOutput[0])
print("=================================")
print("Err:" + HiveOutput[1])
다음과 같습니다
['hive', '-i ', '/edw/edwdev/tmp/spark.txn.init.tmp', '-f ', '/edw/edwdev/tmp/test.hql.tmp']
Out:
=================================
Err:
Logging initialized using configuration in file:/etc/hive/2.5.0.2-3/0/hive-log4j.properties
Exception in thread "main" java.io.FileNotFoundException: File file:/data/edw/edwdev/ does not exist
at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:624)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:850)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:614)
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:422)
at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.<init>(ChecksumFileSystem.java:146)
at org.apache.hadoop.fs.ChecksumFileSystem.open(ChecksumFileSystem.java:348)
at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:782)
at org.apache.hadoop.hive.cli.CliDriver.processFile(CliDriver.java:427)
at org.apache.hadoop.hive.cli.CliDriver.processInitFiles(CliDriver.java:439)
at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:708)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:684)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:624)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:233)
at org.apache.hadoop.util.RunJar.main(RunJar.java:148)
경우 리눅스 서버에서 내 작업 디렉토리입니다 /data/edw/edwdev/
(하이브가 누락 생각 파일).
작업 디렉토리를 스크립트 위치로 변경해도 도움이되지 않습니다. 상대 경로와 절대 경로를 사용하면 아무런 차이가 없습니다. 인쇄 된 HiveArgs
에서 값을 복사하고 터미널 (hive -i /edw/edwdev/tmp/spark.txn.init.tmp -f /edw/edwdev/tmp/test.hql.tmp
)에서 명령을 실행하면 제대로 작동합니다.
무엇이 여기에 있습니까?
'/ data/edw/edwdev /'디렉토리가 args'/ edw/edwdev/tmp/spark.txn.init.tmp'에서 사용하는 디렉토리와 다른 이유는 무엇입니까? '/ data' 접두어가 잉여입니까? –
'/ edw /'는'/ data/edw /'에 대한 부드러운 링크입니다. 그러나 작업 디렉토리가 완전히 다른 경우 문제가 남아 있습니다. '/ home/edwdev' 또는'/' – xenodevil
환경 변수에 디렉토리를 추가하려고 시도한 적이 있습니까? –