Deserializar un objeto de archivo de secuencia Hadoop en memoria.
Pyspark tiene una función llamada sequenceFile que nos permite leer un archivo de secuencia que está almacenado en HDFS o en alguna ruta local disponible para todos los nodos.
Sin embargo, ¿qué pasa si ya tengo un objeto de bytes en la memoria del controlador que necesito deserializar y escribir como un archivo de secuencia?
Por ejemplo, la aplicación en la que estoy trabajando (no puedo cambiar la lógica de la aplicación) ejecuta un trabajo de spark que escribe este archivo en un sistema de archivos que no cumple con HDFS, el cual luego puedo recuperar como un objeto de bytes de Python en memoria, el cual parece contener únicamente un objeto de Secuencia serializado que debería poder deserializar en memoria.
Dado que este objeto ya se encuentra en memoria (por razones que no puedo controlar), la única forma que tengo de deserializarlo y ver el resultado (que es un archivo json) actualmente es escribirlo como un archivo local, mover ese archivo a HDFS y luego leer el archivo utilizando el método sequenceFile (ya que este método solo funciona con un archivo que se encuentra en una ruta de archivo HDFS o en una ruta local en cada nodo). Esto crea problemas en el flujo de trabajo de la aplicación.
Lo que necesito poder hacer es deserializar esto en memoria para poder escribirlo como un archivo json sin tener que escribirlo localmente y luego ponerlo en HDFS solo para leerlo de nuevo con spark.
¿Existe alguna forma en Python de tomar este objeto de bytes similar a un objeto NullWritable y deserializarlo en un diccionario de Python o ponerlo nuevamente en Hadoop como algo que pueda leer realmente?
Imagen: enlace a la imagen
davy.ai
Desafortunadamente, el método
sequenceFile
en PySpark solo nos permite leer un archivo de secuencia almacenado en HDFS o una ruta local disponible para todos los nodos. Si ya tienes un objeto de bytes en la memoria del driver que necesita ser deserializado y escrito como un archivo de secuencia, la solución actual es escribirlo como un archivo local, mover ese archivo a HDFS y luego leer el archivo usando el métodosequenceFile
.Sin embargo, existen formas de deserializar el objeto en memoria sin tener que escribirlo en un archivo. Una posible solución es usar el módulo
StringIO
para crear un objeto similar a un archivo en memoria, y luego usar el módulohadoop_fs
en PySpark para escribir los datos en HDFS. Aquí tienes un ejemplo de código:Este código crea un objeto de bytes en memoria, luego crea un objeto similar a un archivo usando
io.BytesIO
. Luego utiliza el módulohadoop_fs
en PySpark para escribir los datos en HDFS sin tener que escribirlos en un archivo local primero. Finalmente, lee los datos de HDFS usando el métodosequenceFile
y los deserializa utilizando elPickleSerializer
. El resultado se imprime en la consola.Ten en cuenta que esta es solo una posible solución, y puede haber otras formas de lograr el mismo resultado dependiendo de tu caso de uso específico.