我们有一些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可以做的事情吗?如果是这样,你能指出我正确的方向吗?
答案 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.