txt - leer el contenido de un archivo en python
Leer/Escribir archivos desde hdfs usando python con subproceso, Pipe, Popen da error (2)
Intento leer (abrir) y escribir archivos en hdfs dentro de una secuencia de comandos python. Pero teniendo error ¿Puede alguien decirme qué está mal aquí?
Código (completo): sample.py
#!/usr/bin/python
from subprocess import Popen, PIPE
print "Before Loop"
cat = Popen(["hadoop", "fs", "-cat", "./sample.txt"],
stdout=PIPE)
print "After Loop 1"
put = Popen(["hadoop", "fs", "-put", "-", "./modifiedfile.txt"],
stdin=PIPE)
print "After Loop 2"
for line in cat.stdout:
line += "Blah"
print line
print "Inside Loop"
put.stdin.write(line)
cat.stdout.close()
cat.wait()
put.stdin.close()
put.wait()
Cuando ejecuto:
hadoop jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.5.1.jar -file ./sample.py -mapper ''./sample.py'' -input sample.txt -output fileRead
Se ejecuta correctamente No pude encontrar el archivo que suponía crear en hdfs modifiedfile
Y cuando ejecuto:
hadoop fs -getmerge ./fileRead/ file.txt
Dentro del archivo.txt, obtuve:
Before Loop
Before Loop
After Loop 1
After Loop 1
After Loop 2
After Loop 2
¿Puede alguien decirme qué estoy haciendo mal aquí? No creo que lea de la muestra.txt
Intenta cambiar tu subproceso put
para quitar el stdout del cat
cambiando esto
put = Popen(["hadoop", "fs", "-put", "-", "./modifiedfile.txt"],
stdin=PIPE)
dentro de esto
put = Popen(["hadoop", "fs", "-put", "-", "./modifiedfile.txt"],
stdin=cat.stdout)
Guión completo:
#!/usr/bin/python
from subprocess import Popen, PIPE
print "Before Loop"
cat = Popen(["hadoop", "fs", "-cat", "./sample.txt"],
stdout=PIPE)
print "After Loop 1"
put = Popen(["hadoop", "fs", "-put", "-", "./modifiedfile.txt"],
stdin=cat.stdout)
put.communicate()
¿Puede alguien decirme qué estoy haciendo mal aquí?
Tu sample.py
podría no ser un mapeador adecuado. Un asignador probablemente acepta su entrada en stdin y escribe el resultado en su blah.py
, por ejemplo, blah.py
:
#!/usr/bin/env python
import sys
for line in sys.stdin: # print("Blah/n".join(sys.stdin) + "Blah/n")
line += "Blah"
print(line)
Uso:
$ hadoop ... -file ./blah.py -mapper ''./blah.py'' -input sample.txt -output fileRead