我刚开始学习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对我来说是错误的选择。
答案 0 :(得分:2)
问题是您正在尝试序列化函数内的整个IMap
。直接修复是编写一个自定义处理器,可以在其init()
方法中访问Hazelcast Jet实例,并从中查找其IMap。由于init()
代码在目标成员上执行,因此在所有反序列化之后,这将起作用。
但是,在更一般的层面上,您的目标似乎是数据丰富&#34;类。我们想要在Jet中支持这种方式的方式是通过&#34;散列连接&#34;操作,目前不是一流的;但是有一个代码示例显示了该方法。您可以将整个IMap
内容汇集到顶点,将其转换为普通HashMap
并分发给所有丰富的处理器,或者您可以准备将直接使用的Hazelcast ReplicatedMap
由丰富的处理器。
第一种方法意味着你对IMap
的快照起作用;在第二个中,您可以在作业运行时继续更新ReplicatedMap
。
最好去检查样本:HashMapEnrichment和ReplicatedMapEnrichment。