当前位置: 首页 > 知识库问答 >
问题:

Cassandra多重写入分布

尹凌龙
2023-03-14

我安装了一个3节点Cassandra (2.0.3)群集,这是我的表格:

CREATE TABLE user (
    id text,
    phone text,
    name text,
    email text,
    PRIMARY KEY (phone, id)
);

我用datastax java驱动

这是我创建的用户对象:

User user = new User();
user.setId(UUIDs.timeBased().toString());
user.setEmail(null);
user.setName("test-user");
user.setPhone(Credential.MD5.digest("user-" + i));

我创建了其中的10k - i是我的用户数组中的用户的索引。我不想使用批量插入,而是模拟插入多个记录的压力。这是我的代码:

Cluster cluster = Cluster.builder()
            .addContactPoints(CASSANDRA_CLUSTER_ADDRESSES)
            .build();
final Session session = cluster.connect(keyspaceName);
final ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newCachedThreadPool();
for (final User user : users) {
    tpe.execute(new Runnable() {
        @Override
        public void run() {
            PreparedStatement ps = 
                session.prepare("INSERT INTO user (id, phone, name, email) VALUES (?, ?, ?, ?)");
            BoundStatement bs = new BoundStatement(ps);
            bs.bind(
                    user.getId(),
                    user.getPhone(),
                    user.getName(),
                    user.getEmail(),
            );

            session.executeAsync(bs);
        }
    });
}

tpe.shutdown();
tpe.awaitTermination...
    < li >计算记录数量时(使用cqlsh),我从未超过4k(10k中) < li >只有一台服务器进行写入(使用opscenter写入请求/所有节点图)-我看不出原因:据我所知,密钥足够随机...

有人能指给我哪里吗?

共有1个答案

谭桐
2023-03-14

在计算记录数量时(使用cqlsh)我从来没有超过4k(10k)

您正在使用一个未绑定的线程池,这意味着所有的写操作几乎同时执行。可能你达到了性能极限,Cassandra用写超时来回答。尝试减少并发写入的数量,并检查执行的结果。例如

final ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newFixedThreadPool(20);    
...
ResultSetFuture future = session.executeAsync(bs);
try {
    future.getUninterruptibly();
} catch (Exception e) {
    e.printStackTrace();
}

只有一个服务器正在进行写入(使用opscenter write-Request/all-node图)-我看不出原因:据我所知,密钥足够随机……

主键被定义为PRIMARY KEY(phone, id)。这意味着phone是分区键,而id只是集群键。但是如果手机值确实是不同的MD5摘要,这应该分布在所有节点上。

 类似资料:
  • 如何重写以使用自己的函数创建模式。我希望能够设置一个Cassandra实例使用cql脚本,我选择在运行时。 当在中创建时,我尝试重写。这将导致cqllib失败 这似乎与cqlib创建代理的方式有关:超类没有空构造函数,但没有给出参数

  • 当我使用JavaMailSender发送带有附件的电子邮件时,它总是失败,并引发以下异常: 这是我的密码

  • 我们最近开始了使用Scala、Spark和Cassandra的大数据项目,我对所有这些技术都是新手。我试图做简单的任务写到和读从卡桑德拉表。如果将属性名和列名都保留为小写或snake大小写(unserscores)就可以实现这一点,但我希望在scala代码中使用camel大小写。在Scala中使用camel case格式,在Cassandra中使用snake case格式,有没有更好的方法来实现这

  • 我正在尝试通过PySpark向cassandra表写入两行。我使用datastax cassandra连接器,方法是使用以下命令启动PySpark2 shell: 我使用以下代码创建了一个dataframe:

  • 我有cassandra单片应用程序,我想写在高速率从队列中读取一些有效载荷。Cassandra集群有3个节点。当我开始并行处理大量消息(通过生成线程)时,我得到以下异常 我将CQLsession创建为bean 我将此CqlSession注入到映射器和其他类中以运行查询 在我的datastax驱动程序中,我给了3个节点的ip作为联系点,我是否需要在CQLsession创建/或我的cassandra节

  • 我的要求是尽可能的实时,这似乎离得很远。生产环境大约每3秒有400个事件。 是否需要对Cassandra中的YAML文件进行调优,或者对cassandra-connector本身进行任何更改