Проблема с -libjars в hadoop - PullRequest
10 голосов
/ 31 июля 2011

Я пытаюсь запустить задание MapReduce на Hadoop, но у меня возникает ошибка, и я не уверен, что происходит не так. Я должен передать фляги библиотеки, которые требуются моим картографом.

Я исключаю из терминала следующее:

hadoop @ ubuntu: / usr / local / hadoop $ bin / hadoop jar /home/hadoop/vardtst.jar -libjars /home/hadoop/clui.jar -libjars /home/hadoop/model.jar gutenberg ou101

и я получаю следующее исключение:

на java.net.URLClassLoader $ 1.run (URLClassLoader.java:202)

at java.security.AccessController.doPrivileged (собственный метод)

на java.net.URLClassLoader.findClass (URLClassLoader.java:190)

at java.lang.ClassLoader.loadClass (ClassLoader.java:306)

на java.lang.ClassLoader.loadClass (ClassLoader.java:247)

at java.lang.Class.forName0 (собственный метод)

на java.lang.Class.forName (Class.java:247)

at org.apache.hadoop.util.RunJar.main (RunJar.java:149)

Пожалуйста, помогите .. Спасибо

Ответы [ 3 ]

19 голосов
/ 23 октября 2013

Также стоит отметить тонкий, но важный момент: способ задания дополнительных JAR-файлов для JVM, на которых выполняется распределенная карта, сокращает задачи, а для JVM, выполняющего клиентский задание, сильно отличается.

  • -libjars делает Jars доступными только для JVM, работающих с удаленной картой, и сокращает задачу

  • Чтобы сделать эти JAR-файлы доступными для клиентской JVM (JVM, созданная при запуске команды hadoop jar), необходимо установить переменную среды HADOOP_CLASSPATH:

$ export LIBJARS=/path/jar1,/path/jar2
$ export HADOOP_CLASSPATH=/path/jar1:/path/jar2
$ hadoop jar my-example.jar com.example.MyTool -libjars ${LIBJARS} -mytoolopt value

См .: http://grepalex.com/2013/02/25/hadoop-libjars/

Другой причиной неправильного поведения -libjars может быть неправильная реализация и инициализация пользовательского класса Job.

  • Класс задания должен реализовать интерфейс инструмента
  • Экземпляр класса конфигурации должен быть получен путем вызова getConf () вместо создания нового экземпляра;

См .: http://kickstarthadoop.blogspot.ca/2012/05/libjars-not-working-in-custom-mapreduce.html

4 голосов
/ 27 марта 2016

Когда вы указываете -LIBJARS с помощью команды jad Hadoop.Сначала убедитесь, что вы редактируете свой класс драйвера, как показано ниже:

    public class myDriverClass extends Configured implements Tool {

      public static void main(String[] args) throws Exception {
         int res = ToolRunner.run(new Configuration(), new myDriverClass(), args);
         System.exit(res);
      }

      public int run(String[] args) throws Exception
      {

        // Configuration processed by ToolRunner 
        Configuration conf = getConf();
        Job job = new Job(conf, "My Job");

        ...
        ...

        return job.waitForCompletion(true) ? 0 : 1;
    }
}

Теперь отредактируйте команду «hadoop jar», как показано ниже:

hadoop jar YourApplication.jar [myDriverClass] args -libjars path / to / jar / file

Теперь давайте разберемся, что происходит ниже.По сути, мы обрабатываем новые аргументы командной строки, реализуя ИНСТРУМЕНТ ИНТЕРФЕЙСА .ToolRunner используется для запуска классов, реализующих интерфейс Tool.Он работает в сочетании с GenericOptionsParser для анализа общих аргументов командной строки hadoop и изменяет конфигурацию инструмента.

В нашем Main () мы вызываем ToolRunner.run (new Configuration (), new myDriverClass (), args) - этот инструмент запускается Tool.run (String []), послепарсинг с заданными родовыми аргументами .Он использует данную конфигурацию или создает ее, если она пуста, а затем устанавливает конфигурацию инструмента с возможно измененной версией conf.

Теперь внутри метода run, когда мы вызываем getConf (), мы получаем измененную версиюКонфигурации. Поэтому убедитесь, что в вашем коде есть строка ниже.Если вы реализуете все остальное и по-прежнему используете конфигурацию conf = new Configuration (), ничего не будет работать.

Конфигурация conf = getConf ();

3 голосов
/ 01 августа 2011

Я нашел ответ, он выдавал ошибку, потому что я пропустил имя "основного" класса в команде.

Правильный способ выполнения: hadoop @ ubuntu: / usr / local / hadoop$ bin / hadoop jar /home/hadoop/vardtst.jar VardTest -libjars /home/hadoop/clui.jar,/home/hadoop/model.jar gutenberg ou101

, где VardTest - это класс, содержащий основной () метод.

Спасибо

...