【问题标题】:Issues with multiple row deletion in Cassandra with java使用 java 在 Cassandra 中删除多行的问题
【发布时间】:2015-04-14 01:59:18
【问题描述】:

我有一个 Casandra DB 以这样的方式建模,data_time 将是行键。行键的格式为 (yyyy_mm_dd_hh)。这已根据应用程序需求进行建模。

可能有大约 700K 行具有相同的行键,因此当我尝试删除行时,再次查询时会出现 rpc_timeout 异常。当我搜索时,我发现这是因为 SS Table 可能已损坏。我也不想运行 nodetool,因为删除部分将通过批处理自动执行。

我厌倦了使用 Netflix 的 Astyanax API,但没有运气。我正在尝试使用 Java 中的计划删除查询来删除记录。

谁能帮帮我。

【问题讨论】:

  • 您能否提供有关集群设置、数据模型和客户端代码的详细信息?
  • 集群基于4个节点搭建。 Key Space 的复制因子为 1,然后数据模型设置如下: CREATE TABLE user_events(rowkey text,uuid text,values text>,PRIMARY KEY ((rowkey), uuid));客户端代码是一个简单的 java 程序,它使用 datastax API 打开连接以执行删除查询。
  • 有趣的观察是只有当我在 cqlsh 中对整个表进行选择时才会发生 rpc_timeout。该表仍然接受插入/删除,并且还在特定的 rowKey 级别上进行选择。这是为什么呢?

标签: java cassandra


【解决方案1】:

您的删除(和读取)问题在于您正在执行一个巨大的请求,该请求未在 Cassandra 超时(默认为 10 秒)时完成。

请尝试通过指定uuidrowkey 来缩小要删除的行数。

所以而不是:

cqlsh> DELETE FROM user_events WHERE rowkey='2015_02_08_14' ;

试试这个:

cqlsh> DELETE FROM user_events WHERE rowkey='2015_02_08_14' AND uuid = '5ee9d850-af44-11e4-9822-12e3f512a338';

【讨论】:

  • 如果是这样,那我的客户应该会受到影响,对吧?为什么服务器似乎损坏了 SS 表:(在我执行批量删除后,我只面临服务器端的问题(在整个表上执行选择计数)抛出 rpc_timeout。我尝试在整个表上执行计数,即使之后一天左右,但在那之后我得到了 rpc_timeout。计数 * 仅在我截断整个表后才起作用:(
  • 当您对整个表执行 SELECT 时客户端超时,因为它相当于全表扫描,这意味着它必须从所有节点获取所有行并且可能不会在超时内返回期间。
  • A SELECT COUNT 的行为方式相同,即它遍历所有节点上的所有分区。
猜你喜欢
  • 2015-03-26
  • 1970-01-01
  • 2017-05-18
  • 2011-02-05
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多