假設我有兩個鍵值數據集 - 數據集A和B,我們稱之爲它們。我想用集合B中的數據更新集合A中的所有數據,其中兩個數據與鍵匹配。使用Hadoop通過兩個數據集進行映射
因爲我正在處理大量的數據,所以我使用Hadoop來處理MapReduce。我擔心的是,爲了在A和B之間進行這種關鍵匹配,我需要將所有集合A(大量數據)加載到每個映射器實例的內存中。這似乎相當低效。
會不會有推薦的方法來做到這一點,每次都不需要重複加載工作?
一些pseudcode澄清目前我在做什麼:
Load in Data Set A # This seems like the expensive step to always be doing
Foreach key/value in Data Set B:
If key is in Data Set A:
Update Data Seta A
如果我理解正確,你說的Hadoop'-input'應該是-both-設置A和B(帶有一個標誌來區分它們之間的值),然後在縮小步驟中,將被分組在一起,這樣就可以加入它們。那是對的嗎? – babonk
對,你需要將A和B都輸入到你的映射器中,並確保你輸出了一個標記,以便減速器能夠區分這兩者。我還假設你正在編寫你自己的'Map'(實現'mapred.Mapper')和'Reduce'(實現'mapred.Reducer')類。像@ joe-k在一個單獨的答案中說,Pig,Hive和Cascading都是合法的解決方案,它將爲您生成此代碼並在Hadoop上運行。 – Shahin
您可以使用布隆過濾器進行小型優化,如果集合A比集合B大很多,並且存在與集合B不匹配並且集合B不適合內存的記錄,那麼這將很有用。創建一個MapReduce作業,它在Set B上訓練Bloom Filter,而不是在最終的MapReduce Job中執行所有建議的操作,但是在使用Bloom Filter的Mapper過濾器Set A中,這將減少Set A中的溢出記錄的數量有匹配的B組記錄,因此你的工作可能會運行得更快。 – alexeipab