【问题标题】:Reindex task/mapper/job for AppEngine Java为 AppEngine Java 重新索引任务/映射器/作业
【发布时间】:2013-03-06 21:16:33
【问题描述】:

是否有人知道可用于重新索引所有/某些命名空间中的所有/某些实体的库或好的代码示例?

如果我自己实现这个,我应该考虑 MapReduce 吗?

“我需要重新索引吗?”感觉像是许多开发人员遇到的问题,但我能找到的最接近的是this,这可能是一个好的开始?

其他选项是使用迭代数据存储命名空间和实体的任务队列的自制解决方案,但我不希望重新发明轮子并寻求一个健壮的、经过验证的解决方案。

有哪些选择?

【问题讨论】:

    标签: java google-app-engine indexing mapreduce objectify


    【解决方案1】:

    恐怕我不知道任何预建系统。我认为您基本上需要创建一个游标来遍历所有实体,然后对所有实体执行 get 和 put(或者在执行 put 之前选择检查它们是否在索引中 - 如果您有一些不会不需要更新,这会以读取和/或小操作为代价为您节省写入)。

    按照此处的示例进行操作: https://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Cursors

    1. 创建一个 java.util.concurrent.SynchronousQueue 来保存成批的数据存储键。
    2. 使用 ThreadManager 创建 10 个新的消费者线程(当前限制): https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager 这些线程应该执行以下操作:
      1. 创建一个新的 objectify 实例并为 objectify 关闭会话缓存和内存缓存。
      2. 从 SynchronousQueue 中获取一批密钥。
      3. 使用批处理获取所有这些实体。
      4. 可以选择对所有使用相关属性的实体执行仅键查询。
      5. 放置所有这些实体(或排除上面返回的实体)
      6. 从第 2 步开始重复。
    3. 在循环中,使用仅键游标查询获取接下来的 30 个键并将它们放入 SynchronousQueue。
    4. 将所有项目放入 SynchronousQueue 后,设置一个属性以在所有消费者线程完成工作后停止它们。

    【讨论】:

    • 我需要一些时间来试试这个。因此,您建议在不使用 MapReduce 的情况下进行自定义实现。这不完全是 MapReduce 的范围吗? MapReduce 不是已经做这个循环了吗?
    • 这两种方法都有问题。对于我建议的方法,您必须自己管理工作,这是一个随着任务规模而增长的问题。我猜如果您一次性索引一百万个实体,我的解决方案可能比处理 Python/Java/Objectify 索引问题更容易。索引什么的决定在 Objectify 中很容易传达,但我认为很难翻译成 Python。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多