2013-07-17 37 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(在更糟的情况下)可以做得更好。