项目业务需要导入大批量数据到Cassandra,项目使用到Spring data cassandra,里面的有好几种可以实现保存数据的方法,因此做了一下对比实验。使用了如下几个类,分别保存400条数据:
- ReactiveCassandraRepository的
saveAll
:50ms - CassandraRepository的
saveAll
:7000ms - ReactiveSession:50ms
- Session:160ms
- ReactiveCassandraTemplate的
batchOps
:50ms - CassandraTemplate的
batchOps
:160ms
网上的性能对比中,Cassandra每秒处理的量大概是1000条是可信的。
结论
- 可以看出Reactive的方法速度非常快,因为不会阻塞线程。
- 由于使用Session方法比较繁琐,需要自己拼接CQL,所以不优先考虑。
- CassandraRepository速度那么慢是因为其saveAll方法是循环调用save方法,因此每个结果都需要等待节点响应,因此不考虑使用该方法进行批量保存。
- 由于我们对Reactive的原理并不够深入,很多因素不可控,会遇到问题很难解决,因此也不考虑。
- 使用CassandraTemplate虽然在批量处理中会有数量限制,实验中的400条数据,我们是分4次,每次100条进行保存。该方法基本保持比较稳定,因此采用。
注意
决定使用CassandraTemplate后,并加入到项目中,测试过程中使用100万条数据分10个文件,每批100条数据导入系统,还是出现以下异常。
可以看得出,批量处理的数据还是有点多了。为增加Cassandra批量处理能力,可以修改配置文件
cassandra.yaml
,默认是50,调大后就没有报错了。
# Fail any multiple-partition batch exceeding this value. 50kb (10x warn threshold) by default.
batch_size_fail_threshold_in_kb: 150
网友评论