Python lee el archivo como una transmisión de HDFS
hadoop subprocess (3)
Desea xreadlines , lee líneas de un archivo sin cargar todo el archivo en la memoria.
Editar :
Ahora que veo tu pregunta, solo necesitas obtener la tubería Popen
tu objeto Popen
:
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
for line in cat.stdout:
print line
Aquí está mi problema: tengo un archivo en HDFS que puede ser enorme (= no lo suficiente para todos en la memoria)
Lo que me gustaría hacer es evitar tener que guardar en caché este archivo en la memoria, y solo procesarlo línea por línea como lo haría con un archivo normal:
for line in open("myfile", "r"):
# do some processing
Estoy buscando para ver si hay una manera fácil de hacer esto bien sin usar bibliotecas externas. Probablemente pueda hacer que funcione con libpyhdfs o python-hdfs, pero me gustaría, si es posible, evitar la introducción de nuevas dependencias y libs no probadas en el sistema, especialmente porque ambas no parecen muy mantenidas y afirman que no deberían ser usado en producción
Estaba pensando en hacer esto usando las herramientas de línea de comando estándar "hadoop" usando el módulo de subprocess
Python, pero parece que no puedo hacer lo que necesito ya que no hay herramientas de línea de comando que hagan mi procesamiento y lo haría gustaría ejecutar una función de Python para cada línea en una moda de transmisión.
¿Hay alguna manera de aplicar las funciones de Python como operandos correctos de las tuberías usando el módulo de subproceso? O mejor aún, ¿abrirlo como un archivo como generador para poder procesar cada línea fácilmente?
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
Si hay otra forma de lograr lo que describí anteriormente sin usar una biblioteca externa, también soy bastante abierto.
Gracias por cualquier ayuda !
Si desea evitar agregar dependencias externas a cualquier costo, la respuesta de Keith es el camino a seguir. Pydoop , por otro lado, podría hacerte la vida mucho más fácil:
import pydoop.hdfs as hdfs
with hdfs.open(''/user/myuser/filename'') as f:
for line in f:
do_something(line)
En cuanto a sus preocupaciones, Pydoop se desarrolla activamente y se ha utilizado en producción durante años en CRS4 , principalmente para aplicaciones de biología computacional.
Simone
En los últimos dos años, ha habido mucho movimiento en Hadoop-Streaming. Esto es bastante rápido según Cloudera: http://blog.cloudera.com/blog/2013/01/a-guide-to-python-frameworks-for-hadoop/ He tenido un buen éxito con él.