hadoop distcp с использованием подпроцесса. Открыть - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь запустить команду hadoop distcp с помощью subprocess.Popen в python и получить ошибку - Неверный ввод. Эта же команда работает нормально, если я запускаю ее как Hadoop.

Команда Hadoop:

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 = [- log / user / name / distcp_log -skipcrccheck -update, hdfs: // xxxxx: 8020 / sourceDir])?

Я использую Python2.7 и не имею доступа к установке pip и ее кластеру Kerberos. Хотел запустить эту команду для внутрикластерной передачи, но до этого хотел попробовать эту простую команду в кластере.

Спасибо

1 Ответ

0 голосов
/ 03 июля 2018

Разделить все аргументы вашей командной строки на отдельные элементы списка первого аргумента 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)

Здесь вы можете найти Popen документацию, в которой говорится, что args должен быть списком, созданным путем разделения всех аргументов на ' '.

...