比方說,我有兩個相當大的數據集 - 第一個叫做「Base」,它包含2億個製表符分隔的行,第二個調用「MatchSet」,它有1000萬個標籤分隔的相似數據行。讓我們假設我也有一個稱爲Match(row1,row2)的任意函數,Match()基本上包含了一些針對row1(來自MatchSet)的啓發式算法,並將它與row2(來自Base)進行比較,並確定它們是否是在某些方面類似。使用MapReduce編程模型比較兩個大型數據集
比方說,在Match()中實現的規則是自定義和複雜規則,並非簡單的字符串匹配,涉及一些專有方法。現在我們假設Match(row1,row2)是用僞代碼編寫的,所以在另一種語言中的實現不是問題(儘管它今天是在C++中)。
在一個線性模型中,aka程序運行在一個巨大的處理器上 - 我們將從MatchSet中讀取每一行,並從Base中讀取每行,並使用Match()比較另一行,並寫出我們的匹配統計數據。例如,我們可能會捕獲:MatchSet的X記錄是強匹配,MatchSet的Y記錄是弱匹配,MatchSet的Z記錄不匹配。我們還會編寫強/弱/非值來分隔文件以供檢查。阿卡,各種各樣的嵌套循環:
for each row1 in MatchSet
{
for each row2 in Base
{
var type = Match(row1,row2);
switch(type)
{
//do something based on type
}
}
}
我已經開始考慮的Hadoop流爲運行這些比較在很短的時間量批作業的方法。不過,我在爲這類問題尋找map-reduce範例時遇到了一些困難。
我在這一點上非常清楚地知道如何從hadoop中獲取單個輸入,使用映射函數來關閉數據,然後發出結果以減少。然而,比較兩組記錄的「嵌套循環」方法與我有點混淆。
最接近我的解決方案是,我基本上仍然需要在2億條記錄中並行執行1000萬條記錄比較,因此每個節點有200萬/ n個節點* 1000萬次迭代。那是最有效的方法嗎?
我投下了這個問題。首先它不能太啓發,因爲我們仍然每次看1條記錄(至少在上面的描述中)。那麼這個問題似乎更多的是理解map-reduce過程,然後調用算法。然後啓發式部分實際上是一個算法,這裏沒有描述。所以可能這個問題應該被重寫。 – mariotti
這是肯定的,這是5年前,這可能是真的。我沒有編輯(因爲我實際上不再關心),我似乎無法刪除。 – j03m