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 查询,建表这些工作轮不到实习生来做。