如何在Hazelcast Jet读取IMDG数据 二者是否需要单独配置
问题解答
问题根因
你当前代码中两次调用Hazelcast.newHazelcastInstance()和Jet.newJetInstance(),默认会启动两个独立的Hazelcast节点,未配置集群发现规则的情况下属于两个完全隔离的集群,因此数据无法互通。
核心认知说明
Hazelcast Jet底层本身就内嵌了完整的Hazelcast IMDG实例,支持所有IMDG的原生API(包括IMap操作、MapStore持久化配置等),无需单独启动独立的IMDG实例。
实现共享IMap的两种方案
- 方案一:单实例部署(推荐)
直接仅启动Jet实例,所有IMDG的缓存操作、MapStore配置都直接基于Jet实例完成,不需要额外创建独立的HazelcastInstance。单套配置即可同时满足缓存持久化和流批处理的需求,所有IMap天然共享。 - 方案二:集群互通部署
如果业务需要将IMDG集群和Jet集群分开部署,需保证两套集群使用相同的集群名,配置一致的集群发现规则(如组播、TCP-IP节点列表),Jet节点会作为对等节点或客户端加入IMDG集群,即可直接读取IMDG侧的所有IMap数据。
修改后的测试代码示例
public class Test { // 仅初始化Jet实例,自带完整IMDG能力 JetInstance jet = Jet.newJetInstance(); public static void main(String[] args) { Test t = new Test(); t.loadIntoIMap(); t.readFromIMap(); } public void loadIntoIMap() { // 直接用Jet实例获取IMap,和原生IMDG实例操作完全一致 IMap<String, String> map = jet.getMap("my-distributed-map"); // MapStore配置直接配到Jet的配置文件中即可生效 map.put("1", "John"); map.put("2", "Mary"); map.put("3", "Jane"); } public void readFromIMap() { System.err.println("--manu---"); jet.getMap("s").put("1", "2"); System.err.println(jet.getMap("s").size()); // 此处可正常读到3条数据 System.err.println(jet.getMap("my-distributed-map").size()); } }
配置说明
如果需要自定义配置(如MapStore规则、集群参数、作业参数),仅需维护一套hazelcast.yaml/hazelcast.xml配置文件即可:
- 所有IMDG相关配置(如MapStore、内存策略、分区规则)直接按IMDG配置项编写即可,Jet启动时会自动识别加载
- 仅当需要配置Jet特有的流批作业参数时,才需要额外添加Jet专属配置项,两者可以共存于同一份配置文件中
内容的提问来源于stack exchange,提问作者vivek
相关产品推荐
相关产品推荐

