Я пытаюсь запустить приложение java из приложения YARN (подробно: из приложенияMaster в приложении YARN). Все примеры, которые я нашел, имеют дело с запущенными сценариями bash.Запустите приложение Java от Hadoop YARN
Моя проблема заключается в том, что я неправильно распространяю JAR-файл на узлы моего кластера. Я указываю JAR как локальный ресурс в клиенте YARN.
Path jarPath2 = new Path("/hdfs/yarn1/08_PrimeCalculator.jar");
jarPath2 = fs.makeQualified(jarPath2);
FileStatus jarStat2 = null;
try {
jarStat2 = fs.getFileStatus(jarPath2);
log.log(Level.INFO, "JAR path in HDFS is "+jarStat2.getPath());
} catch (IOException e) {
e.printStackTrace();
}
LocalResource packageResource = Records.newRecord(LocalResource.class);
packageResource.setResource(ConverterUtils.getYarnUrlFromPath(jarPath2));
packageResource.setSize(jarStat2.getLen());
packageResource.setTimestamp(jarStat2.getModificationTime());
packageResource.setType(LocalResourceType.ARCHIVE);
packageResource.setVisibility(LocalResourceVisibility.PUBLIC);
Map<String, LocalResource> res = new HashMap<String, LocalResource>();
res.put("package", packageResource);
Так что мой JAR должен быть распространен на ApplicationMaster и быть распакованы, так как я указать ResourceType быть ARCHIVE. На AM я пытаюсь вызвать класс из JAR, как это:
String command = "java -cp './package/*' de.jofre.prime.PrimeCalculator";
Бревна Hadoop сказать мне при запуске приложения: «Не удалось найти или загрузить основной класс de.jofre.prime.PrimeCalculator». Класс существует точно так, как показано в сообщении об ошибке.
Любые идеи, что я делаю неправильно здесь?
Это кажется сложным. Как вы запускаете свою работу YARN? Вы пытались добавить '-libjars [your jar here]' в качестве аргумента 'hadoop'? Это автоматически распределит ваш файл на узлах задачи и сделает банку доступной в пути к классам. –
Привет, Даниэль, спасибо за ваш ответ. Я хочу начать работу с Java-приложения, поэтому параметр командной строки не является параметром. – padmalcom
Вы запускаете свои задания, используя 'o.a.h.mapreduce.Job'? Если это так, вы должны указать jars для добавления в classpath с помощью таких методов, как 'addArchiveToClassPath()' и 'addFileToClassPath()', что должно быть эквивалентно параметру командной строки. –