在我的 oozie coordinator.xml 文件中,我将以下内容定义为输入目录:
<property>
<name>countingHourlyInputDir</name>
<value>${coord:dataIn('hourly-input')}/*Pattern1*,${coord:dataIn('hourly-input')}/*Pattern2*</value>
</property>
这匹配文件名与“Pattern1”或“Pattern2”匹配的目录中的文件。如果目录包含文件 Pattern1 文件和 Pattern2 文件,我的作业运行没有问题。但是,如果该目录仅包含 Pattern1 文件或 Pattern2 文件,我的工作将失败,并且我收到如下错误:
Oozie Launcher 失败,主类 [org.apache.oozie.action.hadoop.MapReduceMain],main() 抛出异常,输入模式 hdfs://hdfsPath/logs/2012/07/09/02/ Pattern1匹配 0 个文件 org. apache.hadoop.mapreduce.lib.input.InvalidInputException:输入模式 hdfs://hdfsPath/logs/2012/07/09/02/ Pattern1匹配 0 个文件
有没有办法告诉 Oozie 忽略这个错误,以便 MapReduce 作业仍然在匹配 Pattern2 的文件上执行,而不是使整个作业失败?
更新:
我自己想出了解决方案,我将记录我所做的事情,以防其他人稍后遇到这个问题。
我创建了一个名为 RegexPathFilter 的类,它实现了 PathFilter 和 Configurable。我通过在 oozie workflow.xml 中指定mapred.input.pathFilter.class属性将此过滤器传递给 hadoop 作业。这是我的课程和我的配置片段:
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;
}
}
工作流.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>