本文主要是介绍Cassandra数据迁移-BulkLoad离线工具介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
该工具通过文件流接口快速导入数据到cassandra集群,是最快地将线下数据迁移到线上cassandra集群方法之一,准备工作如下
- 线上cassandra集群
- 线下数据,sstable格式或者csv格式。
- 同vpc一台独立的ecs,开放安全组,能访问cassandra集群端口
1. 准备同vpc下客户端ecs
建议独立的ecs,不要和线上cassandra集群混用,混用会影响线上服务。
2. 创建schema
$ cqlsh -f schema.cql -u USERNAME -p PASSWORD [host]
3. 准备数据
3.1 sstable数据格式
按data/${keyspace}/${table} 格式组织目录,将sstable数据放入目录,如下示例
ls /tmp/quote/historical_prices/
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
导入数据
执行sstableloader,在cassandra发行包bin目录下,指定数据目录 data/${ks}/${table}
${cassandra_home}/bin/sstableloader -d <ip address of the node> data/${ks}/${table}
静等sstable数据导入成功,使用cqlsh检查
bin/cqlsh -u USERNAME -p PASSWORD [host]
$ bin/cqlsh
cqlsh> select * from quote.historical_prices;ticker | date | adj_close | close | high | low | open | volume
--------+---------------------------------+-----------+-----------+-----------+-----------+-----------+--------ORCL | 2019-10-29 16:00:00.000000+0000 | 26.160000 | 26.160000 | 26.809999 | 25.629999 | 26.600000 | 181000ORCL | 2019-10-28 16:00:00.000000+0000 | 26.559999 | 26.559999 | 26.700001 | 22.600000 | 22.900000 | 555000
如果原表有索引执行,执行bin/nodetool rebuild_index
重建索引,具体命令使用参考相关帮助。
3.2 csv数据格式
csv格式数据需要先将csv数据转成sstable格式,cassandra给我们提供了CQLSSTableWriter工具,用于生成生成sstable,其实可以将任意格式数据转化成sstable格式。
因为csv格式也是需要自己预先组织,所以需要自己编写csv格式解析代码,然后编译执行。
该工具使用示例代码如下,完整工具参考git repo
// Prepare SSTable writerCQLSSTableWriter.Builder builder = CQLSSTableWriter.builder();// set output directorybuilder.inDirectory(outputDir)// set target schema.forTable(SCHEMA)// set CQL statement to put data.using(INSERT_STMT)// set partitioner if needed// default is Murmur3Partitioner so set if you use different one..withPartitioner(new Murmur3Partitioner());CQLSSTableWriter writer = builder.build();//TODO: 读取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原理介绍
sstableloader工具是一个cassandra客户端,集成了datastax driver会拉取cluster tokenMap信息,知道集群partitionKey的sharding情况。整个sstable也是按tokenRange排好序的,在导数据期间,会将文件拆解成不同的tokenRange,以文件流的方式传输到后端的node上。
阅读相关源码,sstableloader也使用了cassandra streamfile接口,这个接口有个明显的可优化点,linux零拷贝技术,目前的实现将sstable中的数据段以对象方式传输到后端node上,涉及了内核层pagecache到用户空间buffer拷贝,我们可以使用mmap技术直接将文件在pagecache层面写到socket fd上,避免了用户态buffer拷贝,减少两次内存拷贝,这被称为linux零拷贝技术。
这篇关于Cassandra数据迁移-BulkLoad离线工具介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!