una txt linea leer importar formas especifica escribir datos contenido como columnas binarios archivos archivo python hadoop hdfs popen hadoop-streaming

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