`
yangyangmyself
  • 浏览: 233301 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

GreenPlum上手指南

阅读更多

简介

    Greenplum应用在OLAP领域,MPP架构,其底层使用Postgre,支持横向扩展,支持行存储、列存储,支持事务、ACID。

MPP数据库主打share nothing,即各节点间任何资源都不共享,从硬件的CPU/内存/网络/存储,到上层的操作系统,各节点都是独立的;节点间的交互主要通过网络进行通信。由于数据量越来越大,OLAP产品多采用MPP架构,例如阿里的ADS,百度的Palo。 相对于MPP,也有Oracle RAC这种share everything架构,各节点共享存储、内存客户互相访问。SMP由于只能使用一个节点,容易受到具体硬件的限制,但支持事务的效率比较高(不需要跨节点通信);MPP扩展性好,更适应big data的场景,但多数MPP数据库不支持事务、ACID(例如阿里云ADS)。MPP数据库需要仔细设计数据的存储,避免出现大量的节点间shuffle通信,否则效率极低。

关于GP的架构分析,可以参考这篇文章

    Greenplum在2015年已经开源,Apache 2.0协议,源码可以访问Github。GP使用C语言,据说其代码非常漂亮。不过Greenplum的开源并不彻底,没有包含其新一代优化器orca(核心资产,咳咳)。不过从一些测试结果来看,开源版本与商业版本的性能差别不大,后面我们可能看到很多基于Greenplum包装的OLAP产品。

 

    GP的架构是典型的Master-Segments,主控节点和计算节点分离,类似HDFS。


     Master中只提供接入服务和元数据存储,用户实际数据存储在Segments中。GP使用UDP通信,但在UDP之上做了确认机制。没有使用TCP的原因是,TCP会限制最多1000个Segments(为什么呢?)。但从阿里实际使用的情况来看,UDP并不稳定,他们还是改用了TCP。

  创建表时,需要指定distributed by(类似ADS的分区列,可以指定单列或多列,据此判断数据分布到哪个Segment)。如果不指定则使用第一列(吐槽下这个特性,建表这种频率很低的事情不应该以方便为主,而应该强制要求,避免用户不熟悉出错)。

 

createtable faa.d_airports (airport_code text, airport_desc text) distributed  by (airport_code);·

         插入时,根据规则(如hash),不同主键的数据分配到不同的Segment存储。GP的hash算法可以做到数据基本均匀分布到各个Segment。GP也可以配置为数据随机分布到各个Segment。

         查询时,由Master根据当前的Segments情况生成SQL执行计划,交给各个Segment执行;Master汇总各Segment执行结果,并返回给client 



    但是GP的查询会发生shuffle。

 数据装载时,使用gpfdist直接从外部数据源并行拖到Segments上,并且各Segments下载时并不是只下载自己的数据,而是先下载,发现不是自己的数据,再丢给正确的Segment。并行装载号称1小时2TB



 

Segment支持横向扩展。

安装

Greenplum在其官方网站提供了用于RHEL(CentOS)SuSE的版本。

我的环境使用了3台虚拟机:1M+2S,虚拟机安装CentOS6.5,安装步骤参考这篇文章,非常详细。不过我这出过一个错误,免密码打通的时候,root没成功,后面手工配置的(比较奇怪,必须使用下面的命令来copy公钥,不能拷贝方式)。 

ssh-copy-id -i .ssh/id_rsa.pub root@your_remote_host

HA

GP支持为MasterSegment配置Mirror以提供高可靠性。

Master->Mirror:使用postgre的日志同步功能。可以在部署时配置,也可以在Master运行时配置。


 

Segment->Mirror:如下图,一个Segment host可以配置多个Segment instance;以一个DB为例,配置mirror后,某一Segment instance会在另一Segment host上提供mirror instance



 相比GPADS的计算节点(类比Segment)可以2个实例同时工作,一定程度上可以提高查询性能。ADS管控节点(类比Master)也是单独的实例(主备),但以进程的形式存在,并不需要同步。GPHA设计的不算太好,以Segment为例,默认HA策略是切换为Read-only,即只能读不能写;如果HA策略是continue,仍然可以读写,但当故障节点恢复后,最终需要重启GP集群。(能忍?)

更多详细HA信息,移步到GP官网

使用

安装完毕后,用户可以使用Postgre SQL的客户端来访问Greenplum;一些BI系统可以直接对接。

特性

1. Append only table

2. column oriented table(列存表)

3. Append only table可以压缩

CREATETABLE bar (a int, b text)

WITH (appendonly=true, orientation=column) DISTRIBUTED BY (a);

CREATETABLE foo (a int, b text)

WITH (appendonly=true, compresstype=zlib, compresslevel=5);

4. 分区表(partition)

可以指定某一列的按range分区。如下例,表中2008年的数据都会根据date每天建立一个分区。

CREATETABLE sales (id int, datedate, amt decimal(10,2))

DISTRIBUTED BY (id)

PARTITIONBY RANGE (date)

( START (date'2008-01-01') INCLUSIVE END (date'2009-01-01') EXCLUSIVE EVERY (INTERVAL'1 day') );

这一点ADSGP不同。以ADS为例,其一级分区与GP是类似的,是按照分区列hash到不同的节点;而二级分区不同,ADS实际是一种指定,上传一批数据时,额外指定其时间属性,该列并不在上传数据中。 GP的分区表应该能提高查询性能,例如查询时where条件为between..and,由于已经建立了分区,大部分数据可以迅速索引到。而ADS是自行建立了列索引,不需要用户干预。

5. 数据可以重分布

若前期由于数据分区不合适造成数据倾斜,还可以重分布,其实就是数据搬移。但重分布代价较高,尽量在设计表时就确定好分区列。

查询详解

GP会将查询分为一个一个的slice,并分配到各个segment执行。举个例子。

先创建测试表及测试数据。GP/Pg支持直接生成测试数据,不得不说这个功能实在是太暖心了,特别是在POC的时候。

createtable t1(id intprimarykey,cn int,name varchar(40)) distributed by (id);

createtable t2(id intprimarykey,cn int,name varchar(40)) distributed by (id) ;

createtable t3(id intprimarykey,cn int,name varchar(40)) distributed by (id) ;

insertinto t1 select generate_series(1,1000000),generate_series(1,1000000),generate_series (1,1000000);

insertinto t2 select generate_series(1,1000000),generate_series(1,1000000),generate_series (1,1000000);

insertinto t3 select generate_series(1,100),generate_series(1,100),generate_series(1,100);

GP在scan、group by等基础上,增加了motion。motion是指查询过程中涉及其他segment的数据在各个节点间移动。主要有三种:

  Broadcast Motion(N:N),即广播数据,每个节点向其他节点广播需要发送的数据。

  Redistribute Motion(N:N),重新分布数据,利用join的列值hash不同,将筛选后的数据在其他segment重新分布。

  Gather Motion(N:1),聚合汇总数据,每个节点将join后的数据发到一个单节点上,通常是发到主节点master

1. 最简单的全表scan、聚合、motion

postgres=# explain select count(*) from t1;

 Aggregate  (cost=13863.86..13863.87 rows=1 width=8)

   ->  Gather Motion 2:1  (slice1; segments: 2)  (cost=13863.80..13863.84 rows=1 width=8)

         ->  Aggregate  (cost=13863.80..13863.81 rows=1 width=8)

               ->  Seq Scan on t1  (cost=0.00..11360.24 rows=500712 width=0)

 Optimizer status: legacy query optimizer

 

postgres=#  select count(*) from t1;

 1000000

说明:

  cost只该操作返回第一行的时间,比如seq scan的cost总是0,但Aggregate集约函数的cost较大,因为得先合并。

  rows为该操作影响到的行数。由于我的环境有2个segment,所以差不多一个是50W左右倒着往上看(废话)

本例中最终所有结果汇总到了master

2. 根据分区列做聚合

如下,id即为表t1的分区列,数据进GP的时候就已经按照id分配到了不同的segment,所以聚合时只要各个segment简单相加即可。

postgres=# explain select id,count(*) from t1 group by id;

                                        QUERY PLAN

-------------------------------------------------------------------------------------------

 Gather Motion 2:1  (slice1; segments: 2)  (cost=19447.91..35046.26 rows=1001424 width=12)

   ->  HashAggregate  (cost=19447.91..35046.26 rows=500712 width=12)

         Group By: id

         ->  Seq Scan on t1  (cost=0.00..11360.24 rows=500712 width=4)

 Optimizer status: legacy query optimizer

(5 rows)

3. 非分区列做聚合

postgres=# explain select name,count(*) from t1 group by name;

 Gather Motion 2:1  (slice2; segments: 2)  (cost=69888.29..88359.38 rows=1001424 width=106)

   ->  HashAggregate  (cost=69888.29..88359.38 rows=500712 width=106)

         Group By: t1.name

         ->  Redistribute Motion 2:2  (slice1; segments: 2)  (cost=16367.36..48913.64 rows=500712 width=106)

               Hash Key: t1.name

               ->  HashAggregate  (cost=16367.36..28885.16 rows=500712 width=106)

                     Group By: t1.name

                     ->  Seq Scan on t1  (cost=0.00..11360.24 rows=500712 width=6)

 Optimizer status: legacy query optimizer

 

name不是分区列,因此需要各segment处理完本地数据后,再根据namehash distribution,重分布。

4. 大小表

postgres=# explain select t1.id,t1.name,t3.name from t1,t3 where t1.cn=t3.cn;

                                            QUERY PLAN

---------------------------------------------------------------------------------------------------

 Gather Motion 2:1  (slice2; segments: 2)  (cost=8.50..13873.80 rows=101 width=12)

   ->  Hash Join  (cost=8.50..13873.80 rows=51 width=12)

         Hash Cond: t1.cn = t3.cn

         ->  Seq Scan on t1  (cost=0.00..11360.24 rows=500712 width=14)

         ->  Hash  (cost=6.00..6.00 rows=100 width=6)

               ->  Broadcast Motion 2:2  (slice1; segments: 2)  (cost=0.00..6.00 rows=100 width=6)

                     ->  Seq Scan on t3  (cost=0.00..3.00 rows=50 width=6)

 Optimizer status: legacy query optimizer

(8 rows)

GP选择将t2全表扫描后,广播给所有节点,然后在各节点上做hash join(就是where ..)。相比之下ADS的做法更聪明(当然也更粗暴),为了避免大量的网络通信(小表也是表啊),ADS将此类小表定义为维度表,每个物理节点一份,这样做join的时候直接读取即可,连broadcast都不需要。

 

  转自:http://www.datastart.cn/tech/2016/03/11/greenplum.html

 

  • 大小: 53.2 KB
  • 大小: 98 KB
  • 大小: 64 KB
  • 大小: 17.8 KB
  • 大小: 94.4 KB
分享到:
评论

相关推荐

    GreenPlum部署指南.docx

    ### GreenPlum部署指南知识点详解 #### 章节一:介绍Greenplum - **Greenplum数据库架构**:Greenplum采用大规模并行处理(MPP)架构,特别适用于处理大规模数据仓库和商业智能任务。MPP架构意味着系统包含多个...

    GreenPlum部署指南

    GreenPlum 部署指南 本指南旨在帮助用户了解 GreenPlum 的部署方式,包括预估存储容量、系统环境配置、安装前环境配置、安装 GreenPlum、检查批量安装情况、创建数据存储区域、验证系统环境、验证硬件性能、字符集...

    greenplum-database管理员指南6.0.0.pdf

    Greenplum Database管理员指南6.0.0版本是一个面向数据库管理员的权威文档,旨在帮助他们了解、安装和管理Greenplum数据库系统。这份指南涵盖了Greenplum数据库架构、分布式数据库概念、角色权限管理、客户端认证...

    Greenplum Database管理员指南6.2.2.pdf

    文档《Greenplum Database管理员指南6.2.2.pdf》是Greenplum数据库管理员的重要参考手册,它提供了关于如何管理和优化Greenplum数据库系统的详细指导。 文档中首先提到了一些基础术语和概念。例如,“Master”指的...

    Greenplum4.2.2管理员指南

    Greenplum4.2.2管理员指南是一本面向使用Greenplum 4.2.2版本的数据库管理员的技术手册,详细介绍了Greenplum数据库的管理、架构、特性、查询处理、权限管理、客户端认证、数据库访问、工作负载与资源管理等多个方面...

    Greenplum4.2.2管理员指南 中文版

    以个人经验来说,只要有其它关系型数据库的基础,尤其是POSTGRESQL或者INFORMIX基础的(因为GREENPLUM是在POSTGRESQL基础上开发出来的),很容就可以上手学习并掌握GREENPLUM。 GREENPLUM的手册写的非常好,完全可以...

    Greenplum4.2.2管理员指南 pdf

    Greenplum数据库管理员指南内容的翻译虽源于官方文档,但加入了译者的实践经验和心得。管理员在学习和应用指南内容时,应结合官方文档和自身对Greenplum的理解,科学地评估建议的实际适用性。在进行风险较高或关键性...

    Greenplum_安装指南--Linux

    Greenplum_安装指南-

    Greenplum-安装指南Linux(GP官方教材)-相当经典适用

    Greenplum-安装指南Linux(GP官方教材)-相当经典适用。

    greenplum管理员指南

    初步介绍greenplum,适合初学者,该文档浅显易懂,对greenplum进行了系统介绍

    Greenplum管理员文档

    Greenplum官方文档 Pivotal Software, Inc. believes the information in this publication is accurate as of its publication date. The information is subject to change without notice. THE INFORMATION IN ...

    DB2到GreenPlum/PostgreSQL的转换指南

    ### DB2到GreenPlum/PostgreSQL的转换指南 #### 1. 引言 ##### 1.1 目的 本指南旨在帮助用户理解从DB2迁移到GreenPlum或PostgreSQL过程中所涉及的关键技术和注意事项。由于这两种数据库系统之间存在显著差异,因此...

    GREENPLUM_5.1.4.zip

    《Greenplum数据库与Java连接实战指南》 在IT领域,大数据处理和分析已经成为不可或缺的一部分,而Greenplum作为一款高效、可扩展的并行数据库系统,被广泛应用于大规模数据仓库和数据分析场景。本文将围绕...

    greenplum/postgresql驱动包:greenplum-1.0.jar

    《Greenplum与PostgreSQL数据库驱动详解》 在IT领域,数据库管理系统的高效运作是支撑企业数据处理和服务的核心。本文将深入探讨Greenplum和PostgreSQL两种数据库系统,以及它们对应的驱动包`greenplum-1.0.jar`的...

    Greenplum数据库文档(中文版)

    该指南并不是教用户如何使用Greenplum数据库的每个具体特性,而是聚焦于提供成功设计、实施和使用Greenplum数据库所需的关键原则。 #### 数据模型设计 在设计数据模型时,应考虑Greenplum数据库的架构特点,即采用...

    GreenPLum6-1.pdf

    该指南还包含有关Greenplum数据库架构和概念(例如 并行处理)的信息。 Greenplum数据库概念 这一节给出了Greenplum数据库组件和特性的概述,例如高可用 性、并行数据装载特性以及管理工具。 管理一个Greenplum...

    greenplum学习好资料

    《Greenplum 学习指南:安装与配置详解》 Greenplum 是一款基于 PostgreSQL 的并行数据库管理系统,广泛应用于大数据处理和分析场景。本文将深入探讨 Greenplum 的安装与配置过程,帮助初学者快速掌握这一高效的...

    greenplum5.10.1官方文档

    Pivotal Greenplum 是一个开源的大规模并行处理(MPP)数据库管理系统,专门针对数据仓库和大数据分析工作负载而设计。它采用基于PostgreSQL的架构,并在此基础上加入了水平扩展和高可用性的特性。Pivotal Greenplum...

    greenplum的驱动

    《Greenplum数据库驱动详解与应用》 Greenplum,作为一个高效、可扩展的企业级大数据分析平台,广泛应用于数据仓库和大数据处理场景。其强大的并行处理能力与优秀的性能表现,使得众多企业和开发者青睐有加。本文将...

Global site tag (gtag.js) - Google Analytics