Hadoop适合这个吗?

时间:2013-07-17 18:01:27

标签: postgresql hadoop

我们有一些Postgres查询需要6到12个小时才能完成,并且想知道Hadoop是否适合更快地完成它。我们有(2)64个核心服务器和256GB的RAM,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)

我们使用btree在所有lat,long,type和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可以做的事情吗?如果是这样,你能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

我认为Hadoop非常适合,但也考虑使用HBase

您可以运行Hadoop MapReduce例程来获取数据,对其进行处理并以最佳方式将其保存到HBase表。这样,从中读取数据会非常快。

答案 1 :(得分:0)

Pure Hadoop不适合,因为没有索引。在这种情况下,HBase实现非常棘手,因为每个表只能有一个密钥。无论如何,在最好的情况下,它们都需要至少5台服务器才能感觉到显着的改进。使用PostgreSQL可以做的最好的事情是按类型列分区数据,使用第二个服务器作为第一个服务器的副本,并为每个特定类型并行执行多个查询。 说实话,PostgeSQL不是最好的解决方案。由于基于列的数据结构和BLOOM过滤,SybaseIQ(最好的)或Oracle Exadata(在更糟糕的情况下)可以做得更好。

答案 2 :(得分:0)

http://stado.us尝试Stado。使用此分支:https://code.launchpad.net/~sgdg/stado/stado,将用于下一个版本。

即使有64个内核,您也只能使用一个内核来处理该查询。使用Stado,您甚至可以在一个盒子上创建多个基于PostgreSQL的“节点”,并利用并行性并使这些核心工作。

此外,我已成功将相关不存在的查询转换为WHERE(SELECT COUNT(*)...)= 0.