ApsaraDB For Greenplum试用指南

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 在ApsaraDB获取到一个GP实例后,会得到以下信息: - 连接地址 分为公网和私网,暂时不考虑VPC。私网地址只能通过阿里云ECS访问,公网地址则可以通过互联网上任一主机访问。例如: ``` 公网地址:mygpdbpub.gpdb.rds.aliyuncs.com:35

在ApsaraDB获取到一个GP实例后,会得到以下信息:

  • 连接地址

    分为公网和私网,暂时不考虑VPC。私网地址只能通过阿里云ECS访问,公网地址则可以通过互联网上任一主机访问。例如:
    
    公网地址:mygpdbpub.gpdb.rds.aliyuncs.com:3568 
    私网地址:mygpdb.gpdb.rds.aliyuncs.com:3432
  • 账号密码

    账号:mygpdb    
    密码:mygpdb

有了这些信息后,就可以连接到GP实例上进行相关的操作。

连接

GP目前基于的是PostgreSQL 8.3,完整支持PG 8.3的消息协议。因此,在各种操作下,与PG几无二致。

得益于PG 9.4消息协议的良好向后兼容性,所有基于PG 8.3以及之后的连接工具,大部分可以直接用于连接到GP,包括libpq、JDBC、ODBC、psycopg2、pgadmin III等。

GP官网提供了一个安装包,包含了JDBC、ODBC和libpq,方便安装和使用。请参考官方文档

psql && pgAdmin III

连接PG和GP,最为常用的莫过于psql和pgAdmin III了。psql是PG、GP安装后自带的类shell终端,可以执行所提供的诸多命令和SQL。以psql为例如:

$ ~/workspace/pgsql/bin/psql  -h mygpdbpub.gpdb.rds.aliyuncs.com -p 3568  -d postgres -U mygpdb
Password for user mygpdb: 
psql (9.4.4, server 8.3devel)
Type "help" for help.

postgres=> select version();
                                            version                                            
-----------------------------------------------------------------------------------------------
 PostgreSQL 8.3devel (Greenplum Database 4.3.99.00 build dev) compiled on May 10 2016 01:19:10
(1 row)

postgres=> 

其中,“-h”指定主机地址,“-p”指定端口号,“-d“指定数据库(默认的数据库是postgres),“-U”指定连接的用户。更多选项,通过“psql --help”可以看到。

在psql中,可以执行"?"查看更多psql中支持的命令。

pgAdmin III是图形客户端,相对简单,请参考中文版

JDBC

PostgreSQL的官方JDBC可以在这里下载到,下载之后加入到环境变量中即可。

代码案例:

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.sql.Statement;  
  
public class gp_conn {  
  
    public static void main(String[] args) {  
        try {  
            Class.forName("org.postgresql.Driver");  
            Connection db = DriverManager.getConnection("jdbc:postgresql://mygpdbpub.gpdb.rds.aliyuncs.com:3568/postgres","mygpdb","mygpdb");  

            Statement st = db.createStatement();  
            ResultSet rs = st.executeQuery("select * from gp_segment_configuration;");  
            while (rs.next()) {  
                System.out.print(rs.getString(1));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(2));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(3));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(4));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(5));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(6));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(7));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(8));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(9));  
                System.out.print("    |    ");  
                System.out.print(rs.getString(10));  
                System.out.print("    |    ");  
                System.out.println(rs.getString(11));  
            }  
            rs.close();  
            st.close();  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
}

详细文档请参考

ODBC

PostgreSQL的ODBC是以LGPL协议开源的版本,可以在这里下载到。

也可以参考德哥的博客,里面有更详细的方法和案例。

Python

Python连接GP和PG用的库是psycopg2。安装方法很简单:

yum -y install python-psycopg2

或者

pip install psycopg2

或者从源码安装

yum install -y postgresql-devel*

wget  http://initd.org/psycopg/tarballs/PSYCOPG-2-6/psycopg2-2.6.tar.gz
tar xf psycopg2-2.6.tar.gz
cd psycopg2-2.6
python setup.py build
sudo python setup.py install

安装后,设置PYTHONPATH,之后就可以引用,如:

import psycopg2

sql = 'select * from gp_segment_configuration;'

conn = psycopg2.connect(database='gpdb', user='mygpdb', password='mygpdb', host='mygpdbpub.gpdb.rds.aliyuncs.com', port=3568)

conn.autocommit = True
cursor = conn.cursor()
cursor.execute(sql)
rows = cursor.fetchall()

for row in rows:
    print row

conn.commit()
conn.close()

会得到类似以下的结果:

(1, -1, 'p', 'p', 's', 'u', 3022, '192.168.2.158', '192.168.2.158', None, None)
(6, -1, 'm', 'm', 's', 'u', 3019, '192.168.2.47', '192.168.2.47', None, None)
(2, 0, 'p', 'p', 's', 'u', 3025, '192.168.2.148', '192.168.2.148', 3525, None)
(4, 0, 'm', 'm', 's', 'u', 3024, '192.168.2.158', '192.168.2.158', 3524, None)
(3, 1, 'p', 'p', 's', 'u', 3023, '192.168.2.158', '192.168.2.158', 3523, None)
(5, 1, 'm', 'm', 's', 'u', 3026, '192.168.2.148', '192.168.2.148', 3526, None)

libpq

libpq是PostgreSQL原生支持用于连接PG的C库。在安装了GP或者PG之后,在其lib目录下可以找到其的静态库和动态库。这里有很多例子,此处不再列举。

详细的文档

常规操作

对GP的操作,整体与PG相较为一致,包括schema、类型支持、用户权限等。除了GP自身的一些特有的操作,如分布表、AO表等,其他操作皆可参考PG。

当前ApsaraDB For Greenplum对并没有开放DB实例的superuser权限,对应的则是rds_superuser,这一点与ApsaraDB For RDS(PostgreSQL)中的权限体系一致。

创建DB

Greenplum中创建DB的操作与PG相同,可以通过SQL来执行,如psql连接到GP后执行:

=> create database mygpdb;
CREATE DATABASE

=> \c mygpdb
psql (9.4.4, server 8.3devel)
You are now connected to database "mygpdb" as user "mygpdb".
mygpdb=> create extension postgis;
CREATE EXTENSION

创建分布表

在GP中,表是分布在所有的Segment上的,其分布规则是HASH或者随机。在建表的时候,指定分布键;当导入数据的时候,会根据分布键计算得到的HASH值分配到特定的Segment上。

=> create table vtbl(id serial, key integer, value text,  comment text) distributed by (key);
CREATE TABLE

当不指定分布键的时候(即不带后面的"distributed by (key)"),GP会默认对id字段以round-robin的方式进行随机分配。

分布键

分布键对于查询性能至关重要。均匀为分布键选择的第一大原则,选取更有业务意义的字段,并非必须选择原库的主键。参考中,《Greenplum 数据库最佳实践》做了很好的说明。

查询

构造数据:

  • 创建随机字符串生成函数和类型
CREATE OR REPLACE FUNCTION random_string(integer) RETURNS text AS $body$
SELECT array_to_string(array
                         (SELECT substring('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
                                           FROM (ceil(random()*62))::int
                                           FOR 1)
                          FROM generate_series(1, $1)), ''); $body$ LANGUAGE SQL VOLATILE;

CREATE TYPE cuboid AS (LENGTH integer, width integer, height integer);
  • 创建分布表和构造数据
CREATE TABLE tbl(id serial, KEY integer, value text, shape cuboid, locate geometry, COMMENT text) distributed by (key);

INSERT INTO tbl(KEY, COMMENT, shape, locate, value) SELECT KEY, COMMENT, shape, ST_GeomFromText(locate) AS locate, value FROM (SELECT (a.t + 1) AS KEY, random_string(ceil(random() * 24)::integer) AS COMMENT, row(ceil(random() * 36 + 49), ceil(random() * 6 + 99), ceil(random() * 12 + 199))::cuboid AS shape, 'POINT(' || ceil(random() * 36 + 99) || ' ' || ceil(random() * 24 + 50) || ')' AS locate, (CASE WHEN a.b = 1 THEN 'red' WHEN a.b = 2 THEN 'green' WHEN a.b = 3 THEN 'yellow' WHEN a.b = 4 THEN 'blue' END) AS value FROM (SELECT ceil(random() * 4) b, t FROM generate_series(0, 99999) AS t) AS a) AS t;
  • 查询
=> select * from vtbl where key = 13944;
   id   |  key  | value |    shape     |                   locate                   |    comment     
--------+-------+-------+--------------+--------------------------------------------+----------------
 113944 | 13944 | red   | (84,102,206) | 01010000000000000000405D400000000000C05140 | 22EaPlVqvfSgpq
(1 row)

Time: 513.101 ms
  • PG上的查询
=> select * from tbl where key = 13944;
  id   |  key  | value |    shape     |                   locate                   |   comment    
-------+-------+-------+--------------+--------------------------------------------+--------------
 13944 | 13944 | green | (55,105,207) | 01010000000000000000C05C400000000000004C40 | 3wQrCJqnHPds
(1 row)

Time: 1162.243 ms

在同样的表结构、记录数和没有添加任何索引的情况下,GP的查询要比PG的快一些。这个GP的实例是两个Segments,当记录数更多、Segments更多的时候,理论上差距会更明显。

参考

  1. Pivotal Greenplum官方文档
  2. ODBC编译
  3. ODBC下载
  4. JDBC下载
  5. 《Greenplum:你不可不知的实施与维护最佳实践》
  6. 《Greenplum 数据库最佳实践》
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
6月前
|
SQL 分布式计算 API
Apache Spark详解
Apache Spark 是一个开源、分布式计算引擎,专为大规模数据处理设计。它以高速、易用和通用为核心目标。通过内存计算、DAG 执行引擎和惰性求值等特性,大幅提升数据处理效率。其核心组件包括 Spark Core、Spark SQL、Spark Streaming、MLlib 和 GraphX,支持批处理、实时流处理、机器学习和图计算。Spark 提供统一编程模型,支持多语言(Scala/Java/Python/R),并拥有强大的 Catalyst 优化器和类型安全的 Dataset API,广泛应用于大数据分析和处理场景。
|
6月前
|
SQL 中间件 Go
开箱即用的GO后台管理系统 Kratos Admin - 后端项目结构说明
Kratos Admin 是一个开箱即用的 Go 语言后台管理系统,采用 Kratos 框架构建,提供清晰的项目结构与模块化设计。目录包含 API 定义、服务代码、配置文件、数据库初始化脚本及部署工具,支持 Docker 部署与自动化构建,便于快速开发和维护企业级应用。
238 0
|
Java Linux Apache
jar 解压app.jar到指定文件夹
要将 JAR 文件(如 `app.jar`)解压到指定文件夹,可使用 Java 自带的 `jar` 工具、Apache Ant、7-Zip 或 Python 脚本。方法包括命令行操作(如 `jar xf app.jar -C /path/to/destination/folder`)、Ant 构建文件、7-Zip 图形界面或命令行,以及 Python 的 `zipfile` 模块。选择适合的方法即可轻松完成解压。
1238 3
|
算法 数据可视化 数据挖掘
MATLAB中常用的数学函数及其应用示例
MATLAB中常用的数学函数及其应用示例
|
人工智能 小程序 前端开发
【uniapp小程序】uploadFile文件上传
上节中我们讲到小程序的request请求,掌握了基本的网络请求方式,这节我们通过小程序的uploadFile接口能力完成对小程序上传操作(uni.uploadFile,后端php接口),通过这一节你可以学习到php的上传接口的写法,以及如何配合前端完成一个小程序上传操作✨✨欢迎订阅本专栏或者关注我,大家一起努力每天一题算法题✨✨❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海!❤️❤️❤️。
1313 0
【uniapp小程序】uploadFile文件上传
|
物联网 监控 API
IoT平台设备标签功能和规则引擎组合最佳实践
助力设备管理,多维度检索,GIS展现
4151 0
|
存储 JSON JavaScript
Vue 2.x折腾记 - (8) 写一个挺靠谱的多地区选择组件
这个不是三级联动的地址组件,这是在这个基础需求上增加多地区选择的功能; 我也不想这么个玩意的,但是产品需求就是有这么个东东。 上基友社区找了下,又木有这类型的组件,只能自己动手丰衣足食了。 虽然过程遇到了许许多多的坑点,但总算是搞出来了。
463 0
|
存储 区块链 Python
以太坊中如何获取另外一个智能合约部署的合约地址?
如何获取另外一个智能合约部署的合约地址? 我正试图从另一个工厂合约中签智能合约,然后重新部署新智能合约的地址。然而,它返回的地址是交易哈希值而不是合约地址。
2497 0
|
网络协议 数据建模 网络安全
阿里云免费SSL证书申请教程及数量限制说明
阿里云提供免费SSL证书申请,阿小云来详细说下SSL免费证书申请教程,以及SSL免费证书数量限制说明
4934 1
阿里云免费SSL证书申请教程及数量限制说明
|
人工智能 物联网 大数据
考阿里云需要什么条件?考试难度大不大?
根据自家产品的特性和IT行业从业人员的岗位需求,阿里云将自己的认证分为了三个等级,分别是ACA、ACP和ACE三个,其中ACA是最简单的,ACE是最难的,ACP相对来说是中级,但是对于很多项目来说,ACP也可以相当于是高级了,因为ACE只有云计算一个认证,其他的很多都在ACP中。
686 0
考阿里云需要什么条件?考试难度大不大?