【问题标题】:Serialization issue with Spark and ObjectMapper in Spring Boot-based applicatuon基于 Spring Boot 的应用程序中 Spark 和 ObjectMapper 的序列化问题
【发布时间】:2022-12-04 06:50:47
【问题描述】:

我正在使用 Spark,并且有一个基于 Spring Boot 的应用程序 bean:

@Component
@RequiredArgsConstructor
public class SomeService implements FlatMapFunction<T, K> {

  private final ObjectMapper mapper;
  
}

ObjectMapper 这是从应用程序上下文中获取的标准。问题是应用程序失败并显示org.apache.spark.SparkException: Task not serializable。这是序列化堆栈:

Caused by: java.io.NotSerializableException: org.springframework.http.converter.json.SpringHandlerInstantiator
Serialization stack:
- object not serializable (class: org.springframework.http.converter.json.SpringHandlerInstantiator, value: org.springframework.http.converter.json.SpringHandlerInstantiator@6e4912db)
- field (class: com.fasterxml.jackson.databind.cfg.BaseSettings, name: _handlerInstantiator, type: class com.fasterxml.jackson.databind.cfg.HandlerInstantiator)
- object (class com.fasterxml.jackson.databind.cfg.BaseSettings, com.fasterxml.jackson.databind.cfg.BaseSettings@155616d8)
- field (class: com.fasterxml.jackson.databind.cfg.MapperConfig, name: _base, type: class com.fasterxml.jackson.databind.cfg.BaseSettings)
- object (class com.fasterxml.jackson.databind.DeserializationConfig, com.fasterxml.jackson.databind.DeserializationConfig@66e72ca2)
- field (class: com.fasterxml.jackson.databind.ObjectMapper, name: _deserializationConfig, type: class com.fasterxml.jackson.databind.DeserializationConfig)
- object (class com.fasterxml.jackson.databind.ObjectMapper, com.fasterxml.jackson.databind.ObjectMapper@433ef204)
- field (class: com.smth.SomeService, name: mapper, type: class com.fasterxml.jackson.databind.ObjectMapper)

所以问题是关于不可序列化的SpringHandlerInstantiator

到目前为止,我通过在构造函数中手动分配 mapper 字段来解决这个问题:

public SomeService() {
  this.mapper = new ObjectMapper();
}

有没有办法以某种方式正确解决这个问题,我。 e.依赖Spring的DI?

我使用 Spring Boot 2.6.7 和 Spark 2.11。

【问题讨论】:

    标签: java spring apache-spark jackson objectmapper


    【解决方案1】:

    或者,尝试将 ObjectMapper bean 配置为使用可序列化的不同 HandlerInstantiator。这将允许您继续对 ObjectMapper bean 使用依赖注入,并且您不需要在 SomeService 类中创建新实例。

    @Configuration
    public class MyConfiguration {
      
      @Bean
      public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setHandlerInstantiator(new MyHandlerInstantiator());
        return mapper;
      }
    }
    

    在此示例中,MyHandlerInstantiator 是扩展HandlerInstantiator 并且可序列化的自定义类。实现此类以提供用于实例化反序列化处理程序的自定义行为(例如,通过修补 SpringHandlerInstantiator 的代码)。

    配置完成后,使用依赖注入将 ObjectMapper bean 注入 SomeService 类,ObjectMapper 实例将使用您自定义的 HandlerInstantiator 而不是不可序列化的 SpringHandlerInstantiator 类。这应该允许 SomeService 类可序列化并用于分布式环境,如 Apache Spark。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2016-12-24
      • 2020-10-19
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多