我的挑战如下。在我的数据库中,我们拥有数百万行的表。不幸的是,由于松散的设计,几个表上的分区键大小增加了千兆字节 - 这会对系统造成负面压力,并且会出现jvm内存不足/节点崩溃等问题。
我们需要在几个表上重新设计分区键。我们在表中需要保留/或迁移到新表的数据。
我正在寻找能够将数据从源表导出到目标表的解决方案(即使用重新设计的复合分区键);我希望这有助于以更平衡的方式传播分区。
我尝试使用COPY [tablename(column1,column2 ...)]命令,但这是探测节点数,导致系统/堆压力,即影响应用程序。我正在寻求指导,以便我能够最好地应对这一挑战 - 提前感谢您的帮助。
答案 0 :(得分:1)
由于您有非常大的表并且使用COPY失败,因此您必须手动导出和导入数据。要执行此类任务,您需要使用https://stackoverflow.com/a/35142175。
使用一些小客户端代码,您可以编写查询以执行完整的表数据提取,例如:
$
其中MIN_TOKEN和MAX_TOKEN都是集群分区程序的常量最小值和最大标记值,QUERY_INTERVAL是要查询的范围窗口。 QUERY_INTERVAL越大,您在单个查询中获取的数据就越多(并且更有可能触发超时)。
请注意,Cassandra 从不允许在分区键列说明符的WHERE子句中使用范围运算符(>> =< =< lt;)。使用TOKEN功能是个例外。
我也建议这些读数:
答案 1 :(得分:0)
COPY
只需导入/导出文件。如果您想重新设计数据模型,那么为您的任务实现专用工具可能会更好,这将是:
以下是如何read big tables by token ranges使用java和datastax驱动程序
的示例