Saltar al contenido

Obtenga una lista de nombres de archivos de HDFS usando python

Agradeceríamos tu apoyo para difundir nuestras crónicas acerca de las ciencias de la computación.

Solución:

Por lo que he podido decir, no existe una solución inmediata para esto, y la mayoría de las respuestas que he encontrado han recurrido al uso de llamadas al hdfs mando. Estoy usando Linux y tengo el mismo desafío. He encontrado el sh paquete para ser útil. Esto maneja la ejecución de comandos o / s por usted y la administración de stdin / out / err.

Consulte aquí para obtener más información al respecto: https://amoffat.github.io/sh/

No es la mejor solución, pero es de una línea (más o menos) y usa paquetes estándar.

Aquí está mi código reducido para obtener una lista de directorios HDFS. Enumerará archivos y carpetas por igual, por lo que es posible que deba modificarlos si necesita diferenciarlos.

import sh
hdfsdir = '/somedirectory'
filelist = [ line.rsplit(None,1)[-1] for line in sh.hdfs('dfs','-ls',hdfsdir).split('n') if len(line.rsplit(None,1))][1:]

Mi salida: en este caso, estos son todos los directorios:

[u'/somedirectory/transaction_basket_fct/date_id=2015-01-01',
 u'/somedirectory/transaction_basket_fct/date_id=2015-01-02',
 u'/somedirectory/transaction_basket_fct/date_id=2015-01-03',
 u'/somedirectory/transaction_basket_fct/date_id=2015-01-04',
 u'/somedirectory/transaction_basket_fct/date_id=2015-01-05',
 u'/somedirectory/transaction_basket_fct/date_id=2015-01-06',
 u'/somedirectory/transaction_basket_fct/date_id=2015-01-07',
 u'/somedirectory/transaction_basket_fct/date_id=2015-01-08']

Vamos a desglosarlo:

Para ejecutar el hdfs dfs -ls /somedirectory comando podemos usar el sh paquete como este:

import sh
sh.hdfs('dfs','-ls',hdfsdir)

sh le permite llamar a los comandos de o / s sin problemas como si fueran funciones en el módulo. Pasa parámetros de comando como parámetros de función. Realmente ordenado.

Para mí, esto devuelve algo como:

Found 366 items
drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-01
drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-02
drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-03
drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-04
drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-05

Divida eso en líneas basadas en caracteres de nueva línea usando .split('n')

Obtenga la última ‘palabra’ en el string utilizando line.rsplit(None,1)[-1].

Para evitar problemas con elementos vacíos en la lista, use if len(line.rsplit(None,1))

Finalmente elimine el primer elemento de la lista (el Found 366 items) utilizando [1:]

¿Qué necesito tener en mi computadora?

Necesita Hadoop instalado y en ejecución y, por supuesto, Python.

¿Cómo consulto nombres de archivos en HDFS?

Puedes probar algo como esto aquí. No he probado el código, así que no confíes solo en él.

from subprocess import Popen, PIPE

process = Popen('hdfs dfs -cat filename.dat',shell=True,stdout=PIPE, stderr=PIPE)
std_out, std_err = process.communicate()

check for returncode, std_err
if:
    everything is OK, do whatever with stdout
else:
    do something in else condition

También puede mirar Pydoop, que es una API de Python para Hadoop.

Aunque mi ejemplo incluye shell=true, puede intentar ejecutarlo sin él, ya que es un riesgo para la seguridad. Por qué no deberías usar shell=True?

Debe tener acceso de inicio de sesión a un nodo del clúster. Deje que el administrador del clúster elija el nodo, configure la cuenta y le informe cómo acceder al nodo de forma segura. Si usted es el administrador, avíseme si el clúster es local o remoto y si es remoto, entonces está alojado en su computadora, dentro de una corporación o en una nube de terceros y, si es así, de quién y luego puedo brindar información más relevante.

Para consultar nombres de archivos en HDFS, inicie sesión en un nodo de clúster y ejecute hadoop fs -ls [path]. Sendero es opcional y, si no se proporciona, se enumeran los archivos de su directorio personal. Si -R se proporciona como una opción, luego enumera todos los archivos en la ruta de forma recursiva. Hay opciones adicionales para este comando. Para obtener más información sobre este y otros comandos de shell del sistema de archivos de Hadoop, consulte http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/FileSystemShell.html.

Una forma fácil de consultar nombres de archivos HDFS en Python es usar esutil.hdfs.ls(hdfs_url='', recurse=False, full=False), que ejecuta hadoop fs -ls hdfs_url en un subproceso, además de que tiene funciones para varios otros comandos de shell del sistema de archivos de Hadoop (consulte la fuente en http://code.google.com/p/esutil/source/browse/trunk/esutil/hdfs.py). esutil se puede instalar con pip install esutil. Está en PyPI en https://pypi.python.org/pypi/esutil, la documentación está en http://code.google.com/p/esutil/ y su sitio de GitHub es https://github.com / esheldon / esutil.

Nos encantaría que puedieras dar visibilidad a este ensayo si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *