Greenplum入门——基础知识、安装、常用函数
来源:互联网 发布:5g网络的频率 编辑:程序博客网 时间:2024/05/16 02:22
本文为博主在学习Greenplum时阅读的《Greenplum企业应用实战》时的笔记,对书中章节的知识要点进行了归纳和梳理。有兴趣的同学可以找原书学习下。如果认为文中内容涉嫌侵权请及时联系博主删除文章。
软件安装及数据库初始化
Greenplum架构
Master主机与Segment主机的职责
Master
- 建立与客户端的会话连接和管理
- SQL的解析并形成分布式的执行计划
- 将生成好的执行计划分发到每个Segment上执行
- 收集Segment的执行结果
- 不存储业务数据,只存储数据字典
- 可以一主一备,分布在两台机器上
- 为了提高性能,最好单独占用一台机器
Segment
- 业务数据的存储和存取
- 执行由Master分发的SQL语句
- 对于Master来说,每个Segment都是对等的,负责对应数据的存储和计算
- 每一台机器上可以配置一到多个Segment
- 由于每个Segment都是对等的,建议蚕蛹相同的及其配置
- Segment分primary和mirror两种,一般交错的存放在子节点上
Master和Segment都是一个单独的PostgreSQL数据库。每一个都有自己单独的一套元数据字典。Master节点一般也叫主节点,Segment叫做数据节点。
为了实现高可用,每个Segment都有对应的备节点 Mirror Segment分别存在与不同的机器上。
Client一般只能与Master节点进行交互,Client将SQL发给Master,然后Master对SQL进行分析后再讲其分配给所有的Segment进行操作。
环境搭建
操作系统
Greenplum没有Windows版本,只能安装在类UNIX的操作系统上
数据库存储
Greenplumn极度消耗IO资源,所以对存储的要求比较高。
文件系统的选择上,Linux下建议使用XFS,Solaris建议使用ZFS,对于Raid根据需求选择硬Raid活软Raid,如果需要更大孔家,建议使用Raid5,如果对性能要求更高,可选择Raid1+0.
网络
配置/etc/hosts时,习惯将Master机器叫做mdw,将Segment机器叫做sdw
创建用户及用户组
将原有用户删除
#groupdel gpadmin#userdel gpadmin
安装
1.安装数据库软件
创建新的用户和用户组
#groupadd -g 530 gpadmin#useradd -g 530 -u 530 -m -d /home/gpadmin -s /bin/bash gpadmin
对文件夹赋权,为新用户创建密码
#chown -R gpadmin:gpadmin /home/gpadmin/#passwd gpadminChanging password for user gpadmin.New UNIX password:Retype new UNIX password:
执行unzip命令解压安装文件
unzip greenplum-db-4.1.1.1-build-1-RHEL5-x86_64.zip
为Greenplum软件创建安装目录,并且赋给gpadmin用户权限
mkdir /opt/greenplumchown -R gadmin:gpadmin /opt/greenplum
安装
./greenplum-db-4.1.1.1-build-1-RHEL5-x86_64.bin
安装完成后Greenplum的环境变量已经在greenplum_path.sh中设置了。
引用环境变量配置
source /opt/greenplum/greenplum-db/greenplum_path.sh
2.配置hostlist
[gpadmin@dw-greenplum01 ]$ cat hostlistmdwsdw1sdw2sdw3
seg_hosts只保存segment节点的hostname
[gpadmin@dw-greenplum-1 conf]$ cat seg_hostssdw1sdw2sdw3
3.使用gpssh-exkeys打通所有服务器
使用gpssh-exkeys将所有机器的通道打开,这样就不用输入密码使登陆在每台机器之间跳转了
[gpadmin@dw-greenplum-1 conf]$ gpssh-exkeys -f hostlist
打通所有机器通道后,就可以使用gpssh命令对所有机器进行批量操作了
4.将软件分发到每一台机器上
将安装后的文件打包
tar -cf gp4.1.tar greenplum-db-4.1.1.1/
使用gpscp命令将这个文件复制到每一台机器上
gpscp -f /home/gpadmin/conf/hostlist gp4.1.tar =:/opt/greenplum
使用gpssh命令批量解压文件包
=> cd /opt/greenplum=> tar -xf gp4.1.tar
创建数据库数据目录
- Master目录
=> mkdir -p /home/gpadmin/gpdata/gpmaster
- Primary节点目录
=> mkdir -p /home/gpadmin/gpdata/gpdatap1=> mkdir -p /home/gpadmin/gpdata/gpdatap2
- Mirror节点目录
=> mkdir -p /home/gpadmin/gpdata/gpdatam1=> mkdir -p/home/gpadmin/gpdata/gpdatam2
Gpmaster目录保存Master的数据,么个机器上的gpdatap1、gpdatap2分别对应这个机器上的两个主数据节点目录,gpdatam1、gpdatam2对应备数据节点目录
5.配置~/.bash_profile
修改环境变量
添加内容
source /opt/greenplum/greenplum-db/greenplum_path.shexport MASTER_DATA_DIRECTORY=/home/gpadmin/gpdata/gpmaster/gpseg-1export PGPORT=2345export PGDATABASE=testDB
6.初始化Greenplum的配置文件
配置文件的模板可以在$GPHOME/docs/cli_help/gpconfigs/目录下找到。gpinitsystem_config文件是初始化Greenplum的模板,在这个模板中,Mirror Segment的配置都被注释掉了,模板中基本初始化数据库的参数都是有的。
# 数据库的代号ARRAY_NAME = "Greenplum"MACHINE_LIST_FILE=/home/gpadmin/conf/seg_hosts# Segment的名称前缀SEG_PREFIX=gpseg# Primary Segment骑士的端口号PORT_BASE=33000# 指定Primary Segment的数据目录declare -a DATA_DIRECTORY=(/home/gpadmin/gpdata/gpdatap1 /home/gpadmin/gpdata/gpdatap2)# Master 所在机器的HostnameMASTER_HOSTNAME=mdw# 指定Master的数据目录MASTER_DIRECTORY=/home/gpadmin/gpdata/gpmster# Master的端口MASTER_PORT=2345# Bash版本TRUSTED_SHELL=/usr/bin/ssh# 字符集ENCODING = UNICODE# Mirror Segment起始的端口号MIRROR_PORT_BASE=43000# Primary Segment 主备同步的起始端口号REPLICATION_PORT_BASE=34000#Mirror Segment主备同步的起始端口号MIRROR_REPLICATION_PORT_BASE=44000# Mirror Segment的数据目录declare -a MIRROR_DATA_DIRECTORY=(/home/gpadmin/gpdata/gpdatam1 /home/gpadmin/gpdata/gpdatam2)
7.初始化数据库
使用gpinitsystem脚本初始化数据库
gpinitsystem -c initgp_config -s sdw3
登陆Greenplum默认的数据库postgres
[gpadmin@dw-greenplum-1 ~]$ psql -d postgres
创建数据库
createdb testDB -E utf-8
没有设置PGDATABASE环境变量时,使用psql进行登录,默认的数据库与操作系统用户名一致
设置环境变量,修改默认登陆数据库
[gpadmin@dw-greenplum01 ~]$ export PGDATABASE=testDB[gpadmin@dw-greenplum01 ~]$ psql
数据库启动与关闭
1.启动数据库
Greenplum提供脚本来管理数据库,gpstart是启动数据库的脚本,可以用gpstart -help查看帮助
一般使用
gpstart -a
直接启动数据库
2.关闭数据库
gpstop是关闭数据库的脚本
一般使用
gpstop -a
直接关闭数据库
畅游Greenplum
访问Greenplum
1.psql
psql是Greenplum/PostgreSQL默认的客户端
使用psql远程连接
admin@test1:、home/admin>psql -h 10.20.151.7 -p 2345 -d testDB -U gpadmin
Greenplum有权限控制,并不是所有的及其都可以连接到数据库。如果有其他计算机要登陆Greenplum,先为数据库用户gpadmin创建一个密码,然后在pg_hba.conf文件中增加客户端机器的权限配置,就可以成功登陆了。
testDB=# alter role gpadmin with password 'gpadmin';
在$MASTER_DATA_DIRECTORY/pg_hba.conf文件中增加
host testDB gpadmin 10.20.151.1/32 md5
使配置生效
gpstop -u
2.pgAdmin
…
基本语法
1.获取语法介绍
可以使用 \h 查看GreenPlum支持的所有语法
在psql中使用\h command
testDB=# \h create view
2.CREATE TABLE
与其他数据库不同的地方:
- 在Greenplum中建表时需要指定表的分布键
- 如果表需要用某个字段分区,可以通过partition by将表建成分区表
- 可以使用like操作创建与like的表一样结构的表,功能类似 create table t1 as select * from t2 limit 0
- 可以使用inherits实现表的继承
CREATE [[GLOBAL|LOCAL] {TEMPORARY|TEMP}] TABLE table_name ( [ { column_name data_type [DEFAULT default_expr] [column_constraint [...]] | table_constraint | LIKE ohter_table [{INCLUDING|EXCLUDING} {DEFAULTS|CONSTRAINTS} ...] } [,...] ]...)[INHERITS (parent_table [,...])][WITH (storage_parameter=value [,...])[ON COMMIT {PRESERVE ROWS|DELETE ROWS|DROP}][TABLESPACE tablespace][DISTRIBUTED BY (column,[...]) | DISTRIBUTED RANDOMLY][PARTITION BY partition_type (column) [SUBPARTITION BY partition_type (column)] [SUBPARTITION TEMPLATE (template_spec)] [...] (partition_spec) |[SUBPARTITION BY partition_type(column)] [...] (partition_spec) [(subpartition_spec [(...)] )]]
Greenplum是一个分布式数据库,有两种数据分布策略:
1. Hash分布。指定一个活多个分布键,计算hash值,并且通过hash值路由到特定的Segment节点上,语法为Distributed by(…)。如果不指定分布键,默认将第一个字段作为分布键。
2. 随机分布,也叫平均分布。数据随机分散在每一个节点中,这样无论数据是什么内容,都可以平均分布在每个节点上,==但是在执行SQL的过程中,关联等操作都需要将数据重分布,性能较差。==语法为在表字段定义的后面加上Distributed randomly
采用随机分布策略的表默认将主键或唯一键作为分布键,因为每一个Segment都是一个单一的数据库,单个的数据库可以保证唯一性,多个数据库节点就无法保证全局的跨库唯一性,故只能按照唯一键分布,同一个值的数据都在一个节点上,以此来保证唯一性。
==如果指定的分布键与主键不一样,那么分布键会被更改为主键。==
使用like创建的表,只是表结构会与原表一模一样,表的一些特殊属性并不会一样,例如亚索、只增 appendonly等。如果不指定分布键,则默认分布键与原表相同。
3.SELECT
SELECT语句的基本语法跟其他数据库类似,也有自己的一些特性,例如分页采用offset加limit操作
SELECT可以不用指定From字句,如执行函数、进行一些简单的科学计算等。
如果不加order by字句,查询的结果中,数据的顺序是不能够保证的。
4.create table as 与 select into
create table as 与 select into 有一样的功能,都可以使表根据直接执行SELECT的结果创建出一个新的表,这个在临时分析数据的时候十分方便。例如,在创建一个表的时候如果默认不指定分布键,那么Greenplum根据执行SELECT得到的结果集来选择,不用再次分重分布数据的字段作为表的分布键。
也可以手动加入distributed关键字,指定分布键,这样数据就会根据指定分布键再建表。
select into的语法比create table as更简单,虽然功能一样,但是执行select into不能指定分布键,只能使用默认的分布键。
5.explain
explain用于查询一个表的执行计划。
testDB=# explain select * from test1 x,test2 y where x.id=y.id;
6.insert/update/delete
insert
在执行insert语句的时候,注意分布键不要为空,否则分布键默认会变成null,数据都被保存在一个节点上,造成数据分布不均。
可以批量操作
testDB=# insert into test001 values(100,'tom'),(101,'lily');
update
不能批量对分布键执行update,因为对分布键执行update需要将数据重分布,Greenplum暂时不支持这个功能。
delete
Greenplum 3.x版本中,如果delete操作涉及子查询,并且子查询的结果还会涉及数据重分布,这样的删除语句会报错。
对整张表执行Delete较慢,有此需求时建议使用truncate
7.truncate
与oracle一样,执行truncate直接删除表的物理文件,然后创建新的数据文件。truncate操作比delete操作在性能上有非常大的提升,当前如果有sql正在操作这张表,那么truncate操作会被锁住,知道表上面的所有锁被释放
常用数据类型
Greenplum的数据类型基本与PostgreSQL的一样。
1.数值类型
2.字符类型
3.时间类型
常用函数
字符串函数
时间函数
使用interval类型可以直接对事件类型进行计算,用来计算时间的加减
数值计算函数
其他常用函数
序列号生成函数——generate_series
generate_series(x,y,t)
生成多行数据从x到另外y,步长为t,默认是1
字符串列转行——string_agg
string_agg(str,symbol [order by str])
(按照某字段排序)将str列转行,以symbol分隔
字符串行转列——regexp_split_to_table
…
hash函数——md5,hashbpchar
md5的hash算法精度为128位,返回一个字符串
Hashbpchar的精度是32位,返回一个integer类型
分析函数
开窗函数
聚合函数返回各个分组的结果,开窗函数则为每一行返回结果。
rank()、row_number
grouping sets
如果需要对几个字段的组合进行group 不用,需要用到grouping sets功能
分区表
Greenplum支持分区表。
可以使用时间分区、Every分区、list分区、
创建分区表
[PARTITION BY partition_type (column) [SUBPARTITION BY partition_type (column)] [SUBPARTITION TEMPLATE (template_spec)] [...] (partition_spec) |[SUBPARTITION BY partition_type(column)] [...] (partition_spec) [(subpartition_spec [(...)] )]]and partition_element is:DEFAULT PARTITION name| [PARTITION name] VALUES (list_value[,...])| [PARTITION name] START ([datatype] 'start_value') [INCLUSIVE|EXCLUSIVE] [ END ([datatype] 'end_value') [INCLUSIVE|EXCLUSIVE] [ EVERY ([datatype] [number|INTERVAL] 'interval_value')]| [PARTITION name] END ([DATATYPE] 'end_value') [INCLUSIVE|EXCLUSIVE] [ EVERY ([datatype] [number|INTERVAL] 'interval_value')] [ with (partition_storage_parameter=value [,...])] [ TABLESPACE tablespace]
Tips
通过实验得到:向主表插入数据时,数据会被自动存放至相应的分区表。
也可以直接向分区子表插入符合条件的数据,
当向分区子表插入不符合条件的额数据时,会提示:
[Err] ERROR: Trying to insert row into wrong partition (seg1 hadoop3:40000 pid=6679)
DETAIL: Expected partition: test_partition_range_1_prt_p20111231, provided partition: test_partition_range_1_prt_p20111230
删除主表是会自动删除关联的分区表
Examples
按时间分区
create table public.test_partition_range( id numeric, name character varying(32), dw_end_date date,) distributed by(id)PARTITION BY range(dw_end_date)( PARTITION p20111230 START ('2011-12-30'::date) END ('2011-12-31'::date), --...);
使用Every分区
create table test.test_partition_every( id numeric, name character varying(32), dw_end_date date) distributed by(id)partition by range(dw_end_Date)( partition p201112 start('2011-12-1'::date) end ('2011-12-31'::date) every ('1 days'::interval));
使用list分区
create table test.test_partition_list( member_id numeric, city character varying(32))distributed by (member_id)partition by list(city)( partition guangzhou values('guangzhou'), partition hangzhou values('hangzhou'), default partition other_city);
修改分区表
ALTER DEFAULT PARTITIONDROP DEFAULT PARTITION [IF EXISTS]DROP PARTITION [IF EXISTS] { partition_name | FOR (RANK(number)) | FOR (value)}[CASCADE]TRUNCATE DEFAULT PARTITIONTRUNCATE PARTITION { partition_name | FOR (RANK(number)) | FOR (value)}RENAME DEFAULT PARTITION TO new_partition_nameRENAME PARTITION { partition_name | FOR (RANK(number)) | FOR (value)}TO new_partition_nameADD DEFAULT PARTITION NAME [(subpartition_spec)]ADD PARTITION [name] partition_element [(subpartition_spec)]EXCHANGE PARTITION { partition_name | FOR (RANK(number)) | FOR (value)} WITH TABLE TABLE_NAME [WITH|WITHOUT VALIDATION]EXCHANGE EFAULT PARTITION WITH TABLE TABLE_NAME [WITH|WITHOUT VALIDATION]SET SUBPARTITION TEMPLATE (subpartition_spec)SPLIT DEFAULT PARTITION { AT (list_value) |START([datatype] range_value) [INCLUSIVE|EXCLUSIVE] END ([datatype]) range_value) [INCLUSIVE|EXCLUSIVE]}[INTO (PARTITION new_partition_name, PARTITION default_partition_name)]SPLIT DPARTITION { partition_name | FOR (RANK(number)) | FOR (value)} AT(value)[INTO (PARTITION partition_name, PARTITION partition_name]
Examples
新增分区
alter table test.test_partition_every add partition p20120105_6start ('2012-01-05'::date) END ('2012-01-07'::date);
drop/truncate分区
alter table test.test_partition_every drop partition p20120105_6;alter table test.test_partition_every truncate partition p20120105_6;
拆分分区
alter table test.test_partition_every split partition p20120105_6at(('2012-01-06'::date)) into (partition p20120105,partition p20120106);
交换分区
alter table test.test_partition_every exchange partition p20120102 with table test.test_on_partition;
外部表
Greenplum在数据加载上有一个明显的优势,就是支持数据并发加载,gpfdist就是并发加载的工具,在数据库中对应的就是外部表。
外部表就是一张表的数据是指向数据库之外的数据文件的。在Greenplum中,可以对一个外部表执行正常的DML操作,当读取数据的时候,数据库就从数据文件中加载数据。外部表支持在Segment上并发的告诉从gpfdist导入数据,由于是直接从Segment上导入数据,所以效率非常高。
创建外部表
CREATE [READABLE] EXTERNAL TABLE TABLE_NAME(column_name data_type [,...] | LIKE other_table)LOCATION ('file://seghost[:port]/path/file' [,...]) | ('gpfdist://filehost[:port]/file_pateern' [,...]) | ('gphdfs://hdfs_host[:port]/path/file')FORMAT 'TEXT'[( [HEADER] [DELIMITER [AS] 'delimeter' | 'OFF'] [NULL [AS] 'null string'] [ESCAPTE [AS] 'escape'|'OFF'] [NEWLINE [AS] 'LF'|'CR'|'CRLF'] [FILL MISSING FIELDS] )]| 'CSV'[( [HEADER] [QUOTE [AS] 'quote']
外部表需要指定gpfdist的IP和端口,详细目录地址。其中文件名支持通配符匹配。
可以编写多个gpfdist的地址,但是不能超过总的Segment数,否则会报错。在创建外部表的时候可以指定分隔符、err表、指定允许出错的数据条数,以及源文件的字符编码等。
外部表还支持本地文本文件的导入,效率较低,不建议使用。
外部表还支持HDFS的文件操作。
启动gpfdist及创建外部表
1.
首先在文件服务器上启动gpfdist服务,指定文件目录及端口
nohup $GPHOME/bin/gpfdist -d /home/admin -p 8888 > /tmp/gpfdist.log 2>&1 &
nohup保证程序在Server端执行,当前会话关闭后,程序仍然正常运行
nohup是Unix/Linux中的一个命令,普通进程通过&符号放到后台运行,如果启动该程序的额控制台退出,则该进程终止。nohup命令启动程序,则在控制台退出后,进程仍然继续运行,起到守护进程额作用。
2.
准备好需要加载的数据文件,将其放在外部表文件及其的、home/admin/目录或该目录的子目录下,在Greenplum中创建对应的外部表
create external table test.test001_ext( id integer, name varchar(128))location ( 'gpfdist://10.20.151.11:8888/gpextdata/test001.txt')format 'TEXT' (delimiter as E'|' null as '' escape 'OFF')encoding 'gb18030' log errors into test.test001_err segment reject limit 10rows;
3.外部表查询及数据加载
testDB=# select * from public.test001_ext
COPY命令
使用COPY命令可以实现将文件导出和导入,但是要通过Master,效率没有外部表高,但是在数据量比较小的情况下,COPY命令比外部表要方面很多。
COPY table [(colum [, ...]) ] FROM {'file'|STDIN}[ [WITH] [OIDS] [HEADER] [DELIMITER [AS] 'delimeter'] [NULL [AS] 'null string'] [ESCAPE [AS] 'escape' | 'OFF'] [NEWLINE [AS] 'LF'|'CR'|'CRLF'] [CSV [QUOTE [AS] 'quote'] [FORCE NOT NULL column [,...]] [FILL MISSING FIELDS] [ [LOG ERRORS INTO error_table] [KEEP] SEGMENT REJECT LIMIT count [ROWS|PERCENT]]COPY {table [(column [,...])] |(query) } TO {'file'|STDOUT} [ [WITH] [OIDS] [HEADER] [DELIMIETER [AS] 'delimeter'] [NULL [AS] 'null string'] [ESCAPE [AS] 'escape'|'OFF'] [CSV [QUOTE [AS] 'quote'] [FORCE QUOTE column [,...]]]
Greenplum 4.x中引入了可写外部表,在导出数据的时候可以用可写外部表并发导出,性能很好。但在Greeplum3.x版本中,导出数据只能通过COPY命令实现,数据在Master上汇总导出。
如果需要将数据远程导出到其他机器上,可以使用copy to stdout,远程执行psql连接到数据库上,然后通过管道将数据重定向成文件。
- Greenplum入门——基础知识、安装、常用函数
- Greenplum入门——概览
- GreenPlum常用函数(日期)
- GreenPlum常用字符串函数
- GreenPlum常用时间函数
- GreenPlum常用数值计算函数
- GreenPlum入门
- Greenplum函数
- Greenplum安装
- GreenPlum安装
- greenplum安装
- Greenplum 安装
- 【PHP基础知识】——常用字符串处理函数总结
- Python基础入门—常用函数笔记
- 基础知识—函数-函数概述
- USB——入门基础知识
- USB——入门基础知识
- SpringMVC入门——基础知识
- 最常用前端框架BootStrap——栅格系统
- 过河问题
- 周计划 补完工程 第十三周 matlab练习
- SpringBoot25-spingboot数据访问-数据缓存Cache
- C#中的int.TryParse怎么用
- Greenplum入门——基础知识、安装、常用函数
- 17 small is beautiful
- A Simple Html5 Game
- Laravel 5.2 利用 Uploadify 插件实现上传图片
- 数据结构线性表的综合实验——顺序表
- 大学生职业规划
- 作业 十一
- exlcs
- LeetCode72 Edit Distance