加入 Apache Ignite 的最佳实践

Best practice to do join in Apache Ignite

我有两个大表 A 和 B,我想在两列上连接这两个表,比如说,project_id and customer_id.

当我在Apache Ignite 中做join 时,我发现性能很差。经过调查,我认为问题出在数据随机分布在不同的节点上。

当连接发生时,节点之间有数据传输,使相同的 project_id 和 customer_id 从 A 和 B 到同一个节点。

就我而言,

  1. 根据A和B的project_id和customer_id将数据加载到Ignite集群中,这样join时就没有数据传输了。该解决方案可以工作但不灵活。
  2. 只用一个节点来保存所有的数据。这个解决方案可以,但是对于单个节点有内存限制(一个节点不能容纳太多数据)

请问哪种解决方案更好,谢谢!

推荐前者(1.)。您应该以这种方式加载数据,以便相同 project_idcustomer_id 的数据位于两个表中的同一节点上。

这称为 affinity collocation,获得 Ignite 查询的良好性能(有时它们完全可以工作)是最重要的。

如果您设置正确,Ignite 会为您处理亲和力搭配,但有一些注意事项:

  • 关联键必须是主键的一部分(不是值字段)
  • 亲和键必须是单一的(因此您必须在 project_idcustomer_id 之间进行选择)或复合类型(具有自身含义的嵌套 POJO)或合成值?
  • 可能分区分布不均。假设您有一个大客户(或项目)。在处理这个客户时,除了一个节点之外的所有节点都将处于空闲和未使用状态。