【问题标题】:How to evenly distribute data into and compute in an apache ignite cluster如何将数据均匀分布到 apache ignite 集群中并在其中进行计算
【发布时间】:2019-11-16 21:23:59
【问题描述】:

目的是演示数据平衡和计算配置。为此,我想将 100000 条记录加载到 ignite 集群中。 (使用来自 ignite-spring 的 IgniteRepository),并使用 IgniteRunnable 执行 affinityRun,该 IgniteRunnable 通过某些搜索条件检索数据并进行处理。

Ignite 始终将计算作业传递给另一个节点(与我提交的位置不同),但是,所有 100K 记录都在该单个节点上处理。 所以要么我的数据不平衡,要么affinityRun没有生效。 提前感谢您的帮助!

点燃配置

    @Bean
    public Ignite igniteInstance() {
        IgniteConfiguration config = new IgniteConfiguration();

        CacheConfiguration cache = new CacheConfiguration("ruleCache");
        cache.setIndexedTypes(String.class, RuleDO.class);
        //config.setPeerClassLoadingEnabled(true);
        cache.setRebalanceBatchSize(24);
        config.setCacheConfiguration(cache);
        Ignite ignite = Ignition.start(config);
        return ignite;
    }

RestController方法触发处理

    @RequestMapping("/processOnNode")
    public String processOnNode(@RequestParam("time") String time) throws Exception {
        IgniteCache<Integer, String> cache = igniteInstance.cache("ruleCache");

        igniteInstance.compute().affinityRun(Collections.singletonList("ruleCache"), 0, new NodeRunnable(time));
        return "done";
    }

NodeRunner -> 运行()

    @Override
    public void run() {
        final RuleIgniteRepository igniteRepository = SpringContext.getBean(RuleIgniteRepository.class);
        igniteRepository.findByTime(time).stream().forEach(ruleDO -> System.out.println(ruleDO.getId() + " : " + ruleDO));
            System.out.println("done on the node");
    }

我希望 100k 处理平均分布在我的 3 个节点上。

【问题讨论】:

  • 你确定你的节点已经组成集群了吗?可以分享所有节点的最新“拓扑快照”消息吗?
  • 是的,他们有\n 2019-11-06 15:53:14.872 INFO 28248 --- [main] o.a.i.i.m.d.GridDiscoveryManager:拓扑快照 [ver=2,locNode=29994e83,servers=2,clients =0,状态=ACTIVE,CPUs=4,offheap=6.1GB,heap=6.8GB] 2019-11-06 15:53:13.559 信息 28306 --- [vent-worker-#42] o.a.i.i.m.d.GridDiscoveryManager:拓扑快照 [ ver=2,locNode=b90ccd61,servers=2,clients=0,state=ACTIVE,CPUs=4,offheap=6.1GB,heap=6.8GB]
  • 你有坚持吗?否则,记录似乎应该均匀分布在 2 个节点之间。
  • @alamar - 是的,我正在使用 ignite-spring 存储库在 ignite 中进行内存持久性。有没有办法我可以看到节点明智的数据分布?
  • 您可以使用 Web 控制台来做到这一点。

标签: ignite


【解决方案1】:

您只为单个分区 0 执行逻辑

igniteInstance.compute().affinityRun(Collections.singletonList("ruleCache"), 0, new NodeRunnable(time));

数据分布在 1024 个分区(默认情况下),分区 0 的主副本存储在其中一个节点上。如果您想看到每个节点都参与计算,则需要对多个分区或不同的亲和键执行此代码。

【讨论】:

  • 有没有一种方法我不需要指定分区以及不使用关联键并且我的所有 ignite 节点都参与他们拥有的所有数据?
  • 你需要用compute.broadcast()方法广播一个计算,然后遍历本地数据。
【解决方案2】:

感谢大家的帮助!特别是@dmagda 广播运行良好,但是使用存储库方法,它运行在集群上的大量数据上,从而破坏了搭配的目的。 我不得不放弃 jpa 并使用缓存方法,这很有效。 这是 IgniteRunnable 类:

@Override
public void run() {
    final Ignite ignite = SpringContext.getBean(Ignite.class);
    IgniteCache<String, RuleDO> cache = ignite.cache("ruleCache");
    cache.localEntries(CachePeekMode.ALL)
            .forEach(entry -> {
                System.out.println("working on local data, key, value" + entry.getKey() + " : " + entry.getValue();
    }
}

我调用的是广播而不是 affinityRun:

igniteInstance.compute().broadcast(new NodeRunnable(time));

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多