Как распределить код между jvm

Некоторые распределенные вычислительные механизмы, такие как Spark или Flink, могут распределять код между компьютерами и jvm, например (в scala со spark):

sc.parallelize(1 to 10).map(i => i+1).collect

Здесь i => i+1 сериализуется, отправляется и выполняется на всех рабочих. Я хотел бы знать, как это делается?

Также я был бы признателен, если бы кто-нибудь мог указать мне исходный код (классы), связанные с этой проблемой, в какой-либо существующей среде распределенных вычислений, такой как Spark/Flink.


person Juh_    schedule 03.04.2018    source источник
comment
Из того, что я смог найти, RMI может быть инструментом, предоставляемым Java.   -  person XtremeBaumer    schedule 03.04.2018
comment
используя RMI в своем поиске, я нашел этот вопрос stackoverflow.com/q/36461299/1206998, в ответе которого есть комментарий о том, что RMI не используется (устаревшее и слишком медленное) :-\   -  person Juh_    schedule 03.04.2018
comment
Есть пара близких голосов. Можете ли вы прокомментировать, пожалуйста? Я старался быть максимально точным и просто добавил возможный практический пример того, что, как я ожидаю, будет сделано. Но я просто не знаю, как это работает, поэтому у меня может не быть подходящих слов.   -  person Juh_    schedule 03.04.2018
comment
Я отредактировал вопрос, чтобы сделать его более точным   -  person Juh_    schedule 04.04.2018


Ответы (1)


Изменить: этот ответ был сделан до обновления вопроса, который был помечен как «слишком широкий».

Код загружается из его классов, а классы загружаются через ClassLoader. Каждый раз, когда вы создаете поток, вы можете установить новый classLoader перед его запуском.

Учитывая эти способности, вы можете

  • Просто скачайте jar-файлы и создайте новый UrlClassLoader для доступа к этим jar-файлам на диске.
  • Создайте свой собственный загрузчик классов для загрузки определенного класса во время выполнения (из сети или другого...)
  • Используйте любую технологию, допускающую горячую загрузку кода: OSGI — одна из них.

Загрузчики классов являются иерархическими, если класс не найден вашим загрузчиком классов, он запрашивается у его родителя. Вот иерархия по умолчанию:

  • класс bootStrapLoader
  • расширение ClassLoader
  • Системный загрузчик классов пути к классам. системный путь к классам

Сервер приложений, такой как tomcat glassfish или wildfly, добавляет ClassLoader для каждого загруженного EAR или WAR, что позволяет динамически загружать приложения.

person pdem    schedule 03.04.2018
comment
Вы объясняете, как распространять скомпилированный код/jar. Но это не то, что я имел в виду. Я ищу, как распространять живой код. Что-то типа String code = serialize(new MyTrait{ ... }), отправьте его, а потом MyTrait t = deserialize(code) на другой jvm - person Juh_; 03.04.2018
comment
Я не понимаю, вы хотите горячую компиляцию или диспутировать локальный скомпилированный класс? загруженный класс имеет байт-код, и вам нужен этот байт-код для создания класса. Существуют также генераторы байт-кода, но это более общая проблема. - person pdem; 03.04.2018
comment
Я не уверен, какое слово использовать, но я думаю, что распространение локальных скомпилированных классов было бы в порядке вещей. Для начала неплохо было бы распространить локально скомпилированную функцию. - person Juh_; 03.04.2018
comment
В java нет понятия функции, только класс, который содержит метод и который не может быть разделен. и не забывайте, что все скомпилировано. Так что весь вопрос в том, что вы хотите отправить по сети? данные? => классическая серилизация (JSON, двоичный файл, другое), источник? => требуется компиляция, скомпилированный класс? => процесс, который я уже объяснил - person pdem; 03.04.2018
comment
Проще говоря, в искре и написании на scala можно делать sc.parallelize(1 to 1000).map(i => i+1).collect. parallelize будет распространять данные, а карта отправит функцию i => i+1 и выполнит ее на распределенных данных. Так и на других jvms. Как это происходит с распределением кода, я хотел бы понять. И для этого примера он не распространяет банку - person Juh_; 03.04.2018
comment
хорошо, если это java-код, вам отправляется байт-код (скомпилированный java) с переопределением загрузчика классов, это не простая операция. И объект, который вы передаете методу карты, представляет собой объект, реализующий лямбда (это не самый простой класс в java). необходимо управлять байт-кодом, см.: stackoverflow.com/questions/17321039 / - person pdem; 03.04.2018
comment
Является ли исходный код Java обязательным для вас? Что может быть простым, так это использование интерпретируемого языка, такого как groovy или javascript, и его можно вызывать из java. - person pdem; 03.04.2018