Ubuntu18 安装和使用 Greenplum

本文档详细介绍了在古董级硬件上安装Greenplum集群的步骤,包括主机名修改、配置hosts、打通服务器间连接等。在遇到gpssh连接错误和hostname报错时,提供了解决方案。接着,创建了大小不一的两张表并进行数据插入,展示了查询表占用空间和数据分布的方法。最后,探讨了分布键和非分布键查询的性能差异,并展示了分区表的创建和查询操作。
摘要由CSDN通过智能技术生成

安装教程

按照 Greenplum官方安装教程 一步一步来即可。

缺少的步骤

主机名修改

hostnamectl set-hostname mdw
reboot

配置 /etc/host

vim /etc/hosts
末尾追加 本机ip mdw sdw

本机ip别写127.0.0.1

打通服务器间连接

vim ~/greenplum/all_hosts
下面加两行
mdw
sdw

遇到的问题

gpssh 报错

gpssh-exkeys -h localhost 这一步,显示无法连接本地 ssh。

解决这个问题方法就是配一下 ssh 公钥登录,参考 ssh公钥登录配置

hostname报错

在官方教程里面有一步需要自己新建一个 MACHINE_LIST_FILE文件,并将本机的 hostname 放进去。

同时要将MASTER_HOSTNAME改为本机的 hostname 。

简要使用

集群初始化

部署在一台4核古董机上,拥有高达4GB的内存和1T的HDD。
1个master和3个segment,没有standby。

gpinitsystem -c gpinitsystem_singlenode

建表

建两张表,一大一小,大的约为30GB(5亿条数据),小的3GB(5千万条)。
两张表结构相同,均以 id 作为分布键,info和val为[1,100]范围内的随机数。
对应SQL如下

create table tbl_test (id int, info int, val int) distributed by (id);
create table tbl_small (id int, info int, val int) distributed by (id);

insert into tbl_test select generate_series(1,500000000),(random()*100)::int,(random()*100)::int from generate_series(1,1);

insert into tbl_small select generate_series(1,50000000),(random()*100)::int,(random()*100)::int from generate_series(1,1);

建完表格后,可以查询对应表所占的物理空间和数据在各个segment上的分布情况

select gp_segment_id, count(*) from tbl_test group by gp_segment_id;
select gp_segment_id, count(*) from tbl_small group by gp_segment_id;
--查看表存储空间
select pg_size_pretty(pg_relation_size('tbl_test')); 
select pg_size_pretty(pg_relation_size('tbl_small')); 

其数据在segment的分布结果如下图所示
在这里插入图片描述
每个表所占用的存储空间如下图所示
在这里插入图片描述

查询

以分布键作为过滤条件。

SELECT tbl_test.val,tbl_small.val 
FROM tbl_test
INNER JOIN tbl_small 
ON tbl_test.id = tbl_small.id WHERE tbl_test.info < 5;

在这里插入图片描述
其运行时间如下图所示,跑一下还是要花挺久的。
在这里插入图片描述

非分布键作为过滤条件。

SELECT tbl_test.id,tbl_small.id
from tbl_test
inner join tbl_small 
on tbl_test.val = tbl_small.val where tbl_test.info < 5;

在这里插入图片描述
我们构造一个更加复杂的SELECT语句,要求其使用聚合函数,这时候查询计划就会创建出 Redistributed Motion
在这里插入图片描述

分区表查询

建立分区表

表的列属性与之前一样,这次按info值3等分分区

create table tbl_distribute (id int, info int, val int) 
DISTRIBUTED BY (id)
PARTITION BY RANGE(info)
(
  partition p1 start ('0') inclusive end ('33') exclusive, 
  partition p2 start ('33') inclusive end ('66') exclusive, 
  partition p3 start ('66') inclusive end ('100') exclusive, 
  default partition default_p 
);

插入数据也和之前类似,往主表里插入5亿条数据库

insert into tbl_distribute select generate_series(1,500000000),(random()*100)::int,(random()*100)::int from generate_series(1,1);

查询

查询 info<50 的元组,在做了分区表之后,其查询计划如下图所示

EXPLAIN SELECT id,val
FROM tbl_distribute
WHERE info < 50;

SELECT tbl_distribute.id,tbl_small.id
from tbl_distribute
inner join tbl_small 
on tbl_distribute.val = tbl_small.val where tbl_distribute.info < 5;

在这里插入图片描述
同样是查询 info<50 的元组,其查询计划如下图所示

EXPLAIN SELECT id,val
FROM tbl_test
WHERE info < 10;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总想玩世不恭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值