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

Better way to write huge data in a row in cassandra java

在我们的 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 columns.Since json 有效负载也很大,我对这两种方法感到困惑: 1)使用突变批处理获取行,一次写入所有数据并执行。 2)使用变异批处理获取行,使用计数器并一次只写入1000列并执行。

请建议哪种方法更好,以及是否需要更多详细信息才能回答。

这不是您开始然后提交的事务性数据库,因此您的两个选项有点混乱。

您可能应该避免批处理,它可以更快,但它并不是真正的吞吐量优化。也就是说,如果一切都在一个分区上,则可以通过减少各处的网络延迟来提供帮助。在某些情况下,最有效的方法是单独进行单独的变更,以并行化工作并在所有节点上分配协调器工作。它也比尝试调整批量大小并正确分组更容易。写入速度非常快,因此您尽可能快地完成写入所需的时间会比加载所有内容所需的时间更长。

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

最后 1.2 太旧了,考虑使用带有 CQL 的较新版本(不推荐使用 thrift)。如果您确实升级到较新的版本并使用 cql,请使用 https://github.com/datastax/java-driver 而不是不再真正维护的 Astyanax。