在我们的Web应用程序中,我们使用Cassandra 1.2和Astyanax java库与数据库进行通信。我们在cassandra中使用复制因子3。对于特定用例,我们在一个列中编写String json,其有效负载如下所示:
{
"tierAggData": {
"tierRrcMap": {
"Tier1": {
"min": 0.08066999,
"max": 0.13567,
"t0": 1419235200,
"t1": 1421334000,
"type": null,
"cons": 0,
"tierCost": 37.692207887768745,
"tierCons": 326758,
"name": "Tier1"
},
"Tier2": {
"min": 0.11252999,
"max": 0.16752002,
"t0": 1421337600,
"t1": 1421625600,
"type": null,
"cons": 0,
"tierCost": 14.50184826925397,
"tierCons": 96910,
"name": "Tier2"
},
"Tier3": {
"min": 0.10361999,
"max": 0.25401002,
"t0": 1421629200,
"t1": 1421910000,
"type": null,
"cons": 0,
"tierCost": 17.739905051887035,
"tierCons": 78776,
"name": "Tier3"
},
"Tier4": {
"min": 3.4028235e+38,
"max": -3.4028235e+38,
"t0": 2147483647,
"t1": -2147483648,
"type": null,
"cons": 0,
"tierCost": 0,
"tierCons": 0,
"name": "Tier4"
}
}
}
}
我每小时写这些数据,我可能要一次写3年的数据。所以要写的列总数是3 * 24 * 365 = 26280列。由于json有效载荷也很大,我对两种方法感到困惑: 1)使用变异批处理获取行,一次写入所有数据并执行。 2)使用变异批处理获取行,使用计数器并一次只写1000列并执行。
请建议哪种方法更好,如果答案需要更多详细信息。
答案 0 :(得分:1)
这不是一个事务数据库,你开始然后提交,所以你的两个选项有点混乱。
你可能应该避免批处理,它可以更快,但它并不像吞吐量优化那样真正存在。这就是说,如果一切都在一个分区上,它可以帮助减少网络延迟。在某些情况下,最有效的方法是单独进行单独的突变,以便并行化工作并在所有节点上分配协调器工作。它也更容易尝试调整批量大小并正确分组。写作真的很快,所以时间会让你快速获得它会更长,然后加载所有内容。
您可能需要担心的是您的架构,因为您有大型列。请记住,这不是一个关系数据库,您只需将数据放入其中并进行查询,计划您想要如何读取数据,并组织架构以便读取将是一个简单的查找,也许可以查看免费的在线资源(如https://academy.datastax.com/),以确保数据建模良好。
最后1.2很老,考虑使用带有CQL的新版本(不推荐使用thrift)。如果你升级到更新的版本并使用cql使用https://github.com/datastax/java-driver而不是Astyanax,而不是真正维护的。