Zip sur HDFS en Scala
Lorsque l’on utilise Hadoop pour la compression de fichiers, que ce soit en Scala ou en Java, il est pratique et très facile d’utiliser l’API native d’Hadoop pour cela.
Cependant, les formats de compression gérés par cette API sont : GZIP, LZO, SNAPPY et BZIP2. Qu’en est-il de d’un format plus classique tel que le ZIP ? Il arrive encore que notre cas d’usage soit plutôt d’utiliser des formats gérés en dehors des écosystèmes Big Data (oui, merci le legacy…).
Heureusement, pas question de refacto ici 👊 ! On peut facilement compresser des fichiers HDFS au format ZIP en tirant parti des InputStream et des outputStream. Voyons un exemple de fonction embarquant ce traitement :
On utilise le FileSystem
de l’API d’Hadoop pour créer une OutputStream sur le chemin de destination sur HDFS. On injecte ensuite ce Stream dans un ZipOutputStream et le tour est (presque) joué !
Il reste ensuite à parcourir la liste des fichiers que l’on veut compresser en rajoutant des entrées (ZipEntry
) dans le ZipOutputStream. Puis on ouvre le fichier en question, et grâce à la méthode getWrappedStream
on va être capable de récupérer un objet de type InputStream à intégrer dans une BuferredSource
.
Et bien sûr, on n’oublie pas de fermer tous ces Streams ouverts !
Voici un exemple d’appel à cette fonction :
Remarque : ici, le FileSystem est récupéré via le Spark Context, mais il est possible d’utiliser n’importe quel procédé.
J’espère que cet article aura pu vous aider, à bientôt !👋