Как метод RunJar Hadoop распределяет файлы классов / jar по узлам? - PullRequest
8 голосов
/ 10 августа 2010

Я пытаюсь использовать JIT-компиляцию в clojure для генерации классов мапперов и редукторов на лету.Однако эти классы не распознаются JobClient (это обычное исключение ClassNotFoundException.)

Если я AOT компилирую Mapper, Reducer и Tool и запускаю работу с помощью RunJar, все выглядит нормально.После просмотра source кажется, что он распаковывает jar и создает пользовательский URLClassLoader, который он использует для загрузки «основной» реализации.Чего я не вижу, так это того, как jar распределяется по узлам или даже как он используется в кластере с одним узлом.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Во-первых, когда мы отправляем флягу задания, она копируется в промежуточный каталог, настроенный в свойствах, трекером заданий. И когда заданию отслеживания назначается задание (планировщиком ofc), оно копирует из промежуточного каталога и выполняет.

Если вы хотите предоставить внешний Jar-файл для выполнения, вы можете сделать это с помощью средства распределенного кэша Hadoop.

2 голосов
/ 13 октября 2011

Clojure имеет что-то общее с другими методами сценариев Java, такими как Beanshell, Groovy и Ant ... в том, что при запуске сценария, если вы используете функции загрузки классов языка сценариев, когда ваш сценарий запускает его, -связывается с загрузчиком классов по умолчанию, а затем ваша JVM запускается в настраиваемом загрузчике классов для механизма сценариев. Я понятия не имею, что является причиной вашей ошибки, но вы должны иметь в виду, что если вы вообще делаете в своем скрипте НИЧЕГО, что заставит пользовательский загрузчик классов отказаться от загрузчика классов по умолчанию JVM, то это может объяснить несколько вещей.

По своему опыту я не смог преодолеть эти проблемы, и поэтому, например, в Beanshell мне пришлось прекратить использовать параметры загрузчика классов и указать весь мой путь к классу в командной строке, которая запускает JVM. Таким образом, я знал, что скрипт использует загрузчик классов по умолчанию и все классы будут найдены.

Другой пример с:

Классы / заводной / A.groovy

Классы / заводной / B.groovy

 public class A {
    public A() {
       B b = new B()
    }
 }

GroovyClassLoader не будет загружать класс Groovy B. Этот тип вещей также может быть воспроизведен при попытке загрузить драйвер JDBC с classForName из пользовательского загрузчика классов (не загрузчик классов по умолчанию).

...