Greenplum 从入门到实战:快速搭建 + 基础 SQL 示例

一、前言

Greenplum(简称 GPDB)是一款基于 PostgreSQL 演进的开源 MPP 大规模并行处理分布式数据库,主打 PB 级海量数据离线分析、数据仓库、多维报表、即席查询等 OLAP 场景,在金融、电信、零售、物流等企业级大数据平台中应用十分广泛。

它完全兼容 PostgreSQL 语法,学习门槛低,依托 Shared-Nothing 无共享架构具备线性扩展能力,同时支持行存、列存、数据压缩、高可用、数据镜像等企业级特性,是传统数仓、大数据分析场景的主流选型之一。

架构详解(Master + Segment + Interconnect)

  1. Master(主节点)
    1. 全局入口,接收客户端连接(默认 5432 端口)。
    2. 解析 SQL、生成并行执行计划、分发任务、汇总结果。
    3. 不存业务数据,仅存元数据(数据字典)。
    4. 通常部署主备高可用(Primary/Standby)。
  2. Segment(数据节点)
    1. 核心数据存储与计算单元,每个 Segment 是独立 PostgreSQL 实例。
    2. 数据按Hash / 随机 / 范围分布,每个 Segment 存分片数据。
    3. 支持Primary+Mirror 镜像,节点故障自动切换,保障高可用。
    4. 单节点可部署多个 Segment 实例,提升资源利用率。
  3. Interconnect(互联层)
    1. 节点间高速数据传输通道,负责并行查询的数据洗牌、分发、聚合。
    2. 采用UDP 协议,低延迟高吞吐,支撑大规模数据交换。

环境说明:本文采用Linux单机部署,仅用于学习、测试、开发调试,不适用生产集群。

二、环境准备

本文提供一种主流单机部署方案,VMware+CentOS7.9 RPM 安装贴近生产环境


VMware+CentOS7.9 RPM单机部署

2.1 虚拟机硬件配置
  • CPU:4 核心(最低 2 核)
  • 内存:8GB(最低 6GB,GP 对内存要求较高)
  • 硬盘:系统盘 60GB,额外划分独立磁盘挂载 /data 用于存放数据
  • 网络:桥接模式,方便宿主机图形化工具远程连接
2.2 系统环境初始化(CentOS 7.9)
2.2.1 关闭防火墙与开机自启
# 临时关闭防火墙
systemctl stop firewalld
# 禁止开机自启
systemctl disable firewalld
# 查看状态
systemctl status firewalld
2.2.2 关闭SELinux

SELinux会拦截数据库进程访问,必须关闭:

# 临时关闭
setenforce 0
# 永久关闭(重启生效)
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 验证状态
getenforce
2.2.3 配置系统内核参数

编辑内核配置文件,适配 GP 内存、网络、信号量要求:

vim /etc/sysctl.conf

文件末尾追加以下内容:

kernel.shmmax = 500000000
kernel.shmall = 4000000000
kernel.sem = 250 512000 100 2048
net.ipv4.tcp_syncookies = 1
vm.overcommit_memory = 2

保存退出,执行命令使配置生效:

sysctl -p
2.2.4 配置系统资源限制

修改文件句柄、进程数限制,避免大数据查询报错:

vim /etc/security/limits.conf

文件末尾添加:

* soft nofile 65535
* hard nofile 65535
* soft nproc 131072
* hard nproc 131072

配置完成后重启虚拟机:

reboot
2.3 创建专用用户与数据目录

Greenplum强制使用gpadmin账户运行,禁止root账户启动服务:

# 创建gpadmin用户
useradd gpadmin
# 设置用户密码
passwd gpadmin

# 创建数据目录并授权
mkdir -p /data/master
chown -R gpadmin:gpadmin /data
chmod 700 /data
2.4 下载并安装RPM包
# 切换至安装目录
cd /usr/local
# 在线下载开源版Greenplum 6.14.1
wget https://github.com/greenplum-db/gpdb/releases/download/6.14.1/open-source-greenplum-db-6.14.1-rhel7-x86_64.rpm

# 执行安装(自动安装依赖)
yum install -y ./open-source-greenplum-db-6.14.1-rhel7-x86_64.rpm

# 授权安装目录
chown -R gpadmin:gpadmin /usr/local/greenplum*
2.5 配置环境变量

切换至gpadmin用户,配置全局环境变量:

su - gpadmin
vim ~/.bashrc

文件末尾添加配置:

source /usr/local/greenplum-db-6.14.1/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/master

加载环境变量:

source ~/.bashrc

执行gpversion可查看版本,代表配置成功。

2.6 初始化并启动数据库

使用官方单节点模板初始化实例:

# 单节点初始化,出现提示输入 Y 确认
gpinitsystem -c /usr/local/greenplum-db-6.14.1/docs/cli_help/gpconfigs/gpinitsystem_singlenode
常用启停命令
# 启动数据库
gpstart -a
# 停止数据库
gpstop -a
# 重启数据库
gpstop -ar
命令行连接数据库
psql

出现postgres=# 即连接成功。

三、Greenplum核心基础概念

在编写 SQL 前,先掌握两个 GP 最核心特性,也是和单机 PostgreSQL 最大的区别:

3.1 数据分布键DISTRIBUTED BY

GP是分布式MPP架构,数据会拆分到多个Segment节点存储,分布键决定数据分片规则,直接影响查询性能:

  1. DISTRIBUTED BY (字段名):哈希分布(生产环境推荐),按字段哈希值分片,数据均匀分布
  2. DISTRIBUTED RANDOMLY:随机分布,数据随机打散,适合小表、维度表
  3. 不指定分布键:默认使用表主键作为分布键

最佳实践:大表、事实表优先选择查询、关联高频字段作为分布键。

3.2 存储类型

GP 支持多种存储模式,适配不同业务场景:

  1. 行存储(Heap 表,默认):适合小表、频繁增删改、OLTP 轻事务场景
  2. AO 追加优化表:专为批量写入、海量分析设计,支持列存储 + 数据压缩,数仓大表首选,压缩比最高可达 10:1,大幅节省磁盘空间。

四、基础SQL实战示例

下文所有SQL均可直接在psql客户端中执行,覆盖库、用户、表、增删改查、导入导出、元数据查询等日常常用操作。

4.1 数据库与用户管理

4.1.1 创建、切换数据库
-- 创建测试数据库
CREATE DATABASE test_db;

-- 切换至目标数据库
\c test_db;
4.1.2 创建用户并授权
-- 创建普通用户,设置密码
CREATE USER test_user WITH PASSWORD '123456';

-- 给用户授予数据库全部权限
GRANT ALL PRIVILEGES ON DATABASE test_db TO test_user;

4.2 数据表创建(行存 / 列存两种场景)

4.2.1 普通行存表(小表 / 更新频繁场景)

适用于用户维度表、配置表等小体量数据表:

CREATE TABLE user_info (
    id INT,
    name VARCHAR(50),
    age INT,
    city VARCHAR(50),
    create_time TIMESTAMP
) 
-- 指定分布键:按id哈希分片
DISTRIBUTED BY (id);
4.2.2 列存压缩表(大表 / 分析型场景)

适用于销售流水、日志、行为数据等海量事实表,开启列存 + zlib 压缩:

CREATE TABLE sales_record (
    sale_id INT,
    product_name VARCHAR(100),
    amount DECIMAL(10,2),
    sale_date DATE
)
-- 开启AO表、列存储、zlib压缩,压缩级别5
WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=5)
-- 分布键
DISTRIBUTED BY (sale_id);

4.3 插入数据

支持单条、批量插入,数仓环境优先使用批量插入提升效率:

-- 向用户表批量插入数据
INSERT INTO user_info VALUES 
(1, '张三', 25, '北京', now()),
(2, '李四', 30, '上海', now()),
(3, '王五', 28, '深圳', now()),
(4, '赵六', 35, '广州', now());

-- 向销售表批量插入数据
INSERT INTO sales_record VALUES
(1001, '手机', 3999.00, '2025-01-01'),
(1002, '电脑', 5999.00, '2025-01-01'),
(1003, '耳机', 299.00, '2025-01-02');

4.4 数据查询(基础查询 + 聚合 + 联表)

GP 完全兼容标准 SQL 与 PostgreSQL 语法,常规查询写法一致:

-- 1. 全表查询
SELECT * FROM user_info;

-- 2. 条件过滤查询
SELECT * FROM user_info WHERE city = '北京';

-- 3. 分组聚合统计(数仓高频用法)
SELECT city, COUNT(*) AS user_count
FROM user_info 
GROUP BY city 
ORDER BY user_count DESC;

-- 4. 多表关联查询
SELECT u.name, s.product_name, s.amount
FROM user_info u
JOIN sales_record s ON u.id = s.sale_id;

4.5 元数据与集群信息查询

查看表结构、分布键、集群节点等运维常用命令:

-- 查看表结构、分布键、存储属性
\d user_info;

-- 查看当前库下所有数据表
\dt;

-- 查看Greenplum集群节点配置信息
SELECT * FROM gp_segment_configuration;

4.6 数据导入导出(CSV 文件)

使用\copy命令实现本地文件与数据库数据互导,大数据量场景优先使用该方式:

-- 1. 表数据导出为CSV文件(带表头)
\copy user_info TO '/home/gpadmin/user_info.csv' WITH CSV HEADER;

-- 2. 从CSV文件导入数据到表中
\copy user_info FROM '/home/gpadmin/user_info.csv' WITH CSV HEADER;

4.7 表清空与删除

-- 清空表数据,保留表结构(高效清空大表)
TRUNCATE TABLE user_info;

-- 彻底删除数据表
DROP TABLE user_info;

五、入门必备优化建议

结合Greenplum架构特性,分享几条新手必记的性能优化规则:

  1. 合理选择分布键:大表关联字段尽量作为分布键,避免查询时节点间数据重分布,大幅提升效率;
  2. 区分存储类型:小表、频繁更新表使用默认行存,千万级以上大分析表统一使用列存 + 压缩
  3. 批量写入优先:避免单条循环INSERT,批量插入、文件导入是GP最优写入方式;
  4. 小表使用随机分布:维度表、字典表等小表可使用DISTRIBUTED RANDOMLY

六、环境关闭与退出

6.1 退出psql客户端

\q

6.2 退出容器

exit

6.3 停止 / 重启容器(可选)

# 停止容器
docker stop greenplum

# 重启容器
docker restart greenplum

七、总结

  1. 本文基于linux实现Greenplum零门槛单机部署,无需复杂集群配置,适合个人学习与开发调试;
  2. 分布键存储类型是Greenplum区别于传统单机数据库的核心,也是性能优化的关键;
  3. GP高度兼容PostgreSQL SQL语法,有SQL基础的开发者可快速上手;
  4. 该环境仅用于学习测试,生产环境需搭建Master主备、Segment镜像的高可用集群。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值