2015-04-15 1 views
1

Je suis nouveau à Apache Oozie et pour autant que j'ai compris les travaux de workflow/cordinator doivent être prédéfinis dans des fichiers xml. Cependant, dans mon problème, j'ai besoin de définir dynamiquement le flux de travail, c'est-à-dire en fonction des fichiers d'entrée, je pourrais avoir des actions supplémentaires dans mon flux de travail. Est-il possible de faire cela par programme?comment définir dynamiquement le workflow dans Apache Oozie?

Répondre

0

Le flux de travail & est des fichiers prédéfinis - cela ne signifie pas que vous ne pouvez pas contrôler les actions de workflow.

Si vous avez plusieurs cas/flux dans votre flux de production, vous pouvez ajouter Decision Control Node pour contrôler le flux dans votre flux de production.

Par exemple disons que vous dire si je l'entrée A il fera ActionA_1, ActionA_2 et pour le cas d'entrée B fera ActionB_1, ActionB_2, utilisez Decision Control Node choisir le chemin d'exécution à suivre

+0

Et si je devais faire quelque chose comme itérer sur une collection et appeler un workflow pour chaque valeur itérée? Est-ce possible? (Et oui, j'accepte totalement que cela soit antithétique à toute la notion de flux de travail Oozie étant DAG, mais parfois les besoins doivent) – jamiet

0

Je suis totalement d'accord avec la réponse de MZF , mais je veux ajouter quelque chose pour répondre à la question de jamiet et créer une réponse plus générale. Si c'est le cas, il est logique de diviser votre flux de travail en plusieurs flux/cas, alors un nœud de contrôle de décision est le chemin à parcourir.

Cependant, il est parfois nécessaire - comme jamiet demandé dans les commentaires - que vous vouliez appeler un workflow/action pour une itération sur une collection. Cela signifie que chaque fois que vous exécutez un flux de travail, la longueur possible du flux de travail peut varier d'une seule action à 100 selon la collection. Ce n'est pas quelque chose que vous pouvez représenter en utilisant des nœuds simples de contrôle de décision. Un de mes cas d'utilisation est la génération d'un flux de travail pour faire l'importation de sqoop pour chacune des paires table/base de données présentes dans un fichier de configuration.

Ma solution pour ce problème est d'avoir 1 flux de travail appeler un script personnalisé avec éventuellement certains paramètres. Ce script crée ensuite le fichier workflow.xml du 'workflow dynamique' contenant les actions correspondant à votre collection. Une fois le workflow.xml créé, le script appelle oozie job avec un fichier job.properties pointant vers le workflow.xml nouvellement créé.

+0

Je cherche une telle solution pour importer un nombre précédemment inconnu de sources de données externes, à savoir, un certain nombre de Feuilles Google via BigQuery. Actuellement, je le fais en utilisant un script Bash + Python qui récupère toutes les données en parallèle, en utilisant ensuite les CLI 'hdfs',' hive', et 'impala-shell' pour charger les données acquises dans Hadoop/Hive séquentiellement. Avoir de vraies actions de workflow pour chaque étape rendrait le processus beaucoup plus transparent, répétable et débogable. Pouvez-vous ajouter du code à votre réponse, illustré par une configuration de base pour créer de façon dynamique les flux de travail de suivi de 1 à 100 à partir du flux de travail principal? – Juve

+0

Je me sens comme le code réel ajouterait beaucoup à ma réponse et perdrait une partie de la généralité. Donc, ma suggestion est de créer du code qui est capable de construire dynamiquement un fichier workflow.xml basé sur certaines entrées. Si par exemple vous devez avoir 100 requêtes, vous devriez envisager d'écrire une fonction qui sort un seul oozie xml Hive . Cette fonction peut ensuite être appelée avec les bons paramètres autant de fois que vous le souhaitez. À la fin, vous auriez un fichier workflow.xml contenant autant d'actions que vous le souhaitez. Ce code est capable de produire un workflow.xml différent chaque fois qu'il est appelé. – spijs