1、Greenplum 入門
????????Greenplum 是基于 MPP 架構的一款分布式分析型數據庫,具備關系型數據庫的特點,因為它處理的是結構化的數據,同時具備大數據分布式的特點。
1.1、MPP 架構
????????MPP(Massively Parallel Processing)架構是一種用于處理大規模數據的計算架構,它通過將任務分配給多個處理單元并行執行,以提高處理速度和性能。MPP 架構的由來可以追溯到對大規模數據處理需求的不斷增長,傳統的單一處理器或對稱多處理器(SMP)架構無法滿足這些需求。MPP 架構允許在大規模數據集上實現水平擴展,通過添加更多的處理單元來增加計算和存儲能力。
- 分布式存儲:?面對海量數據和計算時,采用大事化小的思路,對數據進行分割,數據分割后單獨存儲,數據處理消耗的資源也是相互隔開的,對于MPP數據庫來講,整個數據庫由多個完全獨立的數據庫構成,各個擁有完整的數據存儲、數據管理、數據操作能力。
- 并行處理:?MPP 架構通過將任務分解成小塊,并同時在多個處理單元上執行這些任務來實現并行處理。每個處理單元負責處理數據的一個子集,然后將結果合并以生成最終的輸出。
- 共享無狀態架構:?MPP 系統通常采用共享無狀態的架構,基于網絡實現節點互聯,形成一個整體對外提供服務,節點間互不干擾,即Share Nothing,不共享磁盤和計算能力。每個節點之間沒有共享的狀態,每個節點都可以獨立處理查詢請求,并將結果合并返回給用戶。與傳統的共享架構不同,MPP采用非共享架構(Share Nothing),將單機數據庫節點組成集群,每個節點擁有獨立的磁盤和內存系統,通過專用網絡或商業通用網絡連接彼此、協同計算,從而提供整體數據處理服務。這使得系統更容易水平擴展,因為可以簡單地添加更多的節點,而不需要共享狀態的復雜管理。
- 負載平衡:?MPP 數據庫通常具有負載平衡機制,確保任務在各個節點上均勻分布,避免某些節點成為性能瓶頸。
- 高可用性:?為了提高系統的可用性,MPP 架構通常設計成具有容錯和故障恢復機制。如果一個節點出現故障,系統可以繼續運行,而不會丟失數據或中斷服務。
MPP 架構的缺點:如果整個集群有straggler,會導致整個engine的性能下降到該straggler的能力,木桶短板,故MPP架構不適合異構的機器,要求各節點配置一樣。
1.2、Greenplum
????????Greenplum 是基于開源 PostgreSQL 的分布式數據庫,采用 shared-nothing 架構,即主機、操作系統、內存、存儲都是每臺服務器獨立自我控制,不存在共享。
????????Greenplum 本質上是一個關系型數據庫集群(可以理解為多個?MySQL 服務器組成的集群),實際上是由多個獨立的數據庫服務組合而成的一個邏輯數據庫。
1.3、Greenplum 的組成
????????GreenPlum 數據庫是由 Master Server、Segment Server 和 Interconnect 三部分組成,Master Server 和 Segment Server 的互聯使用 Interconnect。
????????Greenplum是一個關系型數據庫,是由數個獨立的數據服務組合成的邏輯數據庫,整個集群由多個數據節點(Segment Host)和控制節點(Master Host)組成。在典型的 Shared-Nothing中,每個節點上所有的資源的CPU、內存、磁盤都是獨立的,每個節點都只有全部數據的一部分,也只能使用本節點的數據資源。在Greenplum中,需要存儲的數據在進入到表時,先進行數據分布的處理工作,將一個表中的數據平均分布到每個節點上,并為每個表指定一個分布列(Distribute Column),之后便根據Hash來分布數據,基于 Shared-Nothing 的原則,Greenplum這樣處理可以充分發揮每個節點處IO的處理能力。
Master?節點:簡單說就是用來處理客戶端請求的,以及把各個節點的計算結果匯總起來返回給客戶端。它是整個系統的控制中心和對外的服務接入點,它負責接收用戶SQL請求,將SQL生成查詢計劃并進行并行處理優化,然后將查詢計劃分配到所有的 Segment 節點并進行處理,協調組織各個Segment節點按照查詢計劃一步一步地進行并行處理,最后獲取到Segment的計算結果,再返回給客戶端。Master節點一般只有一個或二個(高可用)。
Segment節點:是Greenplum執行并行任務的并行計算節點,它接收Master的指令進行MPP并行計算,因此所有Segment節點的計算性總和就是整個集群的性能,通過增加Segment節點,可以線性化得增加集群的處理性能和存儲容量,Segment節點可以是1~10000個節點。
Interconnect:是Master節點與Segment節點、Segment節點與Segment節點之間進行數據傳輸的組件,它基于千兆交換機或者萬兆交換機實現數據在節點之間的高速傳輸。是一個非常強大的網絡通信組件。
????????外部數據在加載到Segment時,采用并行數據流進行加載,直接加載到Segment節點,這項獨特的技術是Greenplum的專有技術,保證數據在最短時間內加載到數據庫中。
1.4、Greenplum 的優缺點
1)優點
1. 數據存儲
????????采取MPP架構的數據庫系統可以對海量數據進行管理。
2. 高并發
????????Greenplum利用強大并行處理能力提供并發支持。
3. 線性擴展
????????Greenplum 支持數以千、萬計的節點擴展。
4. 高性價比
????????Greenplum 在普通的x86 Server上就能達到很高的性能,而且維護成本相比同類廠商也低許多,因此性價比很高。
5. 反應速度
????????Greenplum通過準實時、實時的數據加載方式,實現數據倉庫的實時更新,進而實現動態數據倉庫(ADW)。
6. 高可用性
????????對于主節點,Greenplum提供Master/Stand by機制進行主節點容錯,當主節點發生錯誤時,可以切換到Stand by節點繼續服務。
7. 系統易用
????????Greenplum 產品是基于流行的 PostgreSQL 之上開發(站在巨人的肩膀上),幾乎所有的PostgreSQL客戶端工具及PostgreSQL應用都能運行在Greenplum平臺上,在Internet上有著豐富的PostgreSQL資源供用戶參考。
2)缺點
1. 主從雙層架構,并非真正的扁平架構,存在性能瓶頸和SPOF單點故障(通過備用Master實現高可用已解決)。
2. 無法支持數據壓縮態下的DML操作,不易于數據的維護和更新。(可進可退,不常用的冷數據可以壓縮,要做更新的時候可以先解壓縮再做操作)
3. 單個節點上的數據庫沒有并行和大內存使用能力,必須通過部署多個實例(segment servers)來充分利用系統資源,造成使用和部署很復雜。(MPP 架構單臺節點能力有限,可能需要部署多個實例去并行處理數據,區別于 Yarn 的資源共享,任務可以分配給別的節點)
2、Greenplum 數據類型
Greenplum 的安裝這里省略,主要記錄一下啟停命令,防止之后忘記。
- 使用創建好的 gpadmin 用戶,啟動 Greenplum:
-- 遇到問題輸入y
gpstart
- ?查看集群狀態
gpstate -f
- 關閉集群(需要把客戶端先關閉,比如 DataGrip 連接)?
-- 遇到問題輸入y 詢問等待模式(s 默認) 快速模式(f) 立即模式(i) 輸入f
gpstop
2.1、基本數據類型
類型 | 類比Java | 長度 | 描述 | 范圍 |
bigint | long | 8字節 | 大范圍整數 | -9223372036854775808 到 +9223372036854775807 |
smallint | short | 2字節 | 小范圍整數 | -32768到+32767 |
integer(int) | int | 4字節 | 常用整數 | -2147483648 到 +2147483647 |
decimal | 可變長 | 用戶指定的精度,精確 | 小數點前 131072 位;小數點后 16383 位 | |
real | 4字節 | 可變精度,不準確 | 6位十進制數字精度 | |
double?precision | double | 8字節 | 可變精度,不準確 | 15位十進制數字精度 |
smallserial | 2字節 | 自增的小范圍整數 | 1到32767 | |
serial | 4字節 | 自增整數 | 1到2147483647 | |
bigserial | 8字節 | 自增的大范圍整數 | 1到9223372036854775807 | |
character | char | 別名char | 定長,不足補空白 | |
character varying | 別名varchar | 變長,有長度限制 | ||
text | 變長,無長度限制 | |||
timestamp | 8字節 | 日期和時間,無時區 | 4713 BC到294276 AD | |
timestamp with time zone | 8字節 | 日期和時間,有時區 | 4713 BC到294276 AD | |
date | 4字節 | 只用于日期 | 4713 BC到5874897 AD | |
boolean | 1字節 | true/false | ||
money | 8字節 | 貨幣金額 | -92233720368547758.08 到 +92233720368547758.07 |
下面我們嘗試創建一個簡單的表并插入數據:?
CREATE TABLE stu(id int,name text,age smallint,weight double precision);insert into stu values(1,'李大喜',18,80.5),(2,'李元芳',25,88.8);select * from stu;
注意:建表時會提示 Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table. 這是提醒建表時指定分布鍵和分布策略,默認第一個字段(或主鍵)和hash策略。
2.2、復雜數據類型
2.2.1、枚舉類型
相當于 Java 的 Enum 類型,使用 create type 命令創建;
-- 創建枚舉類型
CREATE TYPE season AS ENUM('Spring','Summer','Autumn','Winter');-- 創建一個帶有枚舉類型的表
CREATE TABLE user_season(name text,sea season
);INSERT INTO user_season
VALUES('春招','Spring'),('秋招','Autumn');SELECT * FROM user_season;
2.2、幾何類型
類型 | 大小 | 描述 | 表現形式 |
point | 16字節 | 平面中的點 | (x,y) |
line | 32字節 | 直線 | ((x1,y1),(x2,y2)) |
lseg | 32字節 | 線段 | ((x1,y1),(x2,y2)) |
box | 32字節 | 矩形 | ((x1,y1),(x2,y2)) |
path | 16+16n字節 | 路徑(與多邊形相似) | ((x1,y1),...) |
polygon | 40+16n字節 | 多邊形 | ((x1,y1),...) |
circle | 24字節 | 圓 | <(x,y),r> (圓心和半徑) |
-- 創建帶有幾何類型的表
CREATE TABLE shapes(id serial PRIMARY KEY , -- 自增主鍵point_col point, -- 點line_col line, -- 線polygon_col polygon -- 多邊形
);INSERT INTO shapes VALUES
(1,point(1,1),line '[(0,0),(2,2)]',polygon'((0,0),(1,0),(1,1),(0,1))');-- 根據點去查(不能使用 = )
SELECT * FROM shapes WHERE point_col <-> point(1,1) < 0.0001;
-- 根據直線去查詢(可以使用 =)
SELECT * FROM shapes WHERE line_col = line '[(0,0),(2,2)]';
-- 根據多邊形去查(必須使用 ~=)
SELECT * FROM shapes WHERE polygon_col ~= polygon '((0,0),(1,0),(1,1),(0,1))';
2.3、網絡地址類型
類型 | 描述 | 說明 |
cidr | 7或19字節 | IPv4 或 IPv6 網絡 |
inet | 7或19字節 | IPv4 或 IPv6 主機和網絡 |
macaddr | 6字節 | MAC 地址 |
-- 創建包含網絡地址數據類型的表
create table network_addresses (id serial primary key,ip_address inet,network cidr,mac_address macaddr
);-- 插入數據
insert into network_addresses (ip_address, network, mac_address)
values
('192.168.1.1/24', '192.168.1.0/24', '08:00:2b:01:02:03');-- 查詢數據
select * from network_addresses;-- 查詢特定的 IP 地址
select * from network_addresses where ip_address = inet '192.168.1.1';
select * from network_addresses where host(ip_address) = '192.168.1.1';-- 查詢特定的網絡
select * from network_addresses where network = cidr '192.168.1.0/24';-- 查詢特定的 MAC 地址
select * from network_addresses where mac_address = macaddr '08:00:2b:01:02:03';-- 更新數據
update network_addresses set ip_address = inet '192.168.1.2' where id = 1;-- 刪除數據
delete from network_addresses where id = 1;
2.4、JSON
?數倉中 Maxwell 同步過來的數據就是 json 類型,我們當時是使用結構體來存儲的;?
-- json 類型
CREATE TABLE json_demo(id serial PRIMARY KEY ,data jsonb
);INSERT INTO json_demo (data) VALUES
('{"name": "李大喜","age": 18,"city": "上海"}');SELECT * FROM json_demo;SELECT data->>'name' AS name FROM json_demo; -- 李大喜
注意:這里需要注意 json 段的取值方式;?
2.5、數組類型
????????GreenPlum 允許將字段定義成變長的多維數組。數組可以是任何基本類型或用戶定義類型,枚舉類型或復合類型。
-- 數組類型
CREATE TABLE array_demo(id serial PRIMARY KEY ,numbers int[]
);INSERT INTO array_demo (numbers) VALUES
('{1,2,3,4,5,6}');SELECT * FROM array_demo;
-- gp 的數組下標是從 1 開始的
SELECT numbers[1] FROM array_demo;
-- 將數組展開
SELECT id,unnest(numbers) FROM array_demo;
2.6、復合類型
-- 復合類型
CREATE TYPE student as (name text,age int,sex char,grade double precision
);CREATE TABLE student_demo(id serial PRIMARY KEY ,student_info student
);INSERT INTO student_demo (student_info) VALUES
( ( '燕雙鷹',20,'男',98.5 ));SELECT * FROM student_demo;-- 復合類型必須加括號
SELECT (student_info).age FROM student_demo WHERE (student_info).name = '燕雙鷹';
總結
? ? ? ? 學習 Greenplum 主要是因為之前接觸過另一款 MPP 架構的數據庫——StarRocks,但是資料不是那么完善,沒有項目能夠練習。盡管實習的公司用的就是 StarRocks 引擎,但是除了基本常規的 SQL 查詢,建表這些工作輪不到實習生來做。