2015-10-19 2 views
5

WRT кластер из 3 узлов, состоящий из c3.2x больших экземпляров.изменить запрос куста, чтобы заставить более одного редуктора

У меня есть две таблицы. Таблица U имеет около 65 миллионов записей и содержит среди других полей широты и долготы. Таблица L содержит около 1 миллиона записей , а также содержит широту и долготу.

U хранится как таблица ORC.

Задача заключается в определении того, сколько записей U попадают в радиусе 10 миль мест в L.

select l.id, count(u.id) from U u, L l where 3960 * 
acos(cos(radians(l.lat)) * cos(radians(u.lat)) * cos(radians(l.long) - 
radians(u.long)) + sin(radians(l.lat)) * sin(radians(u.lat))) < 10.0 
group by l.id; 

Бит 3960 * acos(cos(radians(l.lat)) * cos(radians(u.lat)) * cos(radians(l.long) - radians(u.long)) + sin(radians(l.lat)) * sin(radians(u.lat))) < 10.0 просто расстояние между Шир/ пар должно быть меньше, чем 10 миль.

Задача: Запрос, кажется, требуется навсегда. Пока фаза завершается относительно быстро, фаза снижения застревает на некотором фиксированном проценте (80% иш)

Я заметил это в выходных сообщениях, которые выделяет Hive. Количество уменьшить задачи, определенные во время компиляции: 1

Я попытался увеличения количества восстановителей, установив mapred.reduce.tasks до 7, но это всегда заканчивается как 1. Я не был успешным в увеличивая количество редукторов.

This answer, кажется, предполагает, что, возможно, если я напишу свой запрос по-другому, то могу заставить более 1 редуктора. Но я еще не смог этого сделать.

Расчет времени исполнения: Для одного места в L требуется около 60 секунд, чтобы получить ответ. По этому счету он должен занять 60 миллионов секунд, что составляет около 700 дней! Стоит ли так много времени? Даже для Hadoop.

Я также попытался положить addional ограничения как ограничивающая лат, длиной в 10 миль на 10 миль квадратика с расположением в L в центре коробки, но время, потраченное сейчас 40 секунд на 1 место который не является большим улучшением.

Вопросы:

1) Как я могу заставить большее количество переходников? 2) Есть ли лучший (с точки зрения времени выполнения) запрос? 3) Любой другой совет, который поможет мне решить эту проблему.

Версия: Hadoop - 2.7.0 Java 1.7.0_80 Hive 1.2.1

+0

Я думаю, вы должны смотреть на расширениях ГИС для улья: https://cwiki.apache.org/confluence/дисплей/Hive/Spatial + запросы. –

+0

какая версия Hadoop вы используете? mapreduce.job.reduces заменяет mapreduce.job.reduces в Hadoop 2.x –

+0

Существует перекрестное объединение U x L, а затем фильтрация. Перекрестное соединение умножает строки. Можно ли преобразовать предложение WHERE, чтобы присоединиться к предложению ON? Вот так: ОТ УН ВХОДЯЩИЙ ПРИСОЕДИНЕНИЕ L l ON (3960 * acos (cos (радианы (l.lat)) * cos (радианы (u.lat)) * cos (радианы (l.long) - radians (u.long)) + sin (радианы (l.lat)) * sin (радиан (u.lat))) <10.0) ГРУППА BY l.id – leftjoin

ответ

0

Если вы используете Hadoop 2, правильный способ указать восстановителей является:

SET mapreduce.job.reduces=7;

Это связано с изменениями, внесенными в Hadoop 2. Я имел такое же поведение, что вы описываете, обновлен до указанной выше команды и был успешным в определении задач сокращения. Я не уверен, как Hadoop выбирает необходимое количество редукторов, но в некоторых ситуациях он кажется небольшим, и это может привести к значительным отставаниям в производительности.

1

Как сказано ранее,

mapred.reduce.tasks заменены mapreduce.job.reduces

Посмотрите на все устаревшие атрибуты и новые значения для этих устаревших значений из этого article.

Помимо устаревших атрибутов, вы должны перенести некоторые из функций, а также, как описано в этом article

Смежные вопросы