Расчет расстояния mapreduce в Hadoop

Есть ли реализация расчета расстояния с использованием карты/уменьшения Hadoop. Я пытаюсь рассчитать расстояние между заданным набором точек.

Ищем любые ресурсы.

Изменить

Это очень разумное решение. Я попробовал что-то вроде первого алгоритма и получил почти то, что искал. На данный момент меня не волнует оптимизация программы, но моя проблема заключалась в том, что функция dist(X,Y) не работала. Когда я получил все точки на редьюсере, я не смог пройти все точки на итераторе и рассчитать расстояние. Кто-то на 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])) 

person tkt986    schedule 31.07.2010    source источник
comment
Что вы подразумеваете под расстоянием между набором точек? Кратчайший путь?   -  person André Laszlo    schedule 01.08.2010
comment
Как выглядят ваши входные данные? Вы должны объяснить, с чем вы работаете, чтобы нам не пришлось гадать. :D   -  person sholsapp    schedule 01.08.2010
comment
у меня есть числа, разделенные запятыми, в формате .csv, 12,14,3,4,8,6,7,5, когда я читаю файл в hadoop, они представляют точки в двух измерениях, например (12,14) (3, 4) (8,6) (7,5). Я сделал это в своем методе картографа. Это может быть любое количество баллов. тогда мой вопрос: я хочу реализовать редуктор, чтобы я мог рассчитать расстояние между всеми точками. из приведенных выше точек выборки я рассчитаю 6 расстояний. Спасибо,   -  person tkt986    schedule 01.08.2010
comment
В настоящее время пишу один как простую демонстрацию MapReduce для геопространственных вычислений для статьи, хотя он в qizmt, а не в hadoop.   -  person Rushyo    schedule 20.08.2010
comment
Я думаю, что не имеет значения, использую ли я hadoop или qizmt, поскольку это mapreduce. То, что я ищу, - это идея параллельного вычисления. Любая идея или концепция будут высоко оценены.   -  person tkt986    schedule 20.08.2010


Ответы (2)


вам нужно выполнить самостоятельное соединение с этим набором данных. В улье это выглядело бы более или менее

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? Я не уверена. Это скетч в хаупе

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, используя вторичные ключи сортировки (которые не влияют на группировку). Таким образом, каждый редуктор получает копию всех точек и работает со столбцом матрицы расстояний, которую вы пытаетесь сгенерировать. Требования к памяти минимальны. Вы можете обменять часть связи на память, реорганизовав вычисления таким образом, чтобы каждый редюсер вычислял квадратную подматрицу конечной матрицы, зная только два подмножества точек и вычисляя расстояния между ними. Для этого вам нужно явно указать порядок ваших точек, скажем, вы храните 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 для другого. Каждый редуктор должен хранить k значений в памяти (используя технику вторичного ключа, чтобы все строки попадали в редуктор раньше всех столбцов), а не только 2 раньше. Итак, вы видите, что есть компромиссы, и для второго алгоритма вы можете использовать параметр k для настройки производительности.

person piccolbo    schedule 05.10.2010
comment
Итак, теперь это проблема итератора. Я думаю, что если вы посмотрите на стандартный пример подсчета слов, вы увидите цикл, использующий итератор для уменьшенных значений в редюсере. Мне это кажется довольно стандартным, вы объявляете его как Iterator‹T› и вызываете для него next() и hasNext(), см. wiki.apache.org/hadoop/WordCount Если бы вы могли уточнить, что происходит, когда вы пытаетесь получить свои значения вместо того, что вы ожидаете, возможно, я мог бы быть более полезным. Ошибки? Неправильные значения? Ничего? Можете ли вы поделиться объявлением для Iterator и строками кода, где вы к нему обращаетесь? - person piccolbo; 05.10.2010
comment
Также я думаю, что вы отредактировали определение своей проблемы, что снижает ценность этого разговора для других людей. Вы не должны редактировать вопросы таким образом. Добавление разъяснений — это хорошо, и я благодарю вас за комментарии к моему решению, но, пожалуйста, восстановите подробное определение проблемы и пример. - person piccolbo; 05.10.2010

Эта проблема не кажется подходящей для уменьшения карты, поскольку вы не можете разбить ее на части и вычислить каждую часть независимо. Если бы у вас была отдельная программа, которая генерирует полный график ваших точек в виде списка (x1, y1, x2, y2), вы могли бы сделать простую карту, чтобы получить расстояние.

person Jieren    schedule 10.08.2010
comment
Спасибо за повтор, но я не понимаю отдельную программу для построения полного графика очков. Можете ли вы сделать это более ясным, чтобы я мог применить вашу идею к моей программе. - person tkt986; 10.08.2010
comment
Ну, вы бы хотели, чтобы программа создавала каждую уникальную комбинацию точек. Вы можете сказать, что каждая точка является узлом на графике, и вы хотите создать полный график (en .wikipedia.org/wiki/Complete_graph) баллов. Я не знаю хорошего способа сделать это с помощью mapreduce, потому что каждая точка должна знать о каждой другой точке. Вам лучше просто использовать вложенный цикл. - person Jieren; 10.08.2010