我有一个 Cassandra 表(包含历史数据),大约 5TB 或更多。为了优化基础设施成本,我需要将旧数据卸载到 S3。我正在查看
dsbulk unload
,它针对导出进行了优化,但不确定它是否能够处理如此大的体积。还有另一个选项可以编写自定义应用程序,该应用程序查询 3 年以上的数据并创建 CSV/Parquet 并上传到 S3。在这种情况下,现有数据模型需要数十亿次查询。
CREATE TABLE ingestion.alerts (
uuid uuid PRIMARY KEY,
payload text,
inc_id bigint,
group_id bigint,
timestamp timestamp
)
CREATE TABLE ingestion.alerts_by_day (
group_id bigint,
date text,
timestamp timestamp,
uuid uuid,
PRIMARY KEY ((group_id, date), timestamp)
)
group_id 不到 2000 个,每个组有 2000 天的数据。查询
ingestion.alerts_by_day
400 万次并不是什么大问题。我必须使用 ingestion.alerts_by_day
和 group_id
查询 date
,这为我提供当天的所有警报 UUID,并且我需要从 ingestion.alerts
查询单个警报。一组可能一天内有 10 万到 100 万个警报,即来自 ingestion.alerts
的最多 100 万次读取。无法更新数据模型,因为集群没有足够的空间来创建另一个表,并且新节点需要很高的价格。
另一个有趣的选择是将 Spark 与 cassandra-connector 一起使用,但问题仍然相同:它能够扫描整个表以创建导出吗?这可能会给 Cassandra 集群造成高压。当然,一旦我们第一次迁移较旧的数据,数据量就会急剧减少,可能只有原始大小的 25%。
当我将数据上传到S3时,我将以多个文件的形式上传。我需要为每个组每天创建文件:alert-ingestion-group_id-ddmmyy。也许我会为每个组创建存储桶,以便它包含一组的数据,并方便以后搜索。
如此大规模的导出需要哪些工具/框架/库?我正在为 Cassandra 集群 5.1 使用 datastax enterprise,其中包含 Cassandra 3.11。如果价格合理,我愿意接受付费服务。
作为 Datastax 企业客户,请随时通过票证获得支持并寻求指导。
DSBulk 绝对是一个选择:
https://github.com/datastax/dsbulk/blob/1.x/manual/settings.md