Триггерная команда Hadoop по коду JAVA - PullRequest
1 голос
/ 16 февраля 2012

Как запустить jar-файл, работающий с Hadoop, из простого jar-файла, чтобы он использовал HDFS. На самом деле я вручную запускаю эту команду bin / hadoop jar ~ / wordcount_classes / word.jar org.myorg.WordCount ~ /hadoop-0.20.203.0/input1 ~ / hadoop-0.20.203 / output2 , в котором я предоставил каталог ввода и вывода в HDFS, и я использую здесь word.jar, я хочу сделать так, чтобы он автоматически получал запущен из проекта Java.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

В моем полном понимании все, что вы просите, сделано Главой вашего кувшина. Он считывает параметры, создает конфигурацию задания, устанавливает форматы ввода и вывода и, наконец, запускает задание.

0 голосов
/ 24 января 2013

Я работаю над той же проблемой. У меня есть программа (назовем ее Driver), которая должна реализовывать следующий метод:

public void runJar(File jar, String mainClass, File inputDir, File outputDir);

Чтобы сделать это, я звонил org.apache.hadoop.util.RunJar.main(String[]), это то, что вызывает ваша командная строка. Это прекрасно работает только если вы запускаете драйвер из командной строки .

Если драйвер работает внутри контейнера (например, Tomcat или Jetty), у вас возникнет проблема. Вы получите ошибки типа

java.lang.ClassNotFoundException: org.apache.hadoop.fs.Path

Это из-за того, как RunJar портится с загрузчиками классов. Вам необходимо вручную создать загрузчик классов, например:

final ClassLoader original = Thread.currentThread().getContextClassLoader();
try {
  URL[] urls = new URL[] { jar.toURI().toURL() };
  ClassLoader loader = new URLClassLoader(urls, originalLoader);
  Thread.currentThread().setContextClassLoader(loader);

  Class<?> mainClass = Class.forName(driverClass, true, loader);
  Class[] argTypes = new Class[]{ Array.newInstance(String.class, 0).getClass()};
  Method main = mainClass.getMethod("main", argTypes);
  main.invoke(null, new Object[] { args });
} finally {
  Thread.currentThread().setContextClassLoader(original);
}
...