我们使用"小"内存的Aerospike服务器来存储最后一小时的网站分析。上一小时的数据大小约为 10 Gb。
我们尝试在 Aerospike 上从单独的服务器(基于 Java 的客户端)执行一些聚合查询,如下所示(在 LUA 中):
stream : aggregate( map(), complex_aggregate_function ) : reduce( simple_reduce_function )
根据文档,所有聚合都是在 Aerospike 节点(在我们的例子中是单个节点)上完成的,并在客户端上减少 -- 完成。
事实证明,aggregate() 函数只处理小批量数据,即 10-16 条记录。之后,聚合结果被发送到客户端,由 reduce() 处理。
由于 reduce() 操作是在客户端上执行的,这意味着服务器将向客户端发送至少 1/16 大小的数据。 即我们的数据有数百兆字节。谈论性能。
是否可以更改记录流聚合的"缓冲区大小"或"队列大小"或"任何大小"? 即是否可以"调整"Aerospike以在每个节点上仅调用一次reduce()函数?
此问题有两个方面 - 查询批大小和查询缓冲区大小。
查询批大小确定查询要在单个批中返回的记录数。假设您的查询为您提供 1000 条记录,而您的查询批大小为 1000,则所有结果都将在单个响应中返回。如果查询批大小为 100,则需要 10 批才能返回整个结果集。
有关更多详细信息,请参阅 http://www.aerospike.com/docs/operations/manage/queries/。
同样,您可以增加查询 buf 大小以增加缓冲区的大小。缓冲区大小越大,批处理计数越少。