cassandra 有没有办法从复制失败的地方恢复?

gfttwv5a  于 2023-10-18  发布在  Cassandra
关注(0)|答案(3)|浏览(154)

我正在使用Cassandra的COPY命令(文档可以在https://docs.datastax.com/en/cql-oss/3.x/cql/cql_reference/cqlshCopy.html中找到)将一个大表导出为CSV,并且在此之后我需要导出更大的表。
我使用的命令是:

COPY my_table_name TO 'my_table_name.csv'

在运行了12个小时(并创建了一个289GB的文件)后,我得到了以下错误:

Error for (3598295844520231142, 3615644561192297385): ReadFailure - Error from server: code=1300 [Replica(s) failed to execute read] message="Operation failed - received 0 responses and 1 failures" info={'failures': 1, 'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'} (permanently given up after 349000 rows and 1 attempts)
Exported 1280 ranges out of 1281 total ranges, some records might be missing

我想知道是否有办法从失败的地方继续下去。我看到错误显示“Exported 1280 ranges out of 1281 total ranges”是否有一种方法可以只指定最后一个范围,这样我就不需要再次尝试导出整个表?
文档中提到了BEGINTOKEN和ENDTOKEN,但我不清楚它们是什么意思,如果它们能帮助我的话。
是否有更可靠的方法来导出表?

uoifb46i

uoifb46i1#

COPY命令最多应该用于表中的100万条记录(经验法则)。原因是它非常慢(单线程Python),即使简单也不是很健壮。
有免费的工具可以实现同样的事情。我特别想到了DSBulk。使用unload命令doc创建CSV
此组件为导出提供了许多选项,并提供了一个在停止时重新启动的SQLKPOINT机制。输出是多个CSV,以后更容易移动。

dsbulk unload -url ~/data-export -k ks1 -t table1
3yhwsihp

3yhwsihp2#

通常,没有办法恢复COPY操作。
文档中提到了BEGINTOKEN和ENDTOKEN,但我不清楚它们是什么意思,如果它们能帮助我的话。

Error for (3598295844520231142, 3615644561192297385): ReadFailure

但是,在您的情况下,cqlsh确实给予了失败的令牌范围。您可以使用BEGINTOKENENDTOKEN选项来COPY这个标记范围:

COPY my_table_name TO 'my_table_name.csv' WITH BEGINTOKEN=3598295844520231142 AND ENDTOKEN=3615644561192297385

但除此之外塞德里克是对的DSBulk是从Cassandra导出和导入数据的更可靠的方法。

2ul0zpep

2ul0zpep3#

cqlsh COPY命令旨在用于非生产工作负载,特别是当您尝试使用时。它是一个开发工具,用于在小集群上导出/加载多达几千条记录。
如果你仔细想想,导出的过程需要一个完整的表扫描,所以如果有(a)大量的记录,和/或(b)大量的节点,那么(c)你要么过载你的集群,要么导致cqlsh超时。
此外,cqlsh COPY命令不能从上次失败的地方重试操作,因此它必须从头开始并重新处理所有记录。
为此,专门创建了**DataStax Bulk Loader(DSBulk)**实用程序。DSBulk可以将Cassandra集群中的数据导出为CSV或JSON格式,但其主要功能是批量加载CSV或JSON格式的数据。
DSBulk将一个表分解为多个小段,由多个线程并行处理,因此它可以在集群中的节点之间有效地分配负载。
以下是一些参考资料和示例,以帮助您快速入门:

请注意,DSBulk有一个“恢复”功能,允许使用检查点文件从中断的地方重新启动失败的操作。有关详细信息,请参阅DSBulk日志记录选项的检查点部分。
最后,DSBulk是开源的,所以可以免费使用。干杯!干杯!

相关问题