2010-07-31 180 views
3

是否有使用hadoop map/reduce的距離計算實現。我試圖計算給定的一組點之間的距離。hadoop mapreduce距離計算

尋找任何資源。

編輯

這是一個非常聰明的解決方案。我已經嘗試了一些如何使用第一種算法,並且幾乎獲得了我期待的內容。目前我並不擔心優化程序,但我的問題是dist(X,Y)函數不起作用。當我得到reducer上的所有點時,我無法遍歷迭代器上的所有點並計算距離。有人在stackoverflow.com告訴我,在hadoop上的迭代器是不同於正常的JAVA迭代器,我不知道這一點。但是如果我能找到一個簡單的方法來通過我的dist()函數的迭代器,我可以使用第二個算法進行優化。

//This is your code and I am refering to that code too, just to make my point clear. 
map(x,y) { 
    for i in 1:N #number of points 
    emit(i, (x,y)) //i did exactly like this 

    reduce (i, X) 
    p1 = X[i] 
    for j in i:N 
     // here is my problem, I can't get the values from the Iterator. 
     emit(dist(X[i], X[j])) 
+1

你是指「一組點之間的距離」是什麼意思?最短路徑? – 2010-07-31 23:27:07

+1

你的輸入數據是什麼樣的?你應該解釋你在做什麼,所以我們不必猜測。 :D – sholsapp 2010-07-31 23:57:49

+0

我用逗號分隔.csv格式的數字,12,14,3,4,8,6,7,5,當我在hadoop中讀取文件時,它們代表兩維中的點,如(12,14) (3,4)(8,6)(7,5)。我在我的映射器方法上做了這個。這可以是任意數量的點。那麼我的問題是我想實現一個reducer,以便我將能夠計算所有點之間的距離。從上面的樣本點我會計算6個距離。 謝謝, – tkt986 2010-08-01 01:44:29

回答

1

您需要對該數據集進行自加入。在蜂巢會是什麼樣子,那或多或少

select dist(P1.x,P1.y,P2.x, P2.y) from points P1 join points P2 on (True) where P1.x < P2.x or (P1.x = P2.x and P1.y < P2.y) 

功能DIST需要使用其他蜂巢的功能來實現,或者用Java編寫的,並添加作爲UDF。此外,我不確定True常數,但您可以將0 = 0寫入相同的效果。 where子句是爲了避免計算相同的距離兩倍或0距離。問題是:將Hive優化這種方式,你可以在Hadoop中仔細編程?我不確定。這是在Hadoop中

map(x,y) { 
    for i in 1:N #number of points 
    emit(i, (x,y)) 

reduce (i, X) 
    p1 = X[i] 
    for j in i:N 
    emit(dist(X[i], X[j])) 

草圖對於這個工作,你需要X去以某種順序排序的減速機,採用二次排序鍵例如通過X,然後由y(即不影響分組) 。通過這種方式,每個縮減器都會獲取所有點的副本,並在您嘗試生成的距離矩陣的列上工作。內存要求很小。您可以通過重新組織計算來交換一些通信內容,以便每個Reducer計算最終矩陣的方形子矩陣,只知道這些點的兩個子集並計算它們之間的距離。要做到這一點,你需要使你的觀點的明確順序,說你是存儲I,X,Y

map(i,x,y) { 
    for j in 1:N/k #k is size of submatrix 
    emit((i/k, j), ("row", (x,y))) 
    emit((j, i/k), ("col", (x,y))) 

reduce ((a,b), Z) 
    split Z in rows X and cols Y 
    for x in X 
    for y in Y 
    emit(dist(x,y)) 

在這種情況下,你可以看到地圖相僅發出2 * N * N/K點,而以前的算法發射N^2。在這裏,我們有(N/k)^ 2減速器與N對另一個。每個reducer必須在內存中保存k個值(使用輔助鍵技術使所有行都到達所有列之前的reducer),而之前只有2個。所以你看到有折衷,對於第二種算法,你可以使用參數k進行性能調整。

+1

所以這現在是一個迭代器問題。我認爲,如果你看看標準的wordcount示例,那麼在reducer中使用迭代器就會減少值。它看起來很標準,你把它聲明爲迭代器並且調用next()和hasNext()就可以了,參見http://wiki.apache.org/hadoop/WordCount如果你可以更具體地瞭解什麼時候會發生什麼你試着去獲得你的價值而不是你的期望,也許我會更有幫助。錯誤?錯誤的值?沒有?你能分享迭代器的聲明和你訪問它的代碼行嗎? – piccolbo 2010-10-05 17:53:32

+0

此外,我認爲你編輯了你的問題的定義,這從其他人的這個談話的價值。你不應該這樣編輯問題。增加澄清是好的,我感謝你對我的解決方案的意見,但請恢復詳細的問題def和示例。 – piccolbo 2010-10-05 17:54:22

0

這個問題聽起來不太適合map-reduce,因爲你不能真正將它分解成片段並獨立計算每個片段。如果你可以有一個單獨的程序,生成你的點的完整圖形列表(x1,y1,x2,y2),那麼你可以做一個簡單的地圖來獲得距離。

+0

感謝您的重播,但我不明白一個單獨的程序來生成點的完整圖。你能否讓這個更清楚,以便我可以將你的想法應用到我的程序中。 – tkt986 2010-08-10 03:55:53

+1

那麼你會想要一個程序來創建每個點的獨特組合。你可以說每個點都是圖中的一個節點,你想要生成完整的圖形(http://en.wikipedia.org/wiki/Complete_graph)。我不知道用mapreduce做這件事的好方法,因爲每個點都需要知道其他每一點。你最好使用嵌套循環。 – Jieren 2010-08-10 16:18:45