2014-02-17 3 views
2

Я пытаюсь запустить приложение 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». Класс существует точно так, как показано в сообщении об ошибке.

Любые идеи, что я делаю неправильно здесь?

+0

Это кажется сложным. Как вы запускаете свою работу YARN? Вы пытались добавить '-libjars [your jar here]' в качестве аргумента 'hadoop'? Это автоматически распределит ваш файл на узлах задачи и сделает банку доступной в пути к классам. –

+0

Привет, Даниэль, спасибо за ваш ответ. Я хочу начать работу с Java-приложения, поэтому параметр командной строки не является параметром. – padmalcom

+0

Вы запускаете свои задания, используя 'o.a.h.mapreduce.Job'? Если это так, вы должны указать jars для добавления в classpath с помощью таких методов, как 'addArchiveToClassPath()' и 'addFileToClassPath()', что должно быть эквивалентно параметру командной строки. –

ответ

0

Я узнал, как запустить процесс Java из ApplicationMaster. Infact, моя проблема была основана на команде для запуска процесса, даже если это официально документированный способ, предоставляемый проектом Apache Hadoop. не

То, что я не должен был указать packageResource быть файл не архив:

packageResource.setType(LocalResourceType.FILE); 

Теперь менеджер узла не извлекает ресурс, но оставляет его в качестве файла. В моем случае как JAR. Чтобы начать процесс, который я называю:

java -jar primecalculator.jar 

Чтобы запустить JAR без указания основного класса в командной строке необходимо указать главный класс в файле манифеста (вручную или позволить Maven сделать это для вас).

Подводя итог: я НЕ добавил ресурс в архив, но как файл, и я не использовал команду -cp для добавления папки syslink, созданной hadoop для извлеченной архивной папки. Я просто запускаю JAR через параметр -jar, и все.

Надеюсь, это поможет вам, ребята!

Смежные вопросы