2017-11-24 6 views
0

파이썬 래퍼에서 하이브 스크립트를 실행하려고합니다. 코드의 일부는 이것의 출력은 파이썬 스크립트에서 호출 될 때 현재 작업 디렉토리를 읽으려고하는 하이브

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)에서 명령을 실행하면 제대로 작동합니다.

무엇이 여기에 있습니까?

+0

'/ data/edw/edwdev /'디렉토리가 args'/ edw/edwdev/tmp/spark.txn.init.tmp'에서 사용하는 디렉토리와 다른 이유는 무엇입니까? '/ data' 접두어가 잉여입니까? –

+0

'/ edw /'는'/ data/edw /'에 대한 부드러운 링크입니다. 그러나 작업 디렉토리가 완전히 다른 경우 문제가 남아 있습니다. '/ home/edwdev' 또는'/' – xenodevil

+0

환경 변수에 디렉토리를 추가하려고 시도한 적이 있습니까? –

답변

0

하이브 인수에 문제가 있음이 나타났습니다. 대신 '-f'과의 '-i'

['hive', '-i ', '/edw/edwdev/tmp/spark.txn.init.tmp', '-f ', '/edw/edwdev/tmp/test.hql.tmp'] 

전달 인자 (후행 공백)과 '-f ''-i ' 같습니다 print(HiveArgs) 라인 출력을 주었다.

Hive에서 현재 작업 디렉토리를 일부 입력 파일로 읽는 문제가 발생한 이유가 확실하지 않습니다. 가장 가능성이 큰 하이브는이 동작으로 이어지는 인수를 수정하지 않습니다. 공백을 제거하면 문제가 해결되었습니다.