Отправить работу в удаленный кластер Hazelcast
Я новичок в Hazelcast Jet и у меня очень простой вопрос. У меня настроен 3-х узловый кластер JET. У меня есть пример кода для чтения из Кафки и слив в IMap. Когда я запускаю его из командной строки (используя jet-submit.sh
и использовать JetBootstrap.getInstance()
чтобы получить экземпляр JET-клиента) он прекрасно работает. Когда я запускаю тот же код (используя Jet.newJetClient()
получить экземпляр и запустить как -> Java-приложение на Eclipse), я получаю:
java.lang.ClassCastException: cannot assign instance of java.lang.invoke.SerializedLambda to field com.hazelcast.jet.core.ProcessorMetaSupplier.
Не могли бы вы, пожалуйста, дайте мне знать, где я иду не так?
2 ответа
Когда вы используете экземпляр клиента для отправки задания, вы должны добавить все классы, которые содержат код, вызываемый заданием, в JobConfig
:
JobConfig config = new JobConfig();
config.addClass(...);
config.addJar(...);
...
client.newJob(pipeline, config);
Например, если вы используете лямбду для stage.map()
, класс, содержащий лямбду, должен быть добавлен.
jet-submit.sh
Сценарий делает это проще, автоматически добавляя весь представленный .jar
файл.
Одна из ваших лямбда-функций захватывает внешнюю переменную, вероятно, определенную на уровне класса, и этот класс не является сериализуемым или не добавляется в конфигурацию задания при отправке с клиента. Это делается автоматически при отправке через скрипт.
Пожалуйста, смотрите http://docs.hazelcast.org/docs/jet/0.6.1/manual/