Как передать параметр Google Mapreduce в done_callback - PullRequest
2 голосов
/ 14 ноября 2011

У меня проблемы с установкой параметра при запуске mapreduce через start_map, чтобы я мог получить к нему доступ через done_callback.Многочисленные вещи, которые я прочитал, подразумевают, что это возможно, но почему-то я не выровнял звезды Земля-Луна должным образом.В конечном итоге я пытаюсь удалить временный большой двоичный объект, созданный для задания mapreduce.

Вот как я его запускаю:

mrID = control.start_map(
    "Find friends",
    "findfriendshandler.findFriendHandler",
    "mapreduce.input_readers.BlobstoreLineInputReader",
    {"blob_keys": blobKey},
    shard_count=7,
    mapreduce_parameters={'done_callback': '/fnfrdone','blobKey': blobKey})

В done_callback, объект контекстанедоступно:

class FindFriendsDoneHandler(webapp.RequestHandler):

  def post(self):

     ctx = context.get()
     if ctx is not None:
        params = ctx.mapreduce_spec.mapper.params
        try:
           blobKey = params['blobKey']
           logging.info(['BLOBKEY ' + blobKey])
        except KeyError:
           logging.info('blobKey key not found in params')
     else:
        logging.info('context.get did not work')         #THIS IS WHAT GETS OUTPUT

Спасибо!

РЕДАКТИРОВАТЬ: Кажется, что может быть более одной библиотеки MR, поэтому я хотел включить мои различные импорт:

from mapreduce import control
from mapreduce import operation as op
from mapreduce import context
from mapreduce import model

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

Ниже приведен код, который я использовал в своем обработчике done_callback для извлечения моего пользовательского параметра blobKey:

class FindFriendsDoneHandler(webapp.RequestHandler):

  mrID = self.request.headers['Mapreduce-Id']           

  try:
     mapreduceState = MapreduceState.get_by_key_name(mrID)   
     mrSpec = mapreduceState.mapreduce_spec
     jsonSpec = mrSpec.to_json()
     jsonParams = jsonSpec['params']
     blobKey = jsonParams['blobKey']
     blobInfo = BlobInfo.get(blobKey)
     blobInfo.delete()
     logging.info('Temp blob deleted successfully for mapreduce:' + mrID)
  except:
     logging.warning('Unable to delete temp blob for mapreduce:' + mrID)

При этом используется идентификатор mapreduce, передаваемый в callback-функцию done через заголовок, для получения объекта модели состояния mapreduce изтаблица состояний mapreduce.Модель хранит любые пользовательские параметры, отправленные через start_map, в свойстве mapreduce_spec в формате json.

Обратите внимание, что сам MR на самом деле хранит blob_key в другом месте в mapreduce_spec.

Еще раз спасибо @Nick за указание на исходный файл model.py.

Мне бы хотелось услышать, есть ли более простой способ получить параметры пользователя MR ...

1 голос
/ 14 ноября 2011

Контекст доступен только картографам / редукторам - он в основном касается вещей, которые не имеют смысла вне контекста одного. Как видно из источника , однако, установлен заголовок «Mapreduce-Id», из которого можно получить идентификатор задания mapreduce.

Однако вам не нужно делать свою собственную очистку - у mapreduce есть обработчик , который делает это за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...