Zip sur HDFS en Scala

Thomas Zuk
2 min readJul 1, 2021

--

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 !👋

--

--

Thomas Zuk

Développeur Big Data, formateur et rédacteur de contenu sur les bonnes pratiques et le quotidien d'un Développeur Big Data !