#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 прав. Если ссылка на метод инициализируется напрямую, я имею в виду его физический адрес или что-то в этом роде, то для рабочих узлов будет проблемой ее выполнение. Потому что есть некоторый ресурс только в драйвере, к которому рабочие узлы не могут получить доступ. Вот почему мы получаем ошибки сериализации.