簡體   English   中英

hadoop中的mapreduce距離計算

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM