加入 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 到同一个节点。
就我而言,
- 根据A和B的project_id和customer_id将数据加载到Ignite集群中,这样join时就没有数据传输了。该解决方案可以工作但不灵活。
- 只用一个节点来保存所有的数据。这个解决方案可以,但是对于单个节点有内存限制(一个节点不能容纳太多数据)
请问哪种解决方案更好,谢谢!
推荐前者(1.)。您应该以这种方式加载数据,以便相同 project_id
和 customer_id
的数据位于两个表中的同一节点上。
这称为 affinity collocation,获得 Ignite 查询的良好性能(有时它们完全可以工作)是最重要的。
如果您设置正确,Ignite 会为您处理亲和力搭配,但有一些注意事项:
- 关联键必须是主键的一部分(不是值字段)
- 亲和键必须是单一的(因此您必须在
project_id
和 customer_id
之间进行选择)或复合类型(具有自身含义的嵌套 POJO)或合成值?
- 可能分区分布不均。假设您有一个大客户(或项目)。在处理这个客户时,除了一个节点之外的所有节点都将处于空闲和未使用状态。
我有两个大表 A 和 B,我想在两列上连接这两个表,比如说,project_id and customer_id.
当我在Apache Ignite 中做join 时,我发现性能很差。经过调查,我认为问题出在数据随机分布在不同的节点上。
当连接发生时,节点之间有数据传输,使相同的 project_id 和 customer_id 从 A 和 B 到同一个节点。
就我而言,
- 根据A和B的project_id和customer_id将数据加载到Ignite集群中,这样join时就没有数据传输了。该解决方案可以工作但不灵活。
- 只用一个节点来保存所有的数据。这个解决方案可以,但是对于单个节点有内存限制(一个节点不能容纳太多数据)
请问哪种解决方案更好,谢谢!
推荐前者(1.)。您应该以这种方式加载数据,以便相同 project_id
和 customer_id
的数据位于两个表中的同一节点上。
这称为 affinity collocation,获得 Ignite 查询的良好性能(有时它们完全可以工作)是最重要的。
如果您设置正确,Ignite 会为您处理亲和力搭配,但有一些注意事项:
- 关联键必须是主键的一部分(不是值字段)
- 亲和键必须是单一的(因此您必须在
project_id
和customer_id
之间进行选择)或复合类型(具有自身含义的嵌套 POJO)或合成值? - 可能分区分布不均。假设您有一个大客户(或项目)。在处理这个客户时,除了一个节点之外的所有节点都将处于空闲和未使用状态。