2012-07-16 3 views
1

Dans mon oozie fichier coordinator.xml, je donne les résultats suivants défini comme le répertoire d'entrée:Est-ce que Oozie peut ignorer un fichier d'entrée manquant?

<property> 
    <name>countingHourlyInputDir</name> 
    <value>${coord:dataIn('hourly-input')}/*Pattern1*,${coord:dataIn('hourly-input')}/*Pattern2*</value> 
</property> 

Cela correspond à des fichiers dans le répertoire où le nom correspond soit « Pattern1 » ou « Pattern2 ». Si le répertoire contient des fichiers Pattern1 et des fichiers Pattern2, mes travaux s'exécutent sans problème. Toutefois, si le répertoire ne contient que des fichiers ou des fichiers Modèle1 Modèle2, échoue mon travail, et je reçois une erreur comme ceci:

A défaut oozie lanceur, classe principale [org.apache.oozie.action.hadoop.MapReduceMain ], main() exception jeté, motif d'entrée de HDFS: // hdfsPath/logs/2012/07/09/02/Pattern1 matchs 0 fichiers org.apache.hadoop.mapreduce.lib.input.InvalidInputException: entrée motif HDFS: // hdfsPath/logs/2012/07/09/02/Pattern1 matchs 0 fichiers

Existe-t-il un moyen de dire à Oozie d'ignorer cette erreur afin que les travaux MapReduce soient toujours exécutés sur les fichiers qui correspondent à Pattern2 plutôt que d'échouer à l'ensemble du travail?


MISE À JOUR:

Je compris la solution à ce moi-même, et je vais documenter ce que je l'ai fait au cas où quelqu'un d'autre va dans ce problème plus tard.

J'ai créé une classe appelée RegexPathFilter qui implémente PathFilter et Configurable. Je passe ce filtre dans le travail hadoop en spécifiant la propriété mapred.input.pathFilter.class dans le fichier oozie workflow.xml. Voici ma classe et mes extraits de configuration:

public class RegexPathFilter implements PathFilter, Configurable { 

    public static final String CONF_REGEX_PROPERTY = "regexPathFilter.regex"; 
    private static final Log LOG = LogFactory.getLog(RegexPathFilter.class); 
    private String _regex; 
    private Configuration _conf; 

    public RegexPathFilter() { 

    } 

    @Override 
    public void setConf(Configuration conf) { 
     _conf = conf; 
     //get regex from Configuration 
     _regex = _conf.get(CONF_REGEX_PROPERTY); 
    } 

    @Override 
    public Configuration getConf() { 
     return _conf; 
    } 

    public boolean accept(Path path) { 
     if(_regex == null) { 
      throw new IllegalStateException("RegexPathFilter must be given a regex to filter with."); 
     } 

     boolean matches = path.toString().matches(_regex); 

     LOG.info(path + (matches ? " matches " : " does NOT match ") + _regex); 
     return matches; 
    } 
} 

workflow.xml:

<property> 
    <name>mapred.input.pathFilter.class</name> 
    <value>com.company.project.hadoop.util.RegexPathFilter</value> 
</property> 
<property> 
    <name>regexPathFilter.regex</name> 
    <value>.*(Pattern1|Pattern2).*</value> 
</property> 

Répondre

0

La raison derrière cette question est https://issues.apache.org/jira/browse/HADOOP-8870

je faisais face aussi ce même problème et résolu en faisant une léger changement dans le motif et le code zéro.

Remplacer

<property> 
    <name>countingHourlyInputDir</name> 
    <value>${coord:dataIn('hourly-input')}/*Pattern1*,${coord:dataIn('hourly-input')}/*Pattern2*</value> 
</property> 

avec

<property> 
    <name>countingHourlyInputDir</name> 
    <value>{${coord:dataIn('hourly-input')}}/{*Pattern1*,*Pattern2*}</value> 
</property> 

Après ce remplacement, Hadoop lancera une erreur que si le répertoire contient des fichiers correspondant ni motif1 ni pattern2.

Questions connexes