本文共 1996 字,大约阅读时间需要 6 分钟。
通过文件流接口快速导入数据到Cassandra集群,是将线下数据迁移到线上Cassandra集群的高效方法之一。以下是准备工作的详细步骤。
准备工作包括以下几个方面:
建议使用独立的ECS实例,避免与线上Cassandra集群共用,否则可能会影响线上服务的正常运行。
使用CQLSH工具创建schema,命令示例如下:
$ cqlsh -f schema.cql -u USERNAME -p PASSWORD [host]
sstable数据应按以下目录结构组织:
data/${keyspace}/${table}/ ├── md-1-big-CompressionInfo.db ├── md-1-big-Data.db ├── md-1-big-Digest.crc32 ├── md-1-big-Filter.db ├── md-1-big-Index.db ├── md-1-big-Statistics.db ├── md-1-big-Summary.db └── md-1-big-TOC.txt 示例中keyspace为"quota",table为"historical_prices"。
对于csv数据,需要先将其转换为sstable格式。Cassandra提供了CQLSSTableWriter工具,用于生成sstable文件。以下是使用该工具的示例代码:
// 准备sstable写入器CQLSSTableWriter.Builder builder = CQLSSTableWriter.builder();builder.inDirectory(outputDir) .forTable(SCHEMA) .using(INSERT_STMT) .withPartitioner(new Murmur3Partitioner());CQLSSTableWriter writer = builder.build();// 读取csv文件并写入数据while ((line = csvReader.read()) != null) { writer.addRow( ticker, DATE_FORMAT.parse(line.get(0)), new BigDecimal(line.get(1)), new BigDecimal(line.get(2)), new BigDecimal(line.get(3)), new BigDecimal(line.get(4)), Long.parseLong(line.get(6)), new BigDecimal(line.get(5)) );}writer.close(); 生成sstable文件后,可按照3.1步骤导入数据。
使用sstableloader工具将数据导入Cassandra集群。命令格式如下:
${cassandra_home}/bin/sstableloader -d data/${ks}/${table} sstableloader是一个Cassandra客户端工具,集成了DataStax Driver,用于拉取集群的tokenMap信息,了解partition key的sharding情况。sstable文件按tokenRange排序,导数据时会将文件拆解为不同tokenRange,采用文件流方式传输到后端节点。
sstableloader还使用了Cassandra的streamfile接口,通过linux零拷贝技术减少数据传输开销。该技术利用mmap直接将文件在pagecache层面写到socket fd上,避免了用户态buffer的双重拷贝。
完成数据导入后,使用CQLSH检查数据是否已成功导入:
$ bin/cqlsh -u USERNAME -p PASSWORD [host]
执行上述命令后,可看到导入的数据。如数据表有索引,需执行:
bin/nodetool rebuild_index
重建索引,具体命令可参考相关文档。
转载地址:http://vmefk.baihongyu.com/