【问题标题】:Hazelcast Jet with an IMap source and OBJECT in-memory formatHazelcast Jet 具有 IMap 源和 OBJECT 内存格式
【发布时间】:2020-08-18 06:46:22
【问题描述】:

我有 OBJECT 格式的 Hazelcast IMap 中的项目,并且我正在使用 Jet 聚合操作将该 IMap 作为管道源。由于 OBJECT 格式,我希望在处理过程中避免对 IMap 中的项目进行任何序列化/反序列化,这与原生 Hazelcast 条目处理和查询的工作方式相同。但是,我可以看到我的项目实际上正在被序列化,然后在传递给我的聚合器之前被反序列化。

以这种方式使用 Jet 时是否可以避免序列化/反序列化步骤?如果有,怎么做?

【问题讨论】:

    标签: hazelcast-jet


    【解决方案1】:

    是的,本地地图阅读器将始终序列化/反序列化条目。我能想到解决这个问题的唯一方法是使用自定义源,它使用map.localKeySet(),然后使用mapUsingIMap 对这些键进行连接。源代码如下所示:

    SourceBuilder.batch("localKeys", c -> c.jetInstance().getMap("map"))
     .fillBufferFn((map, buf) -> {
        for (Object key : map.localKeySet(predicate)) {
            buf.add(key);
        }
        buf.close();
     }).distributed(1).build());
    

    【讨论】:

    • 谢谢,但我认为mapUsingIMap 最终会进行序列化/反序列化,因此实际上与仅使用Sources.map 没有任何不同。假设我是对的,我想这意味着 Jet 无法避免序列化/反序列化?
    • 我相信它不应该反序列化这个值。它在下面使用IMap.getAsync
    • 我可能做错了什么,但如果我包含mapUsingIMap,我会看到我的项目被序列化/反序列化。如果我用返回虚拟值的简单map 替换它,我看不到任何序列化/反序列化。它似乎来自com.hazelcast.map.impl.operation.GetOperation.runInternal,其中有一条评论“如果是本地电话,我们会复制”
    • 是的,你是对的,这是我的困惑。我们有一个客户实际上修补了 Hazelcast 以防止这种反序列化,但是这还没有进入生产版本。然而,它要求数据是不可变的。
    • 是的,它要求用户不要搞砸和修改数据,这显然使事情变得更加脆弱。但我认为这将是一个非常有用的选项,因为如果反序列化一个项目需要与处理一个项目相似的时间,那么这会对性能产生非常严重的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多