Cassandra群集规格:
Nodes: 6
Storage: 1536 GB
Cores: 48
Ram: 168 GB
我本地的Cassandra群集的延迟时间:330毫秒至390毫秒
我正在使用cassandra java驱动程序,spark-cassandra-connector_2.11版本2.3.2
java驱动程序中的集群配置:
private static Session connect(
final String node, final Integer port, final String userName, final String password) {
Builder b = Cluster.builder().addContactPoints(node.split(COMMA_SEPARATOR));
if (!Strings.isNullOrEmpty(userName) && !Strings.isNullOrEmpty(password)) {
b.withCredentials(userName, password);
}
if (port != null && port != 0) {
b.withPort(port);
}
PoolingOptions poolingOptions = new PoolingOptions();
poolingOptions
.setMaxRequestsPerConnection(HostDistance.LOCAL, 32768)
.setMaxRequestsPerConnection(HostDistance.REMOTE, 10000)
.setMaxConnectionsPerHost(HostDistance.LOCAL, 3)
.setMaxConnectionsPerHost(HostDistance.REMOTE, 3)
.setNewConnectionThreshold(HostDistance.LOCAL, 3)
.setNewConnectionThreshold(HostDistance.REMOTE, 3)
.setCoreConnectionsPerHost(HostDistance.LOCAL, 3)
.setCoreConnectionsPerHost(HostDistance.REMOTE, 3);
b.withSocketOptions(
new SocketOptions()
.setConnectTimeoutMillis(SOCKET_CONNECT_TIMEOUT)
.setReadTimeoutMillis(SOCKET_READ_TIMEOUT));
b.withPoolingOptions(poolingOptions);
cluster = b.build();
session = cluster.connect();
return session;
}
下面是我的测试表:
CREATE TABLE my_keyspace.test_table (
id int PRIMARY KEY
)
要写信给卡桑德拉,我正在使用session.executeAsync
并将期货存储在列表中,并等待所有期货完成。
当我写100000时,它需要50-65秒。 是应该这么慢还是我在配置中缺少某些东西? 我已经尝试过套接字选项和池选项中的几个选项,但这是我所能得到的最好的。
答案 0 :(得分:2)
我要检查的第一件事是您的Cassandra服务器是否以100%CPU使用率运行。如果不是这样,并且由于我假设服务器在磁盘上未处于瓶颈(即使对旋转的磁盘每秒进行1500次写操作也没有问题),则瓶颈必须位于其他位置:
您应该首先检查的一种可能性是 client 不是瓶颈,即它不使用100%CPU。
然后,您说“从本地到卡桑德拉群集的延迟时间为330ms”。这是您的测试计算机和Cassandra群集之间的ping时间吗?如果是这样,您可能会遇到两种问题。首先,也许这是某种低带宽的WAN,它实际上不能支持每秒超过2000个请求。但我对此表示怀疑。另一个可能性是您的客户端根本没有足够的并发性...延迟为1/3秒,要每秒实现2000次写入,您需要客户端并行执行666个请求。您设置的setMaxRequestsPerConnection()是否真的生效?因为如果不是,则默认值(根据https://docs.datastax.com/en/developer/java-driver/2.1/manual/pooling/)是您设置的3个连接的256倍,即768,接近上面的数字666。
当然还有很多其他事情。没有更多数据很难猜测。