当前位置: 首页 > 知识库问答 >
问题:

Flink序列化:POJO类型与GenericType

赵明亮
2023-03-14

在我的Flink应用程序中,我使用java.time.instant表示UTC时间戳。应用程序运行良好,但我最近在Flink日志中注意到这条消息

“类class java.time.instant不能用作POJO类型,因为并非所有字段都是有效的POJO字段,必须作为GenericType处理。有关对性能影响的详细信息,请阅读Flink文档中的”数据类型&序列化“。”

共有1个答案

邹俊豪
2023-03-14

日志消息有点误导,但您的理解是正确的。instant在Flink1.6中使用Kryo序列化。

在Flink1.7+instant将使用InstantSerializer序列化,而不是使用Kryoserializer序列化。

您的POJO是否会被这样对待,并不取决于instant将如何在POJO中序列化。消息只是说系统试图查看instant是否是POJO。

    public class SpecialMomentWithName {
        private String name;
        public Instant specialMoment;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

SpecialMomentWithName将始终作为Flink中的POJO处理。

在微基准测试中使用Kryo与新的InstanceSerializer序列化instant时,您可能会发现性能受到了很小的冲击。很难预测Flink作业的性能是否会从这样的更改中受益:如果instant的序列化成本消耗了大部分CPU时间(并且作业是CPU限制的),那么我希望性能得到改善。如果您的网络或硬盘(当使用RocksDB时)是限制因素,我不会期望性能得到改善。

如果没有对实际性能下降的地方进行一些分析,我就不会优化实例序列化的性能。如果发现像这样序列化时间会影响性能,可以尝试将实例表示为。这将降低代码的可读性,并且可能会有额外的CPU周期用于类型之间的转换。

 类似资料:
  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

  • 我有一个从CSV文件读取的: 据我所知,是一个POJO: 我还有一个简单的课程: 但当我尝试使用它时,例如从测试中: 我得到以下错误: 我读过这些问题和答案,但运气不好: 任务不可序列化Flink 无法在scala中序列化任务 任务不可序列化:java。伊奥。仅在类而非对象上调用闭包外函数时NotSerializableException

  • 使用GSON如何将列表的类名附加到输出的json字符串中?我已经浏览了api,但没有找到任何与此相关的参考资料。我在真实代码中使用了GsonBuilder,但也没有看到任何选项。 这将提供以下输出: json=[{“name”:“Alice”},{“name”:“Bob”}] 如何实现以下输出?或者类似的东西。 json={"人":[{"名字":"爱丽丝"},{"名字":"鲍勃"}]} 或 jso

  • 我需要将包含类型为Pair的对象的列表序列化为xml 首先,我创建了一个类PairList来保存对的列表,然后我创建了一个实际的类,它表示一对两个值,key和value。 然后,我尝试序列化它: 不幸的是,我遇到了一个异常:。欢迎任何关于如何避免此异常并序列化该类的想法。 如果我选择不序列化ttype和utype字段(通过将其设置为受保护或私有),则序列化有效。我不明白为什么它不想序列化类型字段。

  • 我有一个简单的枚举,我想序列化和反序列化。该类如下所示: 问题是,我通过restful调用发送它,接收方可以接收任何类型(因此它只知道它将接收对象)。所以Jackson应该能够找出反序列化它的参数类型。 有可能这样做吗?我认为在生成的json中包含类名应该可以让Jackson判断出类型,但我一直无法做到这一点。