在具有百万个条目的imap上使用执行程序进行hazelcast的性能

时间:2019-04-29 18:40:44

标签: hazelcast hazelcast-imap

我们在仅包含100,000个对象的imap上应用了很少的谓词来过滤数据。这些谓词将随每个用户而变化。在具有两个节点(每个节点显示50000)和100,000条记录的本地计算机(16 GB)上进行POC时,我在30秒内获得了输出,这比直接查询数据库还重要。

增加节点数会减少时间,我什至尝试使用PagingPredicate,但每页花费大约20秒

IMap objectMap = hazelcastInstance.getMap("myMap");
MultiMap resultMap = hazelcastInstance.getMap("myResultMap");

/*Option 1 : passing hazelcast predicate for imap.values*/

objectMap.values(predicate).parallelStream().forEach(entry -> resultMap(userId, entry));

/*Option 2: applying java predicate to entrySet OR localkeyset*/
objectMap.entrySet.parallelstream().filter(predicate).forEach(entry -> resultMap(userId, entry));

1 个答案:

答案 0 :(得分:1)

更多节点会有所帮助,但这种改进很难量化。它可能很大,也可能很小。

代码示例中的部分工作涉及对100,000个条目应用谓词。如果没有索引,那么扫描阶段将在每个节点检查50,000个条目(如果有2个节点)。将最多4个节点加倍,每个节点有25,000个条目要扫描,因此扫描时间将减少一半。

扫描时间是查询时间的一部分,整个结果集也必须由每个节点的部分结果组成。因此,在最佳情况下,将节点数量加倍可能会接近运行时间的一半,或者可能不是一个明显的改进。

也许更大的问题是您要达到什么目标?

代码示例中的

t(sapply(c("cyl", "disp", "wt"), function(x) summary(lm(paste0("mpg ~ ", x), data = mtcars))$coefficients[-1, 1:2])) 将结果集检索到中心点,然后将其应用objectMap.values(predicate)尝试将结果并行合并到MultiMap中。因此,这看起来更像是一个ETL,而不是查询。

按标题使用执行程序,类似parallelStream()之类的东西可以使它更好地并行化,因为没有中间点可以保持中间结果。