Vous avez quarante fichiers plats à charger. Quarante fournisseurs, quarante structures de colonnes, quarante tables cibles. Le réflexe est connu : vous construisez un pipeline, vous le dupliquez, vous changez le nom du fichier et la liste des champs, et vous recommencez trente-neuf fois. Six mois plus tard, la règle de nettoyage des dates change, et vous devez rouvrir quarante pipelines. Vos tests et votre chaîne CI/CD ne font alors que fiabiliser la duplication, sans la réduire.

Apache Hop propose une réponse directe à ce problème : la metadata injection. Le principe tient en une phrase, reprise de la documentation officielle : elle insère dans un pipeline modèle, au moment de l’exécution, des métadonnées provenant de sources variées, afin de réduire les tâches répétitives. Concrètement, vous maintenez un seul pipeline de traitement et vous décrivez les quarante variantes sous forme de données.

Prérequis

1. Deux pipelines au lieu d’un

La metadata injection repose sur une séparation stricte des rôles entre deux pipelines.

Le pipeline modèle (template) contient la logique de traitement : les transforms et les hops qui les relient, mais volontairement pas les détails de configuration. Vous y placez par exemple une transform CSV File Input sans nom de fichier ni liste de champs, suivie d’une transform Table Output sans table cible. Ouvert seul dans Hop GUI, ce pipeline ne sert à rien : il est incomplet par construction.

Le pipeline injecteur est un pipeline Hop tout à fait ordinaire. Son travail consiste à produire, sous forme de lignes, les métadonnées qui manquent au modèle : noms de fichiers, séparateurs, noms et types de colonnes, tables cibles. Il se termine par la transform ETL Metadata Injection, qui assemble le modèle et les métadonnées en un pipeline complet, en mémoire, puis l’exécute.

La différence de maintenance est nette.

Sans injection Avec injection
40 fichiers .hpl à versionner 2 fichiers .hpl et une source de métadonnées
Une correction de règle = 40 modifications Une correction de règle = 1 modification
Ajouter un fournisseur = dupliquer un pipeline Ajouter un fournisseur = ajouter une ligne
Tests unitaires à dupliquer également Un jeu de tests sur le pipeline modèle

2. Construire le pipeline modèle

Commencez par le cas le plus simple : un seul fichier, entièrement configuré à la main, qui fonctionne. C’est votre point de référence. Une fois le résultat validé, videz les propriétés que vous comptez injecter.

Pour une transform CSV File Input, les options candidates à l’injection sont celles que vous retrouvez dans sa boîte de dialogue : Filename, Delimiter, Enclosure, Header row present, File Encoding et la grille des champs. Pour Table Output, ce sont typiquement Target schema, Target table, Commit size, Truncate table ou encore Specify database fields.

Un point mérite d’être retenu : toutes les transforms ne sont pas injectables, et celles qui le sont n’exposent pas forcément la totalité de leurs options. La liste des propriétés réellement disponibles pour un modèle donné vous est présentée par la transform ETL Metadata Injection elle-même, à l’étape suivante. C’est la source de vérité ; inutile de la deviner.

3. Produire les métadonnées

Le pipeline injecteur peut fabriquer ses métadonnées de plusieurs façons, et rien ne vous interdit de les combiner.

Notez la nature particulière de ce pipeline : les flux qui alimentent l’injection n’ont pas besoin de partager la même structure. La documentation le souligne explicitement, la transform ETL Metadata Injection levant ici la règle habituelle d’homogénéité des flux entrants. Vous pouvez donc faire arriver, sur la même transform, un flux « une ligne par fichier » et un flux « une ligne par colonne ».

4. Configurer la transform ETL Metadata Injection

La transform s’organise en trois onglets.

L’onglet General désigne le pipeline modèle via le navigateur de fichiers virtuel. Hop remplace automatiquement les chemins racine courants par la variable ${Internal.Transform.Current.Directory} : conservez ce comportement, c’est ce qui rend le pipeline portable d’un poste de développement vers un serveur.

L’onglet Inject Metadata est le cœur du dispositif. Il affiche les propriétés injectables du modèle et, en face, l’origine de chaque valeur :

Un double-clic sur une cible ouvre la sélection du champ source. Pour une valeur fixe, utilisez Use constant value plutôt que de fabriquer un champ artificiel.

L’onglet Options regroupe les réglages d’exécution : Transform to read from, qui permet de récupérer en aval les données produites par le modèle, avec le détail du nom, du type, de la longueur et de la précision des champs ; les options de streaming entre le pipeline courant et le pipeline modèle ; Optional target file (hpl after injection) ; et Run resulting pipeline.

5. Déboguer sans deviner

La difficulté de la metadata injection est que le pipeline réellement exécuté n’existe qu’en mémoire. Les deux dernières options citées sont la réponse prévue par Hop.

Renseignez Optional target file (hpl after injection) avec un chemin de sortie, puis décochez Run resulting pipeline. Hop écrit alors sur disque le pipeline généré, sans l’exécuter. Vous l’ouvrez dans Hop GUI comme un pipeline normal et vous constatez ce qui a été injecté — ou ce qui est resté vide. La cause habituelle d’un échec est une propriété jamais mappée dans l’onglet Inject Metadata.

Pensez à réactiver Run resulting pipeline avant de livrer, et à ne pas laisser un chemin de sortie de débogage dans une configuration de production.

6. Exécuter et industrialiser

Du point de vue de l’ordonnancement, seul le pipeline injecteur se lance. Il s’exécute comme n’importe quel pipeline, avec hop-run :

./hop-run.sh \
  -j mon-projet \
  -e production \
  -r local \
  -f ${PROJECT_HOME}/pipelines/charger-fournisseurs.hpl \
  -p REPERTOIRE_SOURCE=/data/in/fournisseurs,DATE_TRAITEMENT=2026-09-28 \
  -l BASIC

Les options utilisées sont celles documentées pour hop-run : -j / --project, -e / --environment, -r / --runconfig, -f / --file, -p / --parameters sous forme de paires PARAMETRE=VALEUR séparées par des virgules, et -l / --level pour le niveau de journalisation.

Une limite doit être intégrée dès la conception : la transform ETL Metadata Injection n’est supportée que par le moteur Hop. Les moteurs Beam natifs, Spark et apparentés ne la prennent pas en charge. Si votre cible d’exécution est un cluster Beam, la metadata injection n’est pas l’outil adapté à cette portion du traitement.

Cas plus avancé : Hop permet d’injecter des métadonnées dans la transform ETL Metadata Injection elle-même, au moyen de la constante PIPELINE_SPECIFICATION_METHOD, les cibles s’écrivant alors sous la forme [GROUP NAME].[FIELD NAME].

Ce que vous avez gagné

Vous ne maintenez plus une famille de pipelines quasi identiques, mais un pipeline modèle unique et une description de données. La règle de nettoyage des dates se corrige à un seul endroit. Un nouveau fournisseur se déclare par une ligne dans une table de paramétrage, sans livraison de code. Vos tests unitaires portent sur le pipeline modèle, donc sur la logique réelle, et votre dépôt Git redevient lisible : un diff montre un changement de comportement, et non une duplication de quarante fichiers.

Le coût à accepter est un niveau d’indirection supplémentaire et un temps de mise au point initial plus long. Le seuil de rentabilité se situe en pratique autour de trois à cinq variantes. En dessous, dupliquez. Au-delà, injectez.

Pour aller plus loin

Un projet Apache Hop ? Parlons-en.

Devis et programme détaillé sous 48 h ouvrées. Financement OPCO accompagné.

Demander un devis