Язык динамических запросов с использованием MapReduce на Appengine - PullRequest
4 голосов
/ 28 февраля 2012

В настоящее время у нас есть приложение appengine (java) с миллионами объектов.Мы делаем много отчетов, используя карту, чтобы уменьшить рамки + cron до мощных инструментальных панелей и т. Д.

Однако мы хотели бы иметь возможность запускать запросы adhoc по всему нашему набору данных.Теперь мы пишем mapreduce, развертываем, запускаем mapreduce, видим результаты.Мы бы не хотели делать шаг развертывания.То есть просто зайдите в какой-нибудь интерфейс администратора, укажите наш запрос и, возможно, какой-нибудь специальный код для выполнения постобработки, а затем посмотрите результаты.Мы бы делали намного больше запросов adhoc, если бы нам не приходилось каждый раз развертывать.

Кто-нибудь делал что-то подобное?Что ты узнал?Есть хорошие стратегии?

1 Ответ

2 голосов
/ 28 февраля 2012

Это пример 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 вы можете выбрать маппер Query on Actors и передать ему несколько фильтров.

...