[英]Mapreduce on GAE Python - Cause ReducePipeline to issue callback on finalize?
我想在mapreduce作業完成/完成后執行自定義的回調函數。
我發現的有關該問題的唯一有用參考是一個過時的Google網站以及一個相關的但又看似過時的Stackoverflow問題 。
這兩個來源均假定我使用control.start_map
來啟動Mapreduce作業,並依賴於start_map
帶有一個關鍵字參數mapreduce_parameters
的事實,在其中可以指定done_callback
參數來指定在完成時應調用的url。 但是,我使用的是另一種方法(afaik是最近的首選),其中自定義管道的run
方法產生Mapreduce管道:
yield mapreduce_pipeline.MapreducePipeline(
"word_count",
"main.word_count_map",
"main.word_count_reduce",
"mapreduce.input_readers.BlobstoreZipInputReader",
"mapreduce.output_writers.BlobstoreOutputWriter",
mapper_params={
"blob_key": blobkey,
},
reducer_params={
"mime_type": "text/plain",
},
shards=16)
MapreducePipeline的簽名不允許使用mapreduce_parameters
參數。 我只能在mapper_pipeline.MapperPipeline.run
中看到源中對回調裁剪的引用,但它似乎僅在內部使用。
那么,有沒有辦法在其中獲取該回調參數?
如果不是,是否有人對在何處以及如何擴展庫以提供這種功能有好的想法?
我將Mapreduce管道范例設置為如下所示:
class MRRecalculateSupportsPipeline(base_handler.PipelineBase):
def run(self, user_key):
# ...
yield mapreduce_pipeline.MapreducePipeline('user_recalculate_supports',
'myapp.mapreduces.user_recalculate_supports_map',
'myapp.mapreduces.user_recalculate_supports_reduce',
'mapreduce.input_readers.DatastoreInputReader', output_writer_spec=None,
mapper_params={"""..."""})
如果您想捕獲此管道的完成,則有兩個選擇。
A)使用管道。在MR管道完成之后,運行完成管道。
pipe_future = yield mapreduce_pipeline.MapreducePipeline('user_recalculate_supports',
'myapp.mapreduces.user_recalculate_supports_map',
'myapp.mapreduces.user_recalculate_supports_reduce',
'mapreduce.input_readers.DatastoreInputReader', output_writer_spec=None,
mapper_params={"""..."""})
with pipeline.After(pipe_future):
yield CalcCompletePipeline(...) # this could be a mapreduce pipeline, or any pipeline using the same base_handler.PipelineBase parent class.
B)使用頂級管道的finalized
方法來處理完成。 就個人而言,我堅持使用選項A,因為您可以在/_ah/*/status?root=
視圖中跟蹤路徑。
class EmailNewReleasePipeline(base_handler.PipelineBase):
"""Email followers about a new release"""
# TODO: product_key is the name of the parameter, but it's built for albums ...
def run(self, product_key, testing=False):
# Send those emails ...
yield mapreduce_pipeline.MapreducePipeline(...)
def finalized(self):
"""Save product as launched"""
...
product.launched = True
product.put()
這是有關管道定型的文檔。
對於此問題,至少沒有太多的投資解決方法是簡單地產生另一個Map / Mapreduce管道來執行所需的后處理。
例如:
class MainPipeline(base_handler.PipelineBase):
def run(self):
mapper_params = { ... }
reducer_params = { ... }
yield mapreduce_pipeline.MapReducePipeline(
...,
mapper_params=mapper_params,
reducer_params=reducer_params)
yield PostprocessPipeline(reducer_params)
class PostprocessPipeline(base_handler.PipelineBase):
def run(self, reducer_params):
do_some_postprocessing(reducer_params)
該解決方法無法訪問Mapreduce狀態,我認為可以通過某種方式從管道ID中檢索該狀態,但對我來說還不是很清楚。 因此,您必須設置另一個標志/內存緩存/ ds條目以檢查管道是否成功完成(如果這與后處理有關)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.