我使用Aerospike AsyncClient和Aerospike UDF模块使用多线程在Aerospike 2节点集群中插入1000万条记录。我遵循的步骤是:
创建了10个线程的执行服务,所有线程都将使用相同的AsyncClient
运行循环1000万次并使用下面的代码调用执行命令
for(int 1-0; i< 10000000; i ++){ final int j = i; executorService.execute(new Runnable(){ public void run(){ put(“test”,“binname”,“setname”,j,list1,list2,aerospikeClient); } }); }
private void put(String namespace,String setName,String binName, String keyVlaue, 列出campaignsIdsToBeAdd,List campaignsIdToBeRemoved,AsyncClient aerospikeClient){ Key key = new Key(namespace,setName,keyVlaue); aerospikeClient.execute(writePolicy,new WriteHandler(),key,“aerospike_udf”,“update_record”,Value.get(campaignsIdsToBeAdd), Value.get(campaignsIdToBeRemoved),Value.get(binName)); }
public void closed(){ System.out.println(“=== 1”);
if(aerospikeClient != null && aerospikeClient.isConnected())
aerospikeClient.close();
if(executorService != null && !executorService.isShutdown())
executorService.shutdown();
}
执行者服务和AsyncClient立即停止,之后没有插入,我丢失了提交的数据。
任何人都可以帮我解决这个问题吗?或建议我使用AsyncClient以及Aerospike udf功能的更好方法。
我尝试使用同步客户端执行此操作,但是插入所有值需要70分钟,但我希望在5分钟内完成。当我尝试在多个线程之间使用Sync客户端时,它会抛出客户端超时异常
答案 0 :(得分:2)
似乎你正在运行比常规读/写操作慢的udfs。因此,即使您等待异步调用完成,您最终可能需要超过5分钟。您需要调整群集大小以满足您的性能需求。因此,您还需要查看非编程替代方案。