【问题标题】:Copy data between buckets - RIAK在存储桶之间复制数据 - RIAK
【发布时间】:2012-10-25 03:11:48
【问题描述】:

我有一个包含日志数据的存储桶 b1。现在我正在尝试通过添加添加二级索引将它们复制到新存储桶中。在旧存储桶中,每个条目都有带有 60 个块的 JSON。我希望每个块都作为新存储桶中的新条目写入。

我使用 riak java 客户端,从旧存储桶中读取每个条目,解析 JSON 并通过添加 secIndex 对新存储桶进行 60 次写入调用 [json 中的每个块一个]。这工作得很好。但是整个过程真的很慢,我的旧存储桶有近 1000 万个条目。

有没有更有效的方法来做到这一点

【问题讨论】:

    标签: riak


    【解决方案1】:

    一种可能加快速度(但也会给集群带来大量负载)的方法是开发一两个自定义映射和/或减少阶段函数,并将拆分和插入作为一个大的一部分执行mapreduce 作业。可以将其分成几个较小的任务,例如使用密钥过滤。

    由于您需要访问内部 Riak 客户端才能插入新记录,因此这些函数(至少插入函数)需要在 Erlang 中开发,因为目前无法从 JavaScript 执行插入。

    这需要一些时间来开发和测试,所以如果这是一次性活动(听起来像是),那可能不值得。

    如果您还没有这样做,最好尝试对数据进行分区并尝试在多个并行流中执行迁移。

    【讨论】:

    • 谢谢克里斯蒂安。是的,你是绝对正确的,这是一次性的活动。使用 riak java 客户端,这个过程看起来需要数周时间。当您说在多个并行流中迁移时,您的意思是运行多个进程,这些进程将从旧存储桶中流式传输部分密钥并将它们移动到新存储桶中?
    • 如果您在记录上有任何二级索引,您可以使用它在范围内拆分数据。如果没有,您可以让一个线程检索数据并由一个池处理它们。我认为处理和插入是耗时最长的步骤。
    • 如果您还没有这样做,那么将负载分散到集群中也是值得的。
    • 我还假设您使用的是 pbcClient,因为它比 HTTP 客户端更快...
    • 谢谢克里斯蒂安。听起来很酷。实际上我正在使用 httpclient 将数据写入新存储桶。将尝试使用带有线程池的 pbcClient 进行写入。当您说负载平衡时,您的意思是docs.basho.com/riak/latest/tutorials/System-Planning/…
    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 2018-01-06
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多