Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > ETL > Talend
Talend Forum d'entraide sur Talend (Talend Open Studio, ...). Avant de poster --> FAQ Talend, Tutoriels Talend
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/05/2008, 11h06   #1
Invité régulier
 
Inscription : novembre 2005
Messages : 20
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2005
Messages : 20
Points : 9
Points : 9
Par défaut pb d'injections avec de gros volumes

Bonjour,


Je dispose de 2 tables tel que:

|-----------------------|
| TABLE_1 |
------------------------|
| ID_GLOBAL_1 | PK |
| ID_SECONDAIRE | -- |
| ... |
|-----------------------|
=> 5 millions d'enregistrements


|-----------------------|
| TABLE_2 |
------------------------|
| ID_GLOBAL_2 | PK |
| ID_SECONDAIRE | -- |
| ... |
|-----------------------|
=> 6 millions d'enregistrements


Ces deux tables ont en commun le même identifiant secondaire (indexé) de telle sorte qu'un enregistrement de la TABLE_1 peut être en relation avec 0 ou n enregistrements de la TABLE_2.

|-----------------------|
| TABLE_REL |
------------------------|
| ID_GLOBAL_1 | PK |
| ID_SECONDAIRE | PK |
|-----------------------|


Pour diverses raisons je souhaite créer une table de relations où mettre en correspondance les champs TABLE_1.ID_GLOBAL_1 et TABLE_2.ID_SECONDAIRE. J'ai donc créé un job avec de 2 tMysqlInput en relation avec un tMap où est précisée la jointure ainsi que la sortie sur un tMysqlOutput. C'est simple, ça marche avec des données de tests (quelques enregistrements) mais pas qquand ça mouline sur des millions...

Le job échoue sur une seule exception java "Exception in thread "Main Thread" java.lang.OutOfMemoryError" au bout d'une dizaine de minutes sans qu'aucun enregistrement ne soit inséré dans la table de relation. J'ai modifié le script de lancement pour allouer plus de mémoire (-Xmx 1700M) et c'est toujours pareil.

Est-ce que vous avez une idée d'où peut provenir ce problème?? J'ai aussi l'impression que les enregistrements sont insérés à la fin du job et non en cours, je me trompe??


Mici!

Talend 2.3.2
Java 1.5

Mysql 5.0.45 en MyISAM
akrylik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h18   #2
Membre Expert
 
Avatar de Benoit_Durand
 
Benoit Durand
Consultant en Business Intelligence Freelance
Inscription : mars 2005
Messages : 818
Détails du profil
Informations personnelles :
Nom : Benoit Durand
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Consultant en Business Intelligence Freelance

Informations forums :
Inscription : mars 2005
Messages : 818
Points : 1 092
Points : 1 092
Les jointures dans les tMap sont à bannir pour les gros volumes ( voire bannir tout court) !!

Citation:
Est-ce que vous avez une idée d'où peut provenir ce problème?? J'ai aussi l'impression que les enregistrements sont insérés à la fin du job et non en cours, je me trompe??
Il charge toute ta table en lookup en mémoire dans un table de hachage, ensuite il charge les données du main, fait les jointures au fur et à mesure et insert en même temps.

Je te conseille vivement de faire un seul select avec dedans un inner join ou left outer join sur tes 2 tables. Ton sgbd est conçu pour faire des jointures donc autant l'utiliser.
Bien sûr il faut que les 2 tables soient dans la même base. Dans le cas contraire il vaut mieux passer par une table temporaire pour avoir les données dans la même base.

Il existe depuis la 2.3 le composant tJoin, plus léger que le tMap mais je en l'ai pas testé.

J'espère t'avoir aidé.

Cordialement
Benoit_Durand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 16h45   #3
Invité régulier
 
Inscription : novembre 2005
Messages : 20
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2005
Messages : 20
Points : 9
Points : 9
Merci ça marche . Pour résumer, utiliser un tMap pour réaliser une jointure entre 2 tables c'est mal.

J'ai donc utiliser un tMysqlInput où j'ai spécifié une requête me permettant de récupérer les champs résultant de la jointure ainsi que leur schema. J'ai diriger le tout vers un tMap afin d'orienter les données vers les tables voulues.
akrylik est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h57.


 
 
 
 
Partenaires

Hébergement Web