我在通过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中context对象不可用:
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
下面是我在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)
使用通过报头传递给done回调的mapreduce ID从mapreduce状态表中检索mapreduce状态模型对象。该模型将通过start_map发送的任何用户参数存储在mapreduce_spec属性中,该属性是json格式的。
注意MR本身实际上将blob_key存储在mapreduce_spec的其他地方。
再次感谢@Nick为我指出model.py源文件。
我很想知道是否有更简单的方法来获取MR用户参数…
Context只对mapping/reducers可用——它主要关注那些在上下文之外没有意义的东西。但是,从源代码中可以看到,设置了"mapreduce - ID"头,从中可以获得mapreduce作业的ID。
你不需要自己清理,mapreduce有一个处理程序可以帮你清理。