「PostgreSQL」用MapReduce的方式思考,但使用SQL

對於那些考慮使用Citus的人來說,如果您的用例看起來很合適,我們通常願意花一些時間與您一起幫助您瞭解Citus數據庫及其可以提供的性能類型。我們通常與我們的一位工程師進行大約兩個小時的配對,以完成此操作。我們將討論架構,加載一些數據並運行一些查詢。如果最後有時間,將相同的數據和查詢加載到單節點Postgres中並查看我們如何進行比較總是很有趣。在看了多年之後,我仍然很高興看到單節點數據庫的性能提高了10到20倍,在高達100倍的情況下也是如此。

最好的部分是,它不需要對數據管道進行大量的重新架構。它所要做的只是一些數據建模以及與Citus的並行化。

第一步是分片

我們之前已經討論過這一點,但是獲得這些性能提升的首要關鍵是Citus將您的數據隱藏在更小的,更易於管理的部分。這些碎片(是標準Postgres表)分佈在多個物理節點上。這意味著您可以從系統中獲得更多的集體能力。當您定位單個分片時,它非常簡單:查詢被重新路由到基礎數據,一旦獲得結果,它就會返回它們。

用MapReduce的方式思考

MapReduce已經存在了很多年,並由Hadoop普及。關於大規模數據的問題是為了從中獲得及時的答案,您需要對問題進行分解並並行進行操作。或者,您會找到一個非常快的系統。使用更大,更快的設備的問題在於,數據增長超過了硬件改進的速度。

「PostgreSQL」用MapReduce的方式思考,但使用SQL

MapReduce本身是一個框架,用於拆分數據,根據需要將數據改組到節點,然後在重新組合結果之前對數據的子集執行工作。讓我們舉一個例子,例如累計總瀏覽量。如果我們想在此基礎上利用MapReduce,我們會將瀏覽量分成4個單獨的存儲桶。我們可以這樣做:

for i = 1 to 4:

for page in pageview:

bucket[i].append(page)

現在,我們將有4個存儲桶,每個存儲桶都具有一組網頁瀏覽量。從這裡我們可以執行許多操作,例如搜索以找到每個存儲桶中最近的10個,或計算每個存儲桶中的綜合瀏覽量:

for i = 1 to 4:

for page in bucket:

bucket_count[i]++

現在,通過合併結果,我們可以獲得頁面瀏覽總數。如果將工作分配到四個不同的節點,則與使用一個節點的所有計算來執行計數相比,可以看到性能大約提高了4倍。

MapReduce作為一個概念

MapReduce在Hadoop生態系統中廣為人知,但您不必跳入Java來利用。 Citus本身有多個不同的執行器來處理各種工作負載,我們的實時執行器實質上與成為MapReduce執行器是同義的。

如果您在Citus中有32個分片並運行SELECT count(*),我們將其拆分並運行多個計數,然後將最終結果彙總到協調器上。但是,除了計數(*)以外,您還可以做更多的事情,而平均值呢。對於平均值,我們從所有節點和計數中獲得總和。然後,我們將總和與計數加在一起,並在協調器上進行最終數學運算,或者您可以將每個節點的平均值求和。實際上,它是:

SELECT avg(page), day FROM pageviews_shard_1 GROUP BY day; average | date ---------+---------- 2 | 1/1/2019 4 | 1/2/2019 (2 rows) SELECT avg(page), day FROM pageviews_shard_2 GROUP BY day; average | date ---------+---------- 8 | 1/1/2019 2 | 1/2/2019 (2 rows)

當我們將以上結果輸入表中,然後取它們的平均值時,我們得到:

average | date ---------+---------- 5 | 1/1/2019 3 | 1/2/2019 (2 rows)

請注意,在Citus中,您實際上不必運行多個查詢。 在後臺,我們的實時執行器可以處理它,實際上就像運行一樣簡單:

SELECT avg(page), day FROM pageviews GROUP BY day; average | date ---------+---------- 5 | 1/1/2019 3 | 1/2/2019 (2 rows)

對於大型數據集,MapReduce中的思路為您提供了無需費力即可獲得出色性能的途徑。 最好的部分可能是您不必編寫數百行來完成它,您可以使用與編寫相同的SQL來完成。 在幕後,我們負責繁重的工作,但是很高興知道它在幕後如何工作。

原文:https://www.citusdata.com/blog/2019/02/21/thinking-in-mapreduce-but-with-sql/

本文:http://jiagoushi.pro/node/926

討論:請加入知識星球或者微信圈子【首席架構師圈】


分享到:


相關文章: