【问题标题】:best technique for processing bug database ( parallel computing ? )处理错误数据库的最佳技术(并行计算?)
【发布时间】:2011-09-11 15:44:27
【问题描述】:

我的任务是为我们的网站提取所有谷歌分析数据,对其进行分析并放入数据库,然后针对这些数据生成一些报告。 问题是我最终在一个表中有近 2m 条记录。 报告由一些 SUM() 和 AVG 查询组成,您可以想象在某些情况下会花费太长时间(最坏的情况是没有设置日期过滤器和广泛的标准(取决于报告的类型)需要 8-10 分钟)。 鉴于这次用户将有权访问这些报告是不可接受的...... 目前该项目正在使用 Postgres。我非常清楚没有 RDMS 可以在 10 秒内处理此类数据,尤其是在单台机器上运行。

问题是软件和架构/技术的最佳选择是什么?

我尝试过 MongoDb,但由于 map/reduce 是单线程的(至少目前是这样),因此 map/reduce 在单台机器上的运行速度实际上并没有提高。

我知道我可能正在研究一个并行系统,但仍然不确定...... 我对使用 mongoDB 感到很自在,并且我读到它们在集群和使用多个节点方面有了很大的改进,但我希望有人以最有效的方式分享其他意见和经验,不仅在计算能力方面,而且在价格方面条款也。

谢谢

附: 关于 postgres 应该处理这么多数据的一些答案,我发布了更多详细信息:

表结构:

   -- Table: ga_content_tracking

-- DROP TABLE ga_content_tracking;

CREATE TABLE ga_content_tracking
(
  id serial NOT NULL,
  country character varying(255),
  city character varying(255),
  page_title character varying(255),
  page_path character varying(255),
  source character varying(255),
  referral_path character varying(255),
  date date NOT NULL,
  visits integer,
  pageviews integer,
  avgtime_on_site double precision,
  yacht_id integer,
  charter_listing boolean DEFAULT false,
  sales_listing boolean DEFAULT false,
  directory_listing boolean DEFAULT false,
  news_related boolean DEFAULT false,
  visitor_type character varying(30),
  organisation_id integer
)
WITH OIDS;
ALTER TABLE ga_content_tracking OWNER TO postgres;

-- Index: ga_content_tracking_charter_listing

-- DROP INDEX ga_content_tracking_charter_listing;

CREATE INDEX ga_content_tracking_charter_listing
  ON ga_content_tracking
  USING btree
  (charter_listing);

-- Index: ga_content_tracking_country

-- DROP INDEX ga_content_tracking_country;

CREATE INDEX ga_content_tracking_country
  ON ga_content_tracking
  USING btree
  (country);

-- Index: ga_content_tracking_dates

-- DROP INDEX ga_content_tracking_dates;

CREATE INDEX ga_content_tracking_dates
  ON ga_content_tracking
  USING btree
  (date);

-- Index: ga_content_tracking_directory_listing

-- DROP INDEX ga_content_tracking_directory_listing;

CREATE INDEX ga_content_tracking_directory_listing
  ON ga_content_tracking
  USING btree
  (directory_listing);

-- Index: ga_content_tracking_news_related

-- DROP INDEX ga_content_tracking_news_related;

CREATE INDEX ga_content_tracking_news_related
  ON ga_content_tracking
  USING btree
  (news_related);

-- Index: ga_content_tracking_organisation_id

-- DROP INDEX ga_content_tracking_organisation_id;

CREATE INDEX ga_content_tracking_organisation_id
  ON ga_content_tracking
  USING btree
  (organisation_id);

-- Index: ga_content_tracking_sales_listing

-- DROP INDEX ga_content_tracking_sales_listing;

CREATE INDEX ga_content_tracking_sales_listing
  ON ga_content_tracking
  USING btree
  (sales_listing);

-- Index: ga_content_tracking_visitor_type

-- DROP INDEX ga_content_tracking_visitor_type;

CREATE INDEX ga_content_tracking_visitor_type
  ON ga_content_tracking
  USING btree
  (visitor_type);

-- Index: ga_content_tracking_yacht_id

-- DROP INDEX ga_content_tracking_yacht_id;

CREATE INDEX ga_content_tracking_yacht_id
  ON ga_content_tracking
  USING btree
  (yacht_id);

示例查询:

superyachts=# SELECT SUM( pageviews ) as cnt, SUM( visits ) as cnt1, AVG( avgtime_on_site ) as avg1 FROM ga_content_tracking gact WHERE TRUE AND ( yacht_id IN ( 7727, 7600, 2352, 7735, 7735, 3739, 7620, 7631, 7633, 7775, 3688, 7779, 3930, 2884, 2724, 2547, 3465, 2324, 4981, 2369, 7820, 4772, 7802, 7249, 4364, 7623, 7803, 7804, 7805, 7957, 7728, 7728, 7252, 8044, 8067, 8016, 8017, 8019, 2726, 2726, 2233, 4549, 6021, 8286, 4773, 8326, 8312, 4881, 8349, 2223, 4387, 2697, 6224, 5947, 4967, 3031, 7494, 7497, 3833, 6594, 6608, 3587, 6599, 3160, 4934, 3122, 4895, 3505, 4980, 8360, 2311, 4885, 2660, 5260, 2362, 2783, 2992, 3286, 3434, 4849, 4117, 2179, 5002, 2187, 5006, 2266, 4900, 4069, 6219, 2951, 3317, 3474, 6218, 3847, 4745, 6480, 4498, 6094, 6312, 6092, 7221, 7220, 2257, 4883, 6518, 2597, 4902, 2638, 2690, 4872, 2790, 6221, 2881, 2887, 3082, 3131, 3141, 3166, 3166, 4887, 4979, 3295, 4886, 4875, 6516, 5005, 3400, 3401, 4990, 3489, 5007, 4882, 4899, 5116, 4082, 4970, 3760, 2202, 2411, 2605, 6291, 6513, 7176, 3029, 8412, 2064, 7826, 4876, 4949, 3626, 5587, 8554, 2837, 5086, 5118, 2058, 4484, 4041, 2953, 8136, 2490, 3291, 4991, 2611, 3590 ) OR organisation_id = 1 ) ;
  cnt   | cnt1  |      avg1       
--------+-------+-----------------
 640826 | 46418 | 34.408638690454
(1 row)

Time: 114652.334 ms

【问题讨论】:

  • “需要 8 到 10 分钟” - 这对于运行包含 200 万条记录的大型报告来说似乎相当合理。
  • 什么PG版本?您的桌子是否经过真空分析?请在 explain.depesz.com 中发布解释分析或指向它的链接。当我阅读您的索引时,您的查询应该使用带有大脂肪过滤器的 seq 扫描。
  • PG 是 8.0,表是真空分析的。不确定“解释分析”是什么意思? explain.depesz.com/s/jTV ?

标签: mongodb shared-data bigdata database


【解决方案1】:

我非常清楚没有 RDMS 可以在 10 秒内处理此类数据,尤其是在单台机器上运行。

我不确定你的假设是从哪里来的......

test=# create table test (id int not null);
CREATE TABLE
test=# insert into test select i from generate_series(1,2000000) i;
INSERT 0 2000000
test=# alter table test add primary key (id);
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "test_pkey" for table "test"
ALTER TABLE
test=# vacuum analyze test;
VACUUM
test=# \timing
Timing is on.
test=# select sum(id), avg(id) from test;
      sum      |         avg          
---------------+----------------------
 2000001000000 | 1000000.500000000000
(1 row)

Time: 566.079 ms
test=# select sum(t1.id), avg(t1.id) from test t1 natural join test t2;
      sum      |         avg          
---------------+----------------------
 2000001000000 | 1000000.500000000000
(1 row)

Time: 5891.536 ms

以上是 PostgreSQL 9.1-beta 在一台 5 年前的 MacBook 上运行(当时甚至不是 Pro 版)。如您所见,它将在半秒内吞下 2M 行,并在 6 秒内连接 2M x 2M 行。

重点是,即使在单台机器上,Postgres 也很乐意在 10 秒内处理此类数据。

【讨论】:

  • 我用一些细节编辑了我的问题,所以如果你能告诉我我在哪里做错了什么......
【解决方案2】:

我同意 Denis 的观点,即 PostgreSQL 在处理几百万行时应该不会有太大问题。但您也可以将用户添加到 Google Analytics,并让他们在 Google 的服务器上运行。

漂亮的颜色可能会让它们长时间远离头发。

【讨论】:

  • 确实试图说服老板这是浪费时间,但他就是不听..这是他想要的,将 GA 导出到项目的后端,以便用户可以进行自定义报告...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多