Не уверен, что кто-то сталкивался с этой проблемой. Я пытаюсь использовать oozie для запуска простого задания MapReduce, которое ищет строковое значение в папке HDFS и, если оно находит его, выводит его. Когда я отправляю задание, oozie успешно выполняется, но я не получаю ожидаемого результата. Кажется, что мой маппер никогда не вызывался, так как он не отфильтровал ни одного из ожидаемых результатов. Выходной файл просто содержит все входные записи. Я поместил System.out.printlns по всему коду, и я не вижу их в файлах журнала задач. Я проверил конфигурацию и результаты работы, и я не вижу счетчик, который я добавил, ни любой из System.outs. Конфигурация задания, тем не менее, утверждает, что мой класс Mapper был выполнен. Это не имеет никакого смысла для меня. Ниже приведен фрагмент моего кода Mapper:
private static final String SEARCH_FOR_STRING = "poc.search.string";
enum SearchCounters {
NUMBER_OF_MATCHES;
}
private NullWritable nullValue = NullWritable.get();
private Text outputLine = new Text();
private String searchString = null;
@Override
protected void setup(Context context) {
searchString = context.getConfiguration().get(SEARCH_FOR_STRING);
System.out.println("Searching for: [" + searchString + "]");
context.getCounter(SearchCounters.NUMBER_OF_MATCHES).increment(0);
}
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
String inputLine = value.toString();
System.out.println("key: " + key.toString() + "value: " + inputLine
+ " searchString: [" + searchString + "]");
if(inputLine.contains(searchString)) {
context.getCounter(SearchCounters.NUMBER_OF_MATCHES).increment(1);
outputLine.set(inputLine);
context.write(outputLine, nullValue);
}
}
А вот и мой workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.1" name="search-wf">
<start to="mr-node"/>
<action name="mr-node">
<map-reduce>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/${wf:user()}/${outputDir}"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
<property>
<name>mapreduce.map.class</name>
<value>poc.SearchForValueMapper</value>
</property>
<property>
<name>mapreduce.reducer.class</name>
<value>poc.SearchForValueReducer</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>100</value>
</property>
<property>
<name>mapred.input.dir</name>
<value>/user/${wf:user()}/${inputDir}</value>
</property>
<property>
<name>com.disney.search.string</name>
<value>${searchString}</value>
</property>
<property>
<name>mapred.output.dir</name>
<value>/user/${wf:user()}/${outputDir}</value>
</property>
</configuration>
</map-reduce>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>