[英]mapreduce distance calculation in hadoop
是否有使用hadoop map / reduce的距離計算實現。 我試圖計算一組給定點之間的距離。
尋找任何資源。
編輯
這是一個非常智能的解決方案。 我嘗試了一些與第一種算法相似的方法,而且我幾乎得到了我想要的東西。 我現在並不關心優化程序,但我的問題是dist(X,Y)函數無效。 當我得到減速器上的所有點時,我無法通過迭代器上的所有點並計算距離。 stackoverflow.com上的某個人告訴我,hadoop上的Iterator與普通的JAVA Iterator不同,我不確定。 但是,如果我能找到一種簡單的方法來通過我的dist()函數上的Iterator,我可以使用你的第二個算法進行優化。
//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]))
你需要在該數據集上進行自聯接。 在蜂巢中看起來像或多或少
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需要使用其他hive函數實現,或者用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來獲取按某種順序排序的reducer,例如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進行性能調整。
這個問題聽起來不太適合map-reduce,因為你真的不能把它分成幾塊並獨立計算每一塊。 如果你有一個單獨的程序可以生成你的點的完整圖表作為列表(x1,y1,x2,y2),那么你可以做一個簡單的地圖來獲得距離。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.