如果您将 mapreduce 作业包装在 python 代码中,您可以制作一个触发 mapreduce 的 servlet。
from mapreduce import control
class ComputeMRHandler(webapp2.RequestHandler):
def get(self):
control.start_map(
name='Mapreduce Name',
reader_spec='mapreduce.input_readers.DatastoreInputReader',
handler_spec='my_mapper_function',
mapper_parameters={'entity_kind': 'my_datastore.DataRecord'},
)
然后只需通过对您的 GAE 服务器的 Web 请求调用上述处理程序。
在最后做一些事情有点困难。你可以在你的计算引擎上写一些东西来轮询 GAE 应用,等待它完成。
或者您可以探索“管道”库https://github.com/GoogleCloudPlatform/appengine-pipelines,它允许您对一系列操作进行排序(即运行 mapreduce,然后运行“完成”代码块)。要做到这一点,您应该真正了解管道,但代码基本上是:
class MyCompletionHandlerPipeline(fixed_pipelines.Pipeline):
def run(self, results):
# Request some handler on your GCE instance that tells it:
# "hey we're done, go process your extra work now"
pass
class MapreduceAndCompletionPipeline(fixed_pipelines.Pipeline):
def run(self):
results = yield MyMapReducePipeline(parameters)
# the dependency on results ensures it runs after MyMapReducePipeline
yield MyCompletionHandlerPipeline(results)