2013-07-17 2 views
2

У нас есть несколько запросов Postgres, которые занимают 6-12 часов, и задаются вопросом, подходит ли Hadoop для этого быстрее. У нас есть (2) 64 ядра с 256 ГБ оперативной памяти, которые Hadoop мог бы использовать.Является ли Hadoop подходящим для этого?

Мы запускаем PostgreSQL 9.2.4. Postgres использует только одно ядро ​​на одном сервере для запроса, поэтому мне интересно, сможет ли Hadoop сделать это примерно в 128 раз быстрее, минус накладные расходы.

У нас есть два набора данных, каждый из которых содержит миллионы строк.

Один набора:

 
id character varying(20), 
a_lat double precision, 
a_long double precision, 
b_lat double precision, 
b_long double precision, 
line_id character varying(20), 
type character varying(4), 
freq numeric(10,5) 

Set Two:

 
a_lat double precision, 
a_long double precision, 
b_lat double precision, 
b_long double precision, 
type character varying(4), 
freq numeric(10,5) 

У нас есть индексы на все латы, длинное, тип и полого FREQ, используя ВТКЕЙ. Обе таблицы имеют «VACUUM ANALYZE», выполняемые непосредственно перед запросом.

Запрос Postgres является:

SELECT 
    id 
FROM 
    setone one 
WHERE 
    not exists (
     SELECT 
      'x' 
     FROM 
      settwo two 
     WHERE 
      two.a_lat >= one.a_lat - 0.000278 and 
      two.a_lat <= one.a_lat + 0.000278 and 
      two.a_long >= one.a_long - 0.000278 and 
      two.a_long <= one.a_long + 0.000278 and 
      two.b_lat >= one.b_lat - 0.000278 and 
      two.b_lat <= one.b_lat + 0.000278 and 
      two.b_long >= one.b_long - 0.000278 and 
      two.b_long <= one.b_long + 0.000278 and 
      (
       two.type = one.type or 
       two.type = 'S' 
      ) and 
      two.freq >= one.freq - 1.0 and 
      two.freq <= one.freq + 1.0 
     ) 
ORDER BY 
    line_id 

Это тип вещь Hadoop может сделать? Если это так, вы можете указать мне в правильном направлении?

+0

Много деталей, пропавших без вести, чтобы получить хороший ответ. Какая версия postgresql? Как выглядят ваши столы? Вы АНАЛИЗИРОВАЛИ их? Вы проиндексировали лат и долго? Вы смотрели PostGIS? Вы можете разделить запрос на логические единицы, которые могут работать параллельно? – bma

+0

И почему бы вам просто не разделить запрос на сетки? Он выглядит очень географически ограниченным. Это должно быть меньше усилий, чем перенос всей системы на hadoop. –

+0

Я обновил вопрос более подробно о версии Postgres, таблицах и индексах. Я постараюсь с PostGIS. Я не знаком с разбиением запроса на логические единицы. Можете ли вы объяснить об этом больше? – user1517922

ответ

0

Попробуйте Stado at http://stado.us. Используйте эту ветку: https://code.launchpad.net/~sgdg/stado/stado, которая будет использоваться для следующего выпуска.

Даже с 64 ядрами вы будете использовать только одно ядро ​​для обработки этого запроса. С помощью Stado вы можете создавать несколько «узлов» PostgreSQL даже на одном ящике и использовать параллелизм и получать эти ядра.

Кроме того, я имел успех преобразования коррелированных не существует запросов в WHERE (SELECT COUNT (*) ...) = 0.

+0

Stado выглядит очень интересно. Я определенно сделаю некоторые тесты с этим. Спасибо – user1517922

+0

Я закончил использование Postgres-XC, а не Stado, и пришлось разбить его на простые запросы (выполнить внешний запрос, перебрать результаты и построить внутренний запрос с использованием этих значений), но смог получить результаты в течение 23 минут вместо 8 часов. Он заканчивается тем, что составляет 100k + маленькие запросы, но они работают очень быстро. Stado не будет выполнять сложный запрос, поэтому я перешел к XC (который выполнял сложный запрос, но занимал 15 часов). Я не нашел времени, чтобы попробовать Stado с простыми запросами, но я уверен, что он будет работать и работать хорошо. – user1517922

2

Я думаю, что Hadoop очень подходит для этого, но подумайте об использовании HBase.

Вы можете запустить процедуру Hadoop MapReduce, чтобы получать данные, обрабатывать их и сохранять их оптимальным образом в таблице HBase. Таким образом, чтение данных из него было бы действительно быстрее.

+1

Я согласен с этим ответом. Вы также можете проверить Hive, если хотите SQL-подобный интерфейс, но не в режиме реального времени. Аналитика – Chaos

0

Pure Hadoop не подходит, потому что не имеет указателей. Реализация HBase очень сложна в этом случае, потому что в таблице может быть только один ключ. В любом случае, в лучшем случае для обоих из них требуется 5 серверов, по крайней мере, чтобы ощутить значительное улучшение. Лучшее, что вы можете сделать с PostgreSQL, - это разделение данных на один столбец типа, использование второго сервера как реплики первого и одновременное выполнение нескольких запросов для каждого конкретного типа. Чтобы быть честным, PostgeSQL не лучшее решение для этого. SybaseIQ (лучший) или Oracle Exadata (в худшем случае) могут сделать это намного лучше из-за структуры данных на основе столбцов и фильтрации BLOOM.

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