Al enviar un trabajo con pyspark, ¿cómo acceder a la carga de archivos estáticos con el argumento –files?

por ejemplo, tengo una carpeta:

/ - test.py - test.yml 

y el trabajo se envía a spark cluster con:

gcloud beta dataproc jobs submit pyspark --files=test.yml "test.py"

en el test.py , quiero acceder al archivo estático que cargué.

 with open('test.yml') as test_file: logging.info(test_file.read()) 

pero consiguió la siguiente excepción:

 IOError: [Errno 2] No such file or directory: 'test.yml' 

¿Cómo acceder al archivo que subí?

Se puede acceder a los archivos distribuidos con SparkContext.addFile (y --files ) a través de SparkFiles . Proporciona dos métodos:

  • getRootDirectory() – devuelve el directorio raíz para los archivos distribuidos
  • get(filename) – devuelve la ruta absoluta al archivo

No estoy seguro de si existen limitaciones específicas de Dataproc, pero algo como esto debería funcionar bien:

 from pyspark import SparkFiles with open(SparkFiles.get('test.yml')) as test_file: logging.info(test_file.read()) 

Sí, Shagun tiene razón.

Básicamente, cuando envía un trabajo de chispa a chispa, no serializa el archivo que desea procesar a cada trabajador. Tendrás que hacerlo tú mismo.

Por lo general, deberá colocar el archivo en un sistema de archivos compartido como HDFS, S3 (amazon) o cualquier otro DFS al que puedan acceder todos los trabajadores. Tan pronto como lo haga, y especifique el destino del archivo en su script de chispa, el trabajo de chispa podrá leer y procesar como desee.

Sin embargo, dicho esto, copiar el archivo en el mismo destino en TODOS los empleados y la estructura de archivos del maestro también funciona. Exp., Puede crear carpetas como /opt/spark-job/all-files/ en TODOS los nodos de spark, rsync el archivo para todos ellos, y luego puede usar el archivo en su script de spark. Pero por favor no hagas esto. DFS o S3 son mucho mejores que este enfoque.

Actualmente, como Dataproc ya no está en la versión beta, para poder acceder directamente a un archivo en el almacenamiento en la nube desde el código de PySpark, enviar el trabajo con el parámetro --files hará el trabajo. SparkFiles no es necesario. Por ejemplo:

 gcloud dataproc jobs submit pyspark \ --cluster *cluster name* --region *region name* \ --files gs:/// gs:///filename.py 

Mientras se lee la entrada de gcs a través de la API de Spark, funciona con el conector gcs.