簡體   English   中英

GAE Python上的Mapreduce-導致ReducePipeline在完成時發出回調嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM