我们使用“小”的内存--唯一的Aerospike服务器来存储过去一个小时的网站分析。过去一个小时的数据大小约为10 Gb。
我们尝试从单独的服务器(基于Java的客户端)在Aerospike上执行一些聚合查询,如下所示(在LUA中):
stream : aggregate( map(), complex_aggregate_function ) : reduce( simple_reduce_function )根据文档,所有的聚合都是在Aerospike节点(在我们的例子中是单个节点)上完成的,而reduce --在客户端上完成。
事实证明,aggregate()函数只处理小批量数据,即10-16条记录。之后,聚合结果被发送到客户端,由reduce()进行处理。
由于reduce()操作是在客户端执行的,这意味着服务器将向客户端发送至少1/16大小的数据。也就是说,我们的数据有几百兆字节。谈一谈性能。
是否可以更改记录流聚合的“缓冲区大小”、“队列大小”或“任意大小”?也就是说,有没有可能“调优”Aerospike,让每个节点只调用一次reduce()函数?
发布于 2014-12-11 18:57:52
这个问题有两个方面-查询批处理大小和查询缓冲区大小。
查询批处理大小确定查询在单个批处理中返回的记录数。比方说,如果您的查询提供了1000条记录,并且您的查询批处理大小为1000,那么所有结果都将在一个响应中返回。如果您的查询批大小为100,则需要10个批才能返回整个结果集。
有关更多详细信息,请参阅http://www.aerospike.com/docs/operations/manage/queries/。
类似地,您可以增加query-buf-size来增加缓冲区的大小。较大的缓冲区大小将导致较低的批次计数。
https://stackoverflow.com/questions/27405337
复制相似问题