如何将google mapreduce参数传递给done_callback

时间:2011-11-13 21:28:02

标签: google-app-engine mapreduce

我在通过start_map开始mapreduce时设置参数时遇到问题,因此我可以在done_callback中访问它。我读过的许多内容都暗示这是可能的,但不知怎的,我没有让地球 - 月亮星正确对齐。最终,我要完成的是删除我为mapreduce作业创建的临时blob。

以下是我如何开球:

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 个答案:

答案 0 :(得分:3)

下面是我在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 ID来从mapreduce状态表中检索mapreduce状态模型对象。该模型将通过start_map发送的任何用户参数存储在jason格式的mapreduce_spec属性中。

请注意,MR本身实际上将blob_key存储在mapreduce_spec中的其他位置。

再次感谢@Nick指向我的model.py源文件。

我很想知道是否有更简单的方法来获取MR用户参数...

答案 1 :(得分:1)

上下文仅适用于映射器/缩减器 - 它主要关注的是在一个上下文之外没有意义的事情。但是,从the source可以看到,设置了“Mapreduce-Id”标头,您可以从中获取mapreduce作业的ID。

你不应该做自己的清理工作,但是mapreduce有a handler为你做的。