3

J'essaie d'utiliser NiFi pour traiter de gros fichiers CSV (potentiellement des milliards d'enregistrements chacun) en utilisant HDF 1.2. J'ai implémenté mon flux, et tout fonctionne correctement pour les petits fichiers.Apache NiFi - OutOfMemory Erreur: dépassement de la limite de surcharge GC sur le processeur SplitText

Le problème est que si j'essaie de pousser la taille du fichier à 100 Mo (dossiers 1M) Je reçois un java.lang.OutOfMemoryError: GC overhead limit exceeded du processeur splitText responsable de diviser le fichier dans les dossiers individuels. J'ai cherché cela, et cela signifie essentiellement que le garbage collector est exécuté pendant trop longtemps sans obtenir beaucoup d'espace de tas. Je suppose que cela signifie que trop de fichiers de flux sont générés trop rapidement.

Comment puis-je résoudre ce problème? J'ai essayé de changer la configuration de nifi concernant l'espace de tas maximum et d'autres propriétés liées à la mémoire, mais rien ne semble fonctionner.

En ce moment j'ai ajouté un intermédiaire SplitText avec un nombre de lignes de 1K et cela me permet d'éviter l'erreur, mais je ne vois pas cela comme une solution solide pour quand la taille du fichier entrant deviendra potentiellement beaucoup plus Je crains d'avoir le même comportement de la part du processeur.

Toute suggestion est la bienvenue! Merci

Répondre

4

La raison de l'erreur est lors de la division des enregistrements 1M avec un nombre de lignes de 1, vous créez des fichiers de flux 1M qui égalisent les objets Java 1M. Dans l'ensemble, l'utilisation de deux processeurs SplitText est fréquente et évite de créer tous les objets en même temps. Vous pourriez probablement utiliser une taille de division encore plus grande sur le premier split, peut-être 10k. Pour un milliard d'enregistrements, je me demande si un troisième niveau aurait du sens, divisé de 1B à peut-être 10M, puis 10M à 10K, puis 10K à 1, mais je devrais jouer avec.

Certains éléments supplémentaires à prendre en compte sont l'augmentation de la taille de segment de mémoire par défaut de 512 Mo, ce que vous avez peut-être déjà fait, et la détermination si vous avez vraiment besoin de diviser à 1 ligne. Il est difficile de dire quoi que ce soit d'autre à propos du flux, mais dans de nombreux cas, si vous voulez livrer chaque ligne quelque part, vous pourriez avoir un processeur qui lit un grand fichier délimité et envoie chaque ligne vers la destination. Par exemple, c'est ainsi que fonctionnent PutKafka et PutSplunk, ils peuvent prendre un fichier avec des lignes 1M et diffuser chaque ligne vers la destination.

+0

S'il n'y a pas de méthode "one-shot" pour cela, j'essaierai certainement plusieurs niveaux. Concernant PutKafka, je finirais par mettre en place Kafka avec NiFi dans le cluster. En ignorant le fait que cela nécessitera des ressources de cluster, y a-t-il des avantages d'un point de vue performance ou autre? Merci comme toujours pour les informations utiles sur le comportement de NiFi. – riccamini

+1

Eh bien, je ne disais pas nécessairement que vous aviez besoin de Kafka dans le cadre de ce processus, mais plutôt de ce que vous voulez faire dans votre flux après que vous ayez divisé en 1 ligne par fichier, pour voir si vous avez vraiment besoin de . Beaucoup de fois les gens veulent juste livrer ces lignes à un système externe, et dans ces cas il pourrait être possible d'avoir un processeur qui coule dans le gros fichier et envoie chaque ligne quelque part sans créer des millions de fichiers de flux, kafka et splunk juste deux exemples de cela. –

+0

Je dois effectivement diviser les fichiers ligne par ligne, puis appliquer une conversion/normalisation différente sur chacun de ses champs. Ensuite, je récupère chaque ligne et exporte tout sur la ruche. – riccamini