Приложение Java spark зависает при использовании ссылки на метод

#java #apache-spark #rdd

#java #apache-spark #rdd

Вопрос:

Я пишу приложение Spark на Java под названием MyApp, и у меня есть следующий код:

 final JavaRDD<MyClass<MyInnerClass>> myRDD = ...
myRDD.repartition(50).map(ObjectMapperFactory.OBJECT_MAPPER_MIXIN::writeValueAsString)
.saveAsTextFile(outputPath, GzipCodec.class);
  

Когда я запускаю тесты для своего пакета, это приложение зависает. Однако, если я использую лямбда-функцию вместо передачи ссылки на метод, например

 myRDD.repartition(50).map(t -> ObjectMapperFactory.OBJECT_MAPPER_MIXIN.writeValueAsString(t))
     .saveAsTextFile(outputPath, GzipCodec.class);
  

Тогда тесты работают нормально. Единственное изменение заключается в операторе map. Я использую Java 8, Spark 1.5.2 и запускаю кластер в локальном режиме.

РЕДАКТИРОВАТЬ: если я запускаю тест для MyApp сам по себе, тест отлично работает со старым кодом. Однако, если я запускаю полный набор тестов, именно тогда приложение начинает зависать. В моем пакете есть другие приложения Java spark.

Комментарии:

1. Я не знаком с Spark, но я укажу, что в вашем случае существует небольшая разница между ссылкой на лямбда и метод. Ссылка на метод напрямую ссылается ObjectMapperFactory.OBJECT_MAPPER_MIXIN , при необходимости немедленно инициализируя ее. Лямбда-выражение ничего не инициализирует, пока оно фактически не будет использовано.

2. Если я просто передаю обычный ObjectMapper, я получаю ошибки сериализации, поэтому похоже, что использование Mixins заставляет приложение проглатывать ошибки.

3. Я хотел бы сказать, что @shmosel прав. Если ссылка на метод инициализируется напрямую, я имею в виду его физический адрес или что-то в этом роде, то для рабочих узлов будет проблемой ее выполнение. Потому что есть некоторый ресурс только в драйвере, к которому рабочие узлы не могут получить доступ. Вот почему мы получаем ошибки сериализации.