2013-07-17 78 views
2

我們有一些需要6-12小時完成的Postgres查詢,並且想知道Hadoop是否適合更快地完成它。我們有(2)Hadoop可以使用的具有256GB內存的64個核心服務器。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) 

組兩個:

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

我們對所有的緯度,經度,類型和頻率字段的索引,使用B樹。兩個表都有「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在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

我同意這個答案。如果您需要類似於SQL的界面,也可以查看Hive,但不是實時分析 – Chaos

0

Pure Hadoop不適合,因爲沒有索引。在這種情況下,HBase實現非常棘手,因爲每個表只能有一個密鑰。無論如何,他們最好的情況下,他們都需要5臺服務器,至少感覺到顯着的改善。 PostgreSQL可以做的最好的事情是對每個類型的列進行分區,使用第二臺服務器作爲第一臺服務器的副本,併爲每個特定類型並行執行多個查詢。 說實話,PostgeSQL不是最好的解決方案。由於基於列的數據結構和BLOOM過濾,SybaseIQ(最好的)或Oracle Exadata(在更糟的情況下)可以做得更好。