在cassandra java中连续编写大量数据的更好方法

时间:2016-01-09 17:36:41

标签: java database performance cassandra astyanax

在我们的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列并执行。

请建议哪种方法更好,如果答案需要更多详细信息。

1 个答案:

答案 0 :(得分:1)

这不是一个事务数据库,你开始然后提交,所以你的两个选项有点混乱。

你可能应该避免批处理,它可以更快,但它并不像吞吐量优化那样真正存在。这就是说,如果一切都在一个分区上,它可以帮助减少网络延迟。在某些情况下,最有效的方法是单独进行单独的突变,以便并行化工作并在所有节点上分配协调器工作。它也更容易尝试调整批量大小并正确分组。写作真的很快,所以时间会让你快速获得它会更长,然后加载所有内容。

您可能需要担心的是您的架构,因为您有大型列。请记住,这不是一个关系数据库,您只需将数据放入其中并进行查询,计划您想要如何读取数据,并组织架构以便读取将是一个简单的查找,也许可以查看免费的在线资源(如https://academy.datastax.com/),以确保数据建模良好。

最后1.2很老,考虑使用带有CQL的新版本(不推荐使用thrift)。如果你升级到更新的版本并使用cql使用https://github.com/datastax/java-driver而不是Astyanax,而不是真正维护的。