Не знаю, насколько это поможет в подсчете слов, но я построил свои собственные персонажи и редукторы, которые будут обрабатывать R-скрипты. Без всяких сложностей, вот как я представляю простую работу.
ArtisanJob - это просто класс, который расширяет org.apache.hadoop.mapreduce.Job. У меня есть некоторые дополнительные методы для моей функциональности. Вы можете заменить ArtisanJob просто org.apache.hadoop.mapreduce.Job, и он должен работать отлично для вас.
My ArtisanConfiguration расширяет импорт org.apache.hadoop.conf.Configuration и может быть заменен также только импортом org.apache.hadoop.conf.Configuration.
MetricInputFormat, MetricOutputFormat - это те же самые простые адаптеры, которые расширяют InputFormat и OutputFormat соответственно.
Дайте мне знать, если у вас есть вопросы, но это рабочий код для hadoop 2.4.1 с помощью mrv2.
public String execute(IHadoopJobConfiguration jobDetails)
throws HadoopJobException {
try {
ArtisanJob job = createJob(jobDetails);
job.submit();
return job.getJobID().toString();
} catch (ClassNotFoundException | IOException | InterruptedException
| RAnalyticsException | ConfigurationException e) {
logger.log(Level.SEVERE, "Unable to execute job", e);
throw new HadoopJobException("Unable to execute operation", e);
} catch (Exception e) {
throw new HadoopJobException("Unable to execute operation", e);
}
}
...
ArtisanJob createJob(IHadoopJobConfiguration details)
throws IOException, ConfigurationException, RAnalyticsException {
IOperation mapperOperation = details.getMapperOperation();
IOperation reducerOperation = details.getReducerOperation();
OperationConfiguration conf = new OperationConfiguration();
conf.setDataProviders(details.getDataProviders());
conf.setOperationInputs(details.getUserInputs());
ArtisanJob job = new ArtisanJob(new ArtisanConfiguration());
// Tell the job to be local for right now
job.getConfiguration().set("mapreduce.framework.name", "local");
job.setMapperClass(ROperationMapper.class);
job.setReducerClass(ROperationReducer.class);
job.setInputFormatClass(MetricInputFormat.class);
job.setOutputFormatClass(MetricOutputFormat.class);
job.setMapOutputKeyClass(MetricKey.class);
job.setMapOutputValueClass(MetricWritable.class);
job.setJarByClass(MetricInputFormat.class);
job.getConfiguration()
.set("conf.column",
props.getProperty("com.artisan.orchestrator.hbase.metric.colfamily"));
// Set the output type to hbase so that it will write the outputs to
// our hbase server
MetricOutputFormat.setOutputAdatperType(job.getConfiguration(),
OutputAdapterType.HBASE);
// Set the input to be the http service, this needs to be more modular.
MetricInputFormat.setInputAdapterType(job.getConfiguration(),
InputAdapterType.HTTP);
job.setMapperOperation(mapperOperation);
job.setReducerOperation(reducerOperation);
logger.log(Level.SEVERE, "Job class is " + job.getJar());
return job;
}
Спасибо большое. Но я не получил, где я могу использовать API YarnClient для указания ресурсов, необходимых для запуска этого задания (например, памяти и ресурсов ЦП для запуска ApplicationMaster). Раньше вы сталкивались с этим? –
Да, вы должны настроить его в файле mapred-site.xml или настроить его так же, как и для mapreduce.framework.name. Это значение может быть «локальным» или «пряжа». По умолчанию он настроен как пряжа в mapred-site.xml, но для тестирования очень быстро я изменил его, чтобы использовать локальный в конфигурации задания непосредственно перед отправкой. Я могу обновить остальную часть ответа чуть позже. –