Python lee el archivo como flujo desde HDFS

Aquí está mi problema: tengo un archivo en HDFS que potencialmente puede ser enorme (= no es suficiente para que quepa todo 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 correctamente 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 no parecen estar muy bien mantenidas y dicen que no deberían estar utilizado en la producción.

Estaba pensando en hacer esto usando las herramientas de línea de comandos “hadoop” estándar 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 comandos que hagan mi procesamiento y lo haría. Me gusta ejecutar una función de Python para cada línea en una forma de transmisión.

¿Hay alguna forma de aplicar las funciones de Python como operandos correctos de las tuberías utilizando el módulo de subproceso? ¿O incluso mejor, 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 estoy bastante abierto.

Gracias por cualquier ayuda !

Usted quiere xreadlines , lee líneas de un archivo sin cargar todo el archivo en la memoria.

Editar :

Ahora veo tu pregunta, solo necesitas obtener la canalización de Popen tu objeto Popen :

 cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE) for line in cat.stdout: print line 

Si quiere evitar agregar dependencias externas a cualquier costo, la respuesta de Keith es el camino a seguir. Pydoop , por otro lado, podría hacer tu 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) 

Respecto a sus inquietudes, Pydoop se ha desarrollado activamente y se ha utilizado en la 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 gran éxito con ello.