Apache Flink:如何使用Java Map(或包含DTO的Map)流?

时间:2019-10-02 01:19:43

标签: java hashmap gson apache-flink flink-streaming

我正在使用Flink,并且具有动态变化的字段和嵌套字段的JSON字符串流到达我的系统。因此,我无法将此传入的JSON模拟并将其转换为静态POJO,而必须依赖于Map。

我的第一个转换是使用GSON解析将JSON字符串流转换为Map对象流,然后将地图包装在名为Data的DTO中。

(inside the first map transformation)
LinkedTreeMap map = gson.fromJson(input, LinkedTreeMap.class);

Data data = new Data(map); // Data has getters, setters for the map and implements Serializable

在此转换处理之后,当我尝试将结果流馈送到我的自定义Flink接收器时,就会出现问题。接收器中未调用invoke函数。但是,如果我从包含DTO的Map更改为没有Map的原始DTO或常规DTO,接收器将起作用。

我的DTO如下:

public class FakeDTO {
    private String id;
    private LinkedTreeMap map; // com.google.gson.internal

    // getters and setters
    // constructors, empty and with fields

我尝试了以下两种解决方案:

env.getConfig().addDefaultKryoSerializer(LinkedTreeMap.class,MapSerializer.class; 
env.getConfig().disableGenericTypes();

有专家建议我可以在这种情况下使用吗?

1 个答案:

答案 0 :(得分:0)

我能够解决此问题。在我的Flink日志中,我发现没有找到一个名为ReflectionSerializerFactory类的Kryo文件。我在maven中更新了Kryo版本,并为我的地图使用了Map类型,Flink文档说Flink支持。

只需确保在代码中指定了通用类型,并在Maps的POJO中添加getter和setter。

我还使用.returns(xyz.class)类型清理来避免类型擦除的影响。