【问题标题】:how to do data migration in cassandra如何在 cassandra 中进行数据迁移
【发布时间】:2016-03-05 01:17:07
【问题描述】:

我们有一个共同的需求(数据迁移)批量修改用户id列等数据(将用户id 001更改为002,将用户id 003更改为004)。但是表 1 中的用户 id 字段不是主键(除了 select * from table 之外,我们无法获取所有要更新的行),而表 2 中的用户 id 字段是主键(这种情况我们可以处理)。因此,我们无法使用 where cause 为所有表选择所有数据。

那么如何满足这个要求呢?

我只是想出了两种方法:

(1) select * from table with fetch size setting。然后更新它。 // 方法对吗? (2) 使用复制命令到一个CVS,然后修改它并再次导入。 // 性能很慢?

这些方法是否可以在生产中使用(具有 > 百万条记录。)或者是否有任何其他标准更好的方法来满足这个要求?稳定加载器?猪?

也许修改一列所有存在的表是常见的要求,因此可能存在于标准解决方案中。

无论我们最后选择哪种方法,在迁移数据时,在过去的旧数据迁移期间如何解决新的数据迁移问题。 换句话说,如何解决增加的数据迁移问题?

期待你的重播

表1 userid(pk) 姓名性别

表2 电话号码(pk)用户ID

【问题讨论】:

  • 你能用两个表上的DESC 语句的结果更新你的答案吗?听起来您可能难以将关系数据迁移到非关系数据库中,因此查看两个表之间的列/关系会很有帮助。

标签: cassandra


【解决方案1】:

我并不完全清楚你想要做什么,但你可能想看看使用 spark-cassandra 连接器来使用 Spark 做这些转换。

使用连接器,您可以将整个表读入 spark RDD,对这些 RDD 中的字段进行连接和转换,然后将生成的 RDD 保存回 Cassandra。因此,对于您所描述的内容,您大致执行以下步骤:

  1. 将table1和table2读入RDD1和RDD2
  2. 可能在 RDD1 和 RDD2 之间的用户 ID 上进行连接以创建 RDD3
  3. 转换用户 ID 字段以及您想要更改的任何其他内容
  4. 在 Cassandra 中使用您希望作为主键的任何内容创建表
  5. 将转换后的 RDD 保存到 Cassandra 的新表中

这种方法可以很好地扩展到数百万条记录,因为 Spark 设计为在没有足够的系统内存同时在内存中保存所有内容的情况下以块的形式处理数据。 Spark 将能够同时在所有节点上并行执行大量工作,而不是您编写 CQL 客户端来获取所有记录并在单个客户端计算机上完成所有这些工作。

困难的部分是将 Spark 添加到您的 Cassandra 集群并学习如何编写 Spark 作业,但如果这是您经常做的事情,那么这可能是值得的。

【讨论】:

    【解决方案2】:

    根据数据量,您可能有 3 个选项:

    1) CQLSH 中的COPY TO,它将使用分页并创建一个 CSV 文件。然后,您可以使用您选择的编程语言解析该 CSV,使用更新的 ID 创建一个新的 CSV,截断表(或创建一个新表),然后将COPY FROM 重新输入系统。这将适用于几百万个条目,我可能不会尝试几十亿。 COPY FROM 不需要提前知道所有的密钥。

    2) 使用火花。 Jim Meyer 做了一个合理的工作来解释火花。 Spark 将比 CQLSH 中的 COPY 命令更好地扩展,但需要额外的设置。

    3) 使用CQLSSTableWritersstableloader 和流媒体。使用带有分页的驱动程序(例如 datastax java 驱动程序)读取行。使用 CQLSSTableWriter 转换该数据并编写新的 OFFLINE sstables。删除或截断旧表,并使用sstableloader 将新的 sstables 馈送到集群中。这适用于 TB 级数据,如果您提前计划,可以并行化。 Yuki Morishita does a good job documenting this approach on the Datastax blog。您不一定需要知道所有键,您可以SELECT DISTINCT 获取每一行,或使用COPY FROM 生成 CSV 文件。

    【讨论】:

    • 看来你的回答很完美,但另一个问题是如何选择所有新数据持续时间我的迁移时间(可能是几分钟或几小时)。
    • 一般来说,SELECT 不能只输入新数据,但是,您可以通过SELECT WRITETIME(value) FROM table (docs.datastax.com/en/cql/3.0/cql/cql_using/use_writetime.html) 确定插入值的时间。然后,您可以使用您选择重新编号的任何中间件对其进行过滤。
    • 鉴于您的编辑:“无论我们最后选择哪种方法,在迁移数据时,如何解决过去一段时间的旧数据迁移中的新数据迁移问题。换句话说,如何解决增加数据迁移问题?”通常,您编写代码来处理该问题 - 在开始迁移之前立即开始对两个表进行双重写入(如果您从 A 复制到 B,则将写入 A 的摄取更改为也写入 B)。通过这样做,您可以避免源表 A 的第二次扫描。
    【解决方案3】:

    这闻起来像是一种反模式。

    主键应该稳定

    主键(尤其是分区键)不应更改,尤其是在整个数据集的全局范围内。

    当分区键更改时,行将获得一个新令牌,并且必须将行从其当前副本节点移动到新副本节点。

    当主键的任何部分发生变化时,行需要重新排序。

    更改主键是一项昂贵的操作。正如您所发现的,更新其他表中的所有引用也很昂贵。

    如果您选择作为主键的字段不稳定,那么您应该考虑使用其他更稳定的字段作为主键。最坏的情况,使用合成密钥(uuid 或 timeuuid)。

    我强烈建议您重新审视您的数据模型并对其进行调整以支持您的“数据迁移”需求,而无需修改主键。

    如果您提供有关您的迁移要求的更多详细信息,那么我们可能会建议一种更好的建模方法。

    【讨论】:

    • 感谢您的重播。但我们可以只复制一条记录而不是直接更新它。更重要的是,我的困惑是如何在没有主键的情况下获取表中的所有行。3ks
    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 2013-11-28
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2011-01-30
    • 2018-04-08
    • 2021-08-21
    相关资源
    最近更新 更多