복붙노트

[HADOOP] subprocess.Popen를 사용하여 하둡 distcp

HADOOP

subprocess.Popen를 사용하여 하둡 distcp

나는 오류를 파이썬에서 subprocess.Popen를 사용하여 하둡 distcp 명령을 실행하고 얻기 위해 노력하고 있어요 - 잘못된 입력을. 내가 하둡 명령으로 실행하는 경우 같은 명령을 잘 실행됩니다.

하둡 명령

hadoop distcp -log /user/name/distcp_log -skipcrccheck -update hdfs://xxxxx:8020/sourceDir hdfs://xxxxx:8020/destDir

파이썬에서 :

from subprocess import Popen, PIPE
proc1 = Popen(['hadoop','distcp','-log /user/name/distcp_log -skipcrccheck -update', 'hdfs://xxxxx:8020/sourceDir', 'hdfs://xxxxx:8020/destDir'], stdout=subprocess.PIPE)

메시지 로그 :

INFO tools.OptionsParser: parseChunkSize: blocksperchunk false
INFO tools.DistCp: Input Options: DistCpOptions{atomicCommit=false, syncFolder=false, deleteMissing=false, ignoreFailures=false, overwrite=false, append=false, useDiff=false, useRdiff=false, fromSnapshot=null, toSnapshot=null, skipCRC=false, blocking=true, numListstatusThreads=0, maxMaps=20, mapBandwidth=100, sslConfigurationFile='null', copyStrategy='uniformsize', preserveStatus=[], preserveRawXattrs=false, atomicWorkPath=null, logPath=null, sourceFileListing=null, sourcePaths=[-log /user/name/distcp_log -skipcrccheck -update, hdfs://xxxxx:8020/sourceDir], targetPath=hdfs://xxxxx:8020/destDir, targetPathExists=true, filtersFile='null', blocksPerChunk=0, copyBufferSize=8192}
ERROR tools.DistCp: Invalid input:
org.apache.hadoop.tools.CopyListing$InvalidInputException: -log /user/name/distcp_log -skipcrccheck -update doesn't exist

이 소스 디렉토리로 옵션을 고려. 어떻게 이러한 옵션이고 소스로 간주되어서는 안됩니다 서브 프로세스 이야기하기 (sourcePaths의 =를 [- 로그 / 사용자 / 이름 / distcp_log -skipcrccheck -update를 HDFS : // xxxxx는 : 8020 / SOURCEDIR])?

나는 Python2.7를 사용하고 설치 및 Kerberos를 클러스터 핍 권한이 없습니다. 클러스터 내 전송을 위해이 명령을 실행하고 싶었지만 그 전에 클러스터 내에서이 간단한 명령을 시험해보고 싶었다.

감사

해결법

  1. ==============================

    1.는 popen 첫 번째 인수 목록의 개별 요소에 명령 줄의 모든 인수를 분할 :

    는 popen 첫 번째 인수 목록의 개별 요소에 명령 줄의 모든 인수를 분할 :

    from subprocess import Popen, PIPE
    proc1 = Popen(['hadoop','distcp','-log', '/user/name/distcp_log', '-skipcrccheck', '-update', 'hdfs://xxxxx:8020/sourceDir', 'hdfs://xxxxx:8020/destDir'], stdout=subprocess.PIPE)
    

    여기에 args ''모든 인수를 분할하여 만든 목록을해야한다고 말하는는 popen 문서를 찾을 수 있습니다.

  2. from https://stackoverflow.com/questions/51153722/hadoop-distcp-using-subprocess-popen by cc-by-sa and MIT license