Java 为什么我的Cassandra Prepared语句接收数据的速度如此之慢?
我有一个包含100000个名称的Java列表,我想将其吸收到一个运行Datastax Enterprise 5.1和Cassandra 3.10.0的3节点Cassandra集群中 我的代码接受了,但需要很长时间。我在集群上运行了一个压力测试,每秒能够完成25000次写操作。通过我的摄取代码,我得到了大约每秒200次的糟糕表现 我的Java列表中有100000个名称,称为myList。我使用下面准备好的语句和会话执行来接收数据Java 为什么我的Cassandra Prepared语句接收数据的速度如此之慢?,java,cassandra,datastax-enterprise,Java,Cassandra,Datastax Enterprise,我有一个包含100000个名称的Java列表,我想将其吸收到一个运行Datastax Enterprise 5.1和Cassandra 3.10.0的3节点Cassandra集群中 我的代码接受了,但需要很长时间。我在集群上运行了一个压力测试,每秒能够完成25000次写操作。通过我的摄取代码,我得到了大约每秒200次的糟糕表现 我的Java列表中有100000个名称,称为myList。我使用下面准备好的语句和会话执行来接收数据 PreparedStatement prepared = sessi
PreparedStatement prepared = session.prepare("insert into names (id, name) values (?, ?)");
int id = 0;
for(int i = 0; i < myList.size(); i++) {
id += 1;
session.execute(prepared.bind(id, myList.get(i)));
}
监控5秒输出显示了3次迭代的以下内容:
/192.168.20.25:9042 connections=1, current load=1, maxload=32768
/192.168.20.26:9042 connections=1, current load=0, maxload=32768
/192.168.20.34:9042 connections=1, current load=0, maxload=32768
/192.168.20.25:9042 connections=1, current load=1, maxload=32768
/192.168.20.26:9042 connections=1, current load=0, maxload=32768
/192.168.20.34:9042 connections=1, current load=0, maxload=32768
/192.168.20.25:9042 connections=1, current load=0, maxload=32768
/192.168.20.26:9042 connections=1, current load=1, maxload=32768
/192.168.20.34:9042 connections=1, current load=0, maxload=32768
我似乎没有很有效地利用集群。我不确定我做错了什么,如果有任何提示,我将不胜感激
谢谢大家! 使用executeAsync。 异步执行提供的查询。此方法不会阻塞。一旦查询被传递到底层网络堆栈,它就会返回。特别是,从该方法返回并不能保证查询有效,甚至不能保证查询已提交到活动节点。访问ResultSetFuture时,将引发与查询失败相关的任何异常 您正在插入大量数据。如果您使用executeAsync,而您的集群无法处理如此多的数据,它可能会引发异常。您可以使用信号量限制executeAsync 例如:
PreparedStatement prepared = session.prepare("insert into names (id, name) values (?, ?)");
int numberOfConcurrentQueries = 100;
final Semaphore semaphore = new Semaphore(numberOfConcurrentQueries);
int id = 0;
for(int i = 0; i < myList.size(); i++) {
try {
id += 1;
semaphore.acquire();
ResultSetFuture future = session.executeAsync(prepared.bind(id, myList.get(i)));
Futures.addCallback(future, new FutureCallback<ResultSet>() {
@Override
public void onSuccess(ResultSet result) {
semaphore.release();
}
@Override
public void onFailure(Throwable t) {
semaphore.release();
}
});
} catch (Exception e) {
semaphore.release();
e.printStackTrace();
}
}
PreparedStatement prepared=session.prepare(“插入名称(id,name)值(?,)”;
int numberOfConcurrentQueries=100;
最终信号量信号量=新信号量(numberOfConcurrentQueries);
int id=0;
对于(int i=0;i
来源:使用executeAsync。 异步执行提供的查询。此方法不会阻塞。一旦查询被传递到底层网络堆栈,它就会返回。特别是,从该方法返回并不能保证查询有效,甚至不能保证查询已提交到活动节点。访问ResultSetFuture时,将引发与查询失败相关的任何异常 您正在插入大量数据。如果您使用executeAsync,而您的集群无法处理如此多的数据,它可能会引发异常。您可以使用信号量限制executeAsync 例如:
PreparedStatement prepared = session.prepare("insert into names (id, name) values (?, ?)");
int numberOfConcurrentQueries = 100;
final Semaphore semaphore = new Semaphore(numberOfConcurrentQueries);
int id = 0;
for(int i = 0; i < myList.size(); i++) {
try {
id += 1;
semaphore.acquire();
ResultSetFuture future = session.executeAsync(prepared.bind(id, myList.get(i)));
Futures.addCallback(future, new FutureCallback<ResultSet>() {
@Override
public void onSuccess(ResultSet result) {
semaphore.release();
}
@Override
public void onFailure(Throwable t) {
semaphore.release();
}
});
} catch (Exception e) {
semaphore.release();
e.printStackTrace();
}
}
PreparedStatement prepared=session.prepare(“插入名称(id,name)值(?,)”;
int numberOfConcurrentQueries=100;
最终信号量信号量=新信号量(numberOfConcurrentQueries);
int id=0;
对于(int i=0;i
来源:您为什么需要id?成功计数?id是分区键此代码似乎有点不完整:使用
numberOfConcurrentQueries
Permissions、1
acquire和myList.size()
释放创建的信号量。。。而且我从来不会用信号灯来完成这样的任务。对我来说,一个普通的计数器就足够了。@xmas79谢谢,答案已编辑。为什么需要id?成功计数?id是分区键此代码似乎有点不完整:使用numberOfConcurrentQueries
Permissions、1
acquire和myList.size()
释放创建的信号量。。。而且我从来不会用信号灯来完成这样的任务。对我来说,一个普通的计数器就足够了。@xmas79谢谢,答案已编辑。