通过Java客户端使用UDF时,Aerospike异常增加内存消耗(查询聚合)

时间:2016-10-20 03:01:37

标签: java lua aerospike

首先让我解释一下。我有一段来自Java的代码片段,其编写如下:

Statement statement = new Statement();
statement.setNamespace("foo");
statement.setSetName("bar");
statement.setAggregateFunction(Thread.currentThread().getContextClassLoader(),
    "udf/resource/path","udfFilename","udfFunctionName",
    "args1","args2","args3","args4");
ResultSet rs = aerospikeClient.getClient().queryAggregate(null,statement);

while(rs.next()){
   //insert logic code here 
}

通过该示例代码片段,我能够使用由Aerospike文档采样的lua编写的UDF。 UDF只搜索多个分档并返回其结果,它永远不会持久存在,也不会转换任何数据。

现在的情况是,当使用此代码调用UDF的函数时,在AMC(Aerospike管理控制台)中,它产生的聚合作业标记为"完成(ok)"但从来没有标记为完成,仍然在"运行工作"表不是"已完成的工作"表。 (见下图)

Jobs Under Running Jobs Table

Jobs Under Completed Jos Table

并根据Bash Terminal命令" Top"我看到Aerospike服务器的内存百分比使用量随着乔布斯数量的增长而不断增长,直到Aerospike服务器失败,因为它最大限度地延长了机器的内存使用量。

我的问题是,

  1. 这些工作是否有可能放弃这些资源(如果真的是异常内存增加的话)?
  2. 如果不是负责的工作,那是什么?
  3. *** EDITED: 示例Lua代码:

    local function map_request(record)
        return map {response = record.response,
                    templateId = record.templateId, 
                    id = record.id, requestSent = record.requestSent,
                    dateReplied = record.dateReplied}
    end
    
    function checkResponse(stream, responseFilter, templateId, validtyPeriod, currentDate)
           local function filterResponse(record)
                if responseFilter ~= "FOO" and validityPeriod > 0 then
                       return (record.response == responseFilter) and 
                              (record.templateId == templateId) and 
                              (record.dateReplied + validityPeriod) > currentDate
                else
                       return (record.response == responseFilter) and 
                              (record.templateId == templateId)
                end
            end
            return stream:filter (filterResponse):map(map_request)
    end
    

0 个答案:

没有答案