2015-02-12 45 views
2

最大值查詢:設計MapReduce工作找到低於給定的閾值

我試圖設計一個查詢,以查找網頁的現場版本在給定的日期

日期作爲運行時參數傳遞。輸入到映射器是以下鍵 - >值對:webpage_id - >REVISION_IDrevision_timestamp

對於每個webpage_id,作業必須輸出的最新REVISION_ID給定日期在此之前發生的頁面

目前的設計:在基準日期後

映射器將丟棄revision_timestamp任何記錄,將輸出所有其他記錄。

然後,組合器將對給定網頁的所有修訂進行排序,並僅輸出最新的修訂(這是通過使用內部數據結構並在組合器的清理階段發出鍵值對來完成的)。

減速器與組合器的作用相同,但是在組合器的輸出上。

理念:

我要進一步優化工作。我認爲用給定網頁的映射器處理最新版本更新「全局」變量是個好主意。鑑於此,在映射器輸出記錄之前,它會檢查修訂版是否爲該網頁的「全球最新版」修訂版,如果不是,則不會發布修訂版。如果是,他會發出記錄並更新全局變量。我認爲這可以減少通過網絡傳輸的記錄數量並加快工作速度。你認爲這個想法是否可行,是否有可能提高業績?

問:

有沒有一種方法來創建和更新這些全局變量 - 我讀到的ZooKeeper的特點之一是充當一個key-value存儲,但我無法找到的代碼示例如何初始化或訪問地圖任務中的ZooKeeper記錄/變量?

有沒有其他方法可以提高我的MapReduce工作的績效?

回答

1

據我所知,map/reduce作業之間共享可變全局狀態沒有官方的方式。當然,使用像zookeeper這樣的東西是可能的,但很有可能它會成爲你流動的瓶頸。所以通常不推薦。 相反,您可以跟蹤每個映射器的webpage_id - > max_date散列映射,並且只在當前日期晚於當前跟蹤的max_date時發出記錄。當然,這假設這個映射應該適合內存。如果您的用例中頁面ID的數量太大,您可能需要預先對輸入進行分區(通過webpage_id),以便每個映射器只能接收有限的頁面ID子集,從而保持最大日期跟蹤映射可管理記憶。那麼你只需要配置足夠數量的映射器。