java在 Appengine 上使用 MapReduce 的动态查询语言

JeffreyZhao 阅读:71 2023-06-12 16:33:47 评论:0

我们目前有一个包含数百万个实体的应用引擎应用程序 (java)。我们使用 map reduce 框架 + cron 来为仪表板等提供动力,进行大量报告。

但是,我们希望能够对整个数据集运行即席查询。我们现在这样做的方式是编写 mapreduce、部署、运行 mapreduce,然后查看结果。我们不想执行部署步骤。也就是说,只需转到某个管理界面,指定我们的查询和一些自定义代码来进行后处理,然后查看结果。如果我们不必每次都进行部署,我们会做更多的即席查询。

有没有人做过这样的事情?你学到了什么?有什么好的策略吗?

请您参考如下方法:

这是一个 Python 示例,但我很确定您可以使用 Java 执行相同的操作。如果您只想通过过滤器对实体进行计数,这是一种解决方案。您可以创建一个映射器来处理来自 mapreduce.yaml 的过滤器

- name: Query on Actors 
  mapper: 
    handler: mapper_api.query_process 
    input_reader: google.appengine.ext.mapreduce.input_readers.DatastoreInputReader 
    params: 
    - name: entity_kind 
      value: common.models.Actor 
 
    - name: filters 
      value: age<27, name=toto 

然后在您的 mapper_api.py 中,您必须展开并处理每个过滤器:

def query_process(entity): 
  ctx = context.get() 
  pms = ctx.mapreduce_spec.mapper.params 
 
  filters = pms['filters'] 
 
  if match(entity, filters): 
    yield op.counters.Increment("matched") 

所以现在在您的/mapreduce 中您可以选择映射器 Actors 查询 并将一些过滤器传递给它。


标签:MapReduce
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号