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>