2

我们有一些 Postgres 查询需要 6 到 12 小时才能完成,并且想知道 Hadoop 是否适合更快地完成它。我们有 (2) 64 台核心服务器和 256GB 的 RAM,Hadoop 可以使用这些服务器。

我们正在运行 PostgreSQL 9.2.4。Postgres 只在一台服务器上使用一个核心进行查询,所以我想知道 Hadoop 是否可以将其速度提高大约 128 倍,减去开销。

我们有两组数据,每组都有数百万行。

套餐一:

id 字符变化(20),
a_lat 双精度,
a_long 双精度,
b_lat 双精度,
b_long 双精度,
line_id 字符变化(20),
键入字符变化(4),
频率数字(10,5)

设置二:

a_lat 双精度,
a_long 双精度,
b_lat 双精度,
b_long 双精度,
键入字符变化(4),
频率数字(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 可以做的事情吗?如果是这样,你能指出我正确的方向吗?

4

3 回答 3

2

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

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

于 2013-07-17T18:05:13.920 回答
0

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

于 2013-07-18T15:11:21.200 回答
0

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

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

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

于 2013-07-18T17:57:15.177 回答