AppEngine Java的重新索引任务/映射器/作业

AppEngine Java的重新索引任务/映射器/作业,java,google-app-engine,indexing,mapreduce,objectify,Java,Google App Engine,Indexing,Mapreduce,Objectify,有人知道可以用来重新索引所有/某些名称空间中的所有/某些实体的库或好的代码示例吗 如果我自己实现这一点,MapReduce我应该考虑什么? “我需要重新编制索引?”感觉像是许多开发人员遇到的问题,但我能找到的最接近的问题是,这可能是一个好的开始 另一个选择是homebrewn解决方案,它使用任务队列来迭代数据存储名称空间和实体,但我不希望重新发明轮子,转而寻求一个健壮、经验证的解决方案 有哪些选择?恐怕我不知道有任何预建系统。我认为您基本上需要创建一个游标来遍历所有实体,然后对所有实体执行get

有人知道可以用来重新索引所有/某些名称空间中的所有/某些实体的库或好的代码示例吗

如果我自己实现这一点,MapReduce我应该考虑什么?

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

另一个选择是homebrewn解决方案,它使用任务队列来迭代数据存储名称空间和实体,但我不希望重新发明轮子,转而寻求一个健壮、经验证的解决方案


有哪些选择?

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

请遵循以下示例:

  • 创建一个java.util.concurrent.SynchronousQueue以保存数据存储密钥的批处理
  • 使用ThreadManager创建10个新的使用者线程(当前限制): 这些线程应执行以下操作:
  • 创建新的objectify实例并关闭objectify的会话缓存和memcache
  • 从SynchronousQueue获取一批密钥
  • 使用批处理get获取所有这些实体
  • (可选)使用相关属性对所有这些实体执行仅关键帧查询
  • 放置所有这些实体(或排除上面返回的实体)
  • 重复步骤2
  • 在循环中,使用仅限键游标查询获取接下来的30个键,并将它们放入SynchronousQueue
  • 将所有项目放入SynchronousQueue后,设置一个属性以在所有使用者线程完成工作后停止它们

  • 我需要一些时间来尝试一下。因此,您建议在不使用MapReduce的情况下使用自定义实现。这不正是MapReduce的作用域吗?MapReduce是否已经执行了此循环?这两种方法都存在问题。在我建议的方法中,你必须自己管理工作,这是一个随着任务规模而增长的问题。我猜,如果您要一次性索引一百万个实体,我的解决方案可能比处理Python/Java/Objectify索引问题更容易。关于索引内容的决定在Objectify中很容易传达,但我认为很难翻译成Python。