我在通过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
答案 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为你做的。