dsbulk 卸载由于 cassandra pod 重新启动而失败。 cassandra pod 显示由于 OOM 问题而被杀死。
2024-03-26 21:54:14 INFO Operation directory: /cassandra_data/dsbulk/dsbulk-1.11.0/bin/logs/LOAD_20240326-215414-519088
2024-03-26 21:54:16 ERROR Operation LOAD_20240326-215414-519088 failed: Java.io.IOException: Error creating CSV parser for file:/cassandra_data/dsbulk/dsbulk.csv.
Caused by: Error creating CSV parser for file:/cassandra_data/dsbulk/dsbulk.csv.
Caused by: File not found: /cassandra_data/dsbulk/dsbulk.csv (No such file or directory).
reactor.core.Exceptions$ReactiveException: java.io.IOException: Error creating CSV parser for file:/cassandra_data/dsbulk/dsbulk.csv
at com.datastax.oss.dsbulk.workflow.load.LoadWorkflow.execute(LoadWorkflow.java:242) [3 skipped]
com.datastax.oss.dsbulk.io.CompressedIOUtils.newBufferedReader(CompressedIOUtils.java:96)
我们使用以下命令导出数据。
$ export DSBULK_JAVA_OPTS="-Xmx10G"
$ dsbulk unload \
-url /cassandra_data/dsbulk/export2.csv \
-delim "|" \
--executor.continuousPaging.enabled false \
-cl LOCAL_QUORUM \
--driver.basic.request.timeout="30 minutes" \
--datastax-java-driver.basic.request.timeout="30 minutes" \
-maxErrors 1000000 \
--schema.splits=12C \
-maxConcurrentQueries 1 \
-maxConcurrentFiles 10 \
-header true \
-k <keyspacename> \
-t <table name>
该表有1.6TB。有没有最好的选择/方法来导出巨大的 cassandra 表。
不幸的是,您发布的错误与导出无关,因为它表明它是针对完全不同的 CSV 文件的 LOAD 操作:
2024-03-26 21:54:16 ERROR Operation LOAD_20240326-215414-519088 failed: Java.io.IOException: Error creating CSV parser for file:/cassandra_data/dsbulk/dsbulk.csv.
Caused by: Error creating CSV parser for file:/cassandra_data/dsbulk/dsbulk.csv.
如果没有 OOM 和相关日志消息的详细信息,我最好的猜测是 Cassandra 在读取 SSTables 导出数据时使用了太多内存。
Cassandra 通过 Unix 系统调用
mmap()
(或简称 mmap
)使用内存映射文件 I/O。这个 mmap
系统调用允许 Cassandra 使用操作系统的虚拟内存来保存数据文件的副本,因此读取 SSTable 的速度很快。缺点是,当 SSTable 的大小大于机器上的可用内存时,Linux oom-killer
会终止 Cassandra。我之前已在DataStax 知识库中记录了此行为。
但是,这只是我的最佳猜测,因为您的帖子缺乏足够的详细信息,因此您需要检查我上面链接的知识库文章并进一步调查。干杯!