在Hazelcast Jet处理器上使用Hazelcast IMap

时间:2017-07-24 09:19:54

标签: java hazelcast-imap hazelcast-jet

我刚开始学习Hazelcast Jet。 我的来源是UDP数据报。我想在Jet的某些节点上并行处理它,并通过'domain'将它们重新发送到其他地址。 我想使用Hazelcast IMDG IMap和loader来通过'source ip'获得'domain'。

DAG dag = new DAG();        
Vertex source = dag.newVertex("datagram-source",
                UdpSocketP.supplier("0.0.0.0", 41813));
        source.localParallelism(1);

        Vertex mapper = dag.newVertex("map",
                map(new DomainMapper(instance.getMap("mysqlNas"))));

        Vertex sink = dag.newVertex("sink",
                Sinks.writeFile("logs"));
        sink.localParallelism(1);

但是当我尝试在DistributedFunction上使用IMap时,我得到了异常

Exception in thread "main" java.lang.IllegalArgumentException: "metaSupplier" must be serializable
    at com.hazelcast.jet.impl.util.Util.checkSerializable(Util.java:185)
    at com.hazelcast.jet.Vertex.<init>(Vertex.java:101)
    at com.hazelcast.jet.Vertex.<init>(Vertex.java:78)
    at com.hazelcast.jet.DAG.newVertex(DAG.java:79)
    at org.eltex.softwlc.sorm.replicator.JetServer.main(JetServer.java:46)
Caused by: java.io.NotSerializableException: com.hazelcast.jet.stream.impl.MapDecorator

DomainMapper代码:

package org.eltex.softwlc.sorm.replicator;

import com.hazelcast.core.IMap;
import com.hazelcast.jet.function.DistributedFunction;

import java.io.Serializable;
import java.net.DatagramPacket;

/**
 * Created by mickey on 21.07.17.
 */
public class DomainMapper implements DistributedFunction<DatagramPacket, IpData>, Serializable {

    private final IMap<String, NasValue> map;

    public DomainMapper(IMap<String, NasValue> map) {
        this.map = map;
    }

    @Override
    public IpData apply(DatagramPacket datagramPacket) {
        final IpData d = new IpData(datagramPacket, datagramPacket.getAddress().getHostAddress());
        System.out.println(d);

        final NasValue nasValue = map.get(datagramPacket.getAddress().getHostAddress());
        if (nasValue!=null) {
            d.setDomain(nasValue.getDomain());
        }

        return d;
    }
}

我的错误是什么? 或者Hazelcast Jet对我来说是错误的选择。

1 个答案:

答案 0 :(得分:2)

问题是您正在尝试序列化函数内的整个IMap。直接修复是编写一个自定义处理器,可以在其init()方法中访问Hazelcast Jet实例,并从中查找其IMap。由于init()代码在目标成员上执行,因此在所有反序列化之后,这将起作用。

但是,在更一般的层面上,您的目标似乎是数据丰富&#34;类。我们想要在Jet中支持这种方式的方式是通过&#34;散列连接&#34;操作,目前不是一流的;但是有一个代码示例显示了该方法。您可以将整个IMap内容汇集到顶点,将其转换为普通HashMap并分发给所有丰富的处理器,或者您可以准备将​​直接使用的Hazelcast ReplicatedMap由丰富的处理器。

第一种方法意味着你对IMap的快照起作用;在第二个中,您可以在作业运行时继续更新ReplicatedMap

最好去检查样本:HashMapEnrichmentReplicatedMapEnrichment