date: 2020-01-11 15:51:39
前段时间导师要求了解 GreenPlum
数据库,后来安装和使用了一下,感觉和其他数据库没有什么不同,于是就不了了之了。现在重新看一遍 GPDB
的特性并尝试使用这些特性。
其实,官方宣传页上写的特性
才是真正需要我去了解的。
特性
首先,GPDB
的特性是什么?从哪里找?产品的宣传页上肯定有。
最大特性
GPDB
的最大特性就是 MPP
, 即 Massively Parallel Processing
。 在首页上,最明显的就是这两个:
- Massively Parallel, 大规模并行
- Analytics,分析
然后,下滑页面,两个明显的特性是:
- Power at scale: High performance on petabyte-scale data volumes. PB级数据高性能处理。
- True Flexibility: Deploy anywhere. 部署灵活。
主要特性
首页接着往下滑,写明了 GPDB
的主要特性:
- MPP Architecture
- Petabyte-Scale Loading: 加载速度随着每个额外节点的增加而增加,每个机架的加载速度超过10Tb/h ( 约为 347.22 GB/s ) 。
- Innovative Query Optimization: 工业界中首个大数据工作负载的
cost-based query optimizer
. - Polymorphic Data Storage: 多态数据存储。完全控制表和*–**分区存储、执行和压缩的配置。
- Integrated In-Database Analytics:
Apache MADlib
提供的一个库,用于可伸缩的数据库内分析,通过用户定义的函数扩展Greenplum数据库的SQL功能。 - Federated Data Access: 联邦数据访问。使用Greenplum optimzer和 query processing engine 查询外部数据源。包括Hadoop、Cloud Storage、ORC、AVRO、Parquet等 Polygot 数据存储。
遗憾的是,首页上的这些图标都不能点击。所以要体验这些特性,只能自己去探索了。
TODO
- 从 hadoop 中查询数据。
GPDB vs. Hadoop + Hive
来源:Greenplum介绍, 这是 Alibaba 在 2011.02.17 做的汇报, GPDB 版本为 4.x.
对比 Hadoop + Hive
, GPDB 的查询性能比 Hive 好,但是 GPDB 支持的集群节点数太少,最多可以 1000 个 segment, 而Hive 可支持上万个节点。
Data Loading
主要有 3 种加载方法:
- the SQL INSERT statement: 在加载大量数据时低效,适用于小数据集。
- the COPY command: 可以自定义 the format of the text file 以解析成 columns and rows. 比 INSERT 快, 但是不是一个 parallel process.
gpfdist
andgpload
: 可以高效的将外部数据转储到数据表中。快速,并行加载。Administrator 可以定义single row error isolation mode
以继续加载格式正常的 rows。gpload
需要提前编写一个YAML-formated
control file, 用于描述 source data location,format, transformations required, participating hosts, database destinations, and others. 这允许你执行一个复杂的加载任务。
以下只演示 gpfdist
和 gpload
的使用:
gpfdist
gpfdist [-d directory] [-p http_port] [-l log_file] [-t timeout]
[-S] [-w time] [-v | -V] [-s] [-m max_length]
[--ssl certificate_path [--sslclean wait_time] ]
[-c config.yml]
示例:
Uses the gpfdist
protocol to create a readable external table, ext_expenses, from all files with the txt extension. The column delimiter is a pipe(|) and NULL (’ ') is a space. Access to the external table is single row error isolation mode. If the error count on a segment is greater than five (the SEGMENT REJECT LIMIT value), the entire external table operation fails and no rows are processed.
=# CREATE EXTERNAL TABLE ext_expenses ( name text,
date date, amount float4, category text, desc1 text )
LOCATION ('gpfdist://etlhost-1:8081/*.txt',
'gpfdist://etlhost-2:8082/*.txt')
FORMAT 'TEXT' ( DELIMITER '|' NULL ' ')
LOG ERRORS SEGMENT REJECT LIMIT 5;
To create the readable ext_expenses table from CSV-formatted text files:
=# CREATE EXTERNAL TABLE ext_expenses ( name text,
date date, amount float4, category text, desc1 text )
LOCATION ('gpfdist://etlhost-1:8081/*.txt',
'gpfdist://etlhost-2:8082/*.txt')
FORMAT 'CSV' ( DELIMITER ',' )
LOG ERRORS SEGMENT REJECT LIMIT 5;
以下是我的个人实验:
-
创建一个数据目录
~/Datasets/baike
, 将数据集baike_triple.txt
移动到该目录下。这里的数据集来自 CN-DBpedia, 包含 900万+ 的 百科实体 以及 6700万+ 的 三元组关系。其中 mention2entity 信息 110万+,摘要信息 400万+,标签信息 1980万+,infobox 信息 4100万+。大小约为 4.0 G。 数据实例如下:
"1+8"时代广场 中文名 "1+8"时代广场 "1+8"时代广场 地点 咸宁大道与银泉大道交叉口 "1+8"时代广场 实质 城市综合体项目 "1+8"时代广场 总建面 约11.28万方 "1.4"河南兰考火灾事故 中文名 "1.4"河南兰考火灾事故 "1.4"河南兰考火灾事故 地点 河南<a>兰考县</a>城关镇 "1.4"河南兰考火灾事故 时间 2013年1月4日
-
开启
gpfdist
后台:gpfdist -d ~/Datasets/baike -p 8081 > /tmp/gpfdist.log 2>&1 & ps -A | grep gpfdist # 查看进程号 30693 pts/8 00:00:00 gpfdist # 表示进程号为 30693
选项说明:
- -d directory: 指定一个目录,gpfdist 将从该目录中为可读外部表提供文件,或为可写外部表创建输出文件。如果没有指定,默认为当前目录。
- -p http_port: gpfdist 提供文件要使用的HTTP端口。默认为8080。
查看日志:
gt@vm1:~$ more /tmp/gpfdist.log 2020-01-13 02:49:38 30693 INFO Before opening listening sockets - following listening sockets are a vailable: 2020-01-13 02:49:38 30693 INFO IPV6 socket: [::]:8081 2020-01-13 02:49:38 30693 INFO IPV4 socket: 0.0.0.0:8081 2020-01-13 02:49:38 30693 INFO Trying to open listening socket: 2020-01-13 02:49:38 30693 INFO IPV6 socket: [::]:8081 2020-01-13 02:49:38 30693 INFO Opening listening socket succeeded 2020-01-13 02:49:38 30693 INFO Trying to open listening socket: 2020-01-13 02:49:38 30693 INFO IPV4 socket: 0.0.0.0:8081 Serving HTTP on port 8081, directory /home/gt/Datasets/baike
-
以
gpadmin
身份开启一个 psql session, 创建tables
:ext_baike
用于存放加载的数据,ext_load_baike_err
用于存放加载错误的日志。
psql -h localhost -d db_kg # 进入数据库 db_kg
# 创建外部表
CREATE EXTERNAL TABLE ext_baike (
head text, rel text, tail text)
LOCATION ('gpfdist://vm1:8081/baike_triples.txt')
FORMAT 'TEXT' (DELIMITER E'\t')
LOG ERRORS SEGMENT REJECT LIMIT 50000;
# 创建内部存储表
CREATE TABLE tb_baike (
id SERIAL PRIMARY KEY, head text, rel text, tail text);
创建外部表语法详细: CREATE EXTERNAL TABLE .
创建 外部表后,就可以直接从外部表读取数据了,例如:
db_kg=# select * from ext_baike limit 10;
head | rel | tail
-----------------+----------+---------------
*裔* | 中文名 | *裔*
*裔* | 作者 | Amarantine
*裔* | 小说进度 | 暂停
*裔* | 连载网站 | 晋江文学城
*西方犯罪学概论 | BaiduTAG | 书籍
*西方犯罪学概论 | ISBN | 9787811399967
*西方犯罪学概论 | 作者 | 李明琪 编
*西方犯罪学概论 | 出版时间 | 2010-4
*西方犯罪学概论 | 定价 | 22.00元
*西方犯罪学概论 | 页数 | 305
(10 rows)
-
将外部表数据导入到内部表:
INSERT INTO tb_baike(head, rel, tail) SELECT * FROM ext_baike;
由于 虚拟机的存储空间不足,最后运行失败。可以在日志中看到:
more greenplum/data/data1/primary/gpseg0/pg_log/gpdb-2020-01-13_000000.csv 2020-01-13 04:10:14.623480 UTC,,,p24832,th930718592,,,,0,,,seg0,,,,,"PANIC","53100","could not writ e to file ""pg_xlog/xlogtemp.24832"": No space left on device",,,,,,,0,,"xlog.c"
start: 15:33:30
abnormally end: 16:03
错误:
db_kg=# INSERT INTO tb_baike(head, rel, tail) SELECT * FROM ext_baike;
ERROR: gpfdist error: unknown meta type 108 (url_curl.c:1635) (seg0 slice1 127.0.1.1:6000 pid=15880) (url_curl.c:1635)
CONTEXT: External table ext_baike, file gpfdist://vm1:8081/baike_triples.txtLIMIT 10000;
start 16:10:00
end: 17:12:42
ERROR: interconnect encountered a network error, please check your network (seg3 slice1 192.168.5
6.6:6001 pid=11612)
DETAIL: Failed to send packet (seq 1) to 127.0.1.1:56414 (pid 15913 cid -1) after 3562 retries in
3600 seconds
Cost-based Query Optimizer
当master接受到一条SQL语句,会将这条语句解析为执行计划 DAG,将 DAG 中不需要进行数据交换的划分为 slice ,join,aggregate,sort 的时候,都会涉及到 slice
的重分布,会有一个 motion
任务来执行数据的重分布。将 slice 下发到涉及到的相关 segment 中。来源:GreenPlum:基于PostgreSQL的分布式关系型数据库