Greenplum TPC-H Cookbook

版本号

•Greenplum 6.15.0

环境

内网 3 台机器,每台 40 核 189 GB 内存 NVMe 3TB 磁盘,相互之间已配置好网络连接。

测试逻辑

Standalone 部署的 Greenplum 集群,一共 24 个 Segment 进程,每台机器 8 个。表采用 column orientation 创建,即采用 Greenplum 的列存模式来做性能测试。

测试步骤

搭建 Greenplum 集群

下载 Greenplum 6.15.0 RPM 安装包,上传到测试机器上安装。安装之前可能需要做相应机器特化的配置,具体可以参考官方文档[1],主要是跟网络和文件系统限制有关的配置。

RPM 安装包安装的流程很简单。

$ rpm -Uvh open-source-greenplum-db-6.15.0-rhel7-x86_64.rpm

安装完成后,创建 gpadmin 用户并修改安装目录的权限。这是因为 Greenplum 不允许以 root 用户运行。

$ groupadd gpadmin
$ useradd gpadmin -g gpadmin
$ passwd gpadmin
$ chown -R gpadmin /usr/local/greenplum-db*

这个步骤要在三台机器上重复运行,可以考虑编写流程脚本自动化。

修改成功后,以 gpadmin 用户身份执行后续操作。

首先配置环境变量,这个步骤可以加入到启动脚本中。

source /usr/local/greenplum-db/greenplum_path.sh

随后检查安装完整性,首先创建一个包含所有节点 hostname 的 hostfile_exkeys 文件。

h59
h82
h85

然后执行命令列出安装目录的文件。

$ gpssh -f hostfile_exkeys -e ls -l $GPHOME

如果安装成功,不需要用户手动输入其他节点的登录密码,就会显示出所有节点的安装目录。这些节点都应该拥有相同的安装目录,并且这些目录属于 gpadmin 用户。如果要求输入登录密码,就需要重新执行 ssh key 交换命令。

$ gpssh-exkeys -f hostfile_exkeys

接下来,在启动 Greenplum 数据库前需要初始化。

第一步是创建并配置 gpinitsystem_config 文件,这个文件可以从模板中复刻并做简单的修改。

$ cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config gpinitsystem_config

配置相关参数,其中必须修改的配置的参数如下。

declare -a DATA_DIRECTORY 行,指定了 Segment 节点的数据目录,也指定了该节点上会创建多少个 Segment 实例。•MASTER_HOSTNAME 行,指定了 Matser 的主机名•MASTER_DIRECTORY 行,指定了 Master 元数据的保存目录,后续大量操作需要配置的 MASTER_DATA_DIRECTORY 环境变量即该目录下的 Master 数据 Segment 目录,默认是 gpseg-1 目录。

第二步是创建 Segment 节点的主机名信息文件。

h59
h82
h85

第三步是运行初始化命令,其中 hostfile_gpinitsystem 是上述 Segment 节点的主机名信息文件。

$ gpinitsystem -c gpinitsystem_config -h hostfile_gpinitsystem

这样创建出来的集群是没有 Mirror Segment 也没有 Standby Master 的,对于性能测试来说,无需考虑太多的容错。

根据提示一步一步创建集群,成功后可通过 psql 实用工具访问 Greenplum 数据库,默认地有一个名为 template1 的数据库。

准备 TPC-H 数据

我们假设 TPC-H 数据已经生成为 Greenplum 可识别即 PostgreSQL 可识别的 CSV 文件,否则可以自行尝试生成数据,例如利用 dbgen[2] 或其他教程。

首先我们创建测试用的 tpch_100 数据库,随后执行 DDL 创建表。

CREATE TABLE IF NOT EXISTS nation  (
    N_NATIONKEY  INTEGER NOT NULL,
    N_NAME       CHAR(25) NOT NULL,
    N_REGIONKEY  INTEGER NOT NULL,
    N_COMMENT    VARCHAR(152)) 
    WITH (appendonly=true, orientation=column)
    DISTRIBUTED BY (N_NATIONKEY);

可以看到重点的不同是 WITH 语句和 DISTRUBUTED BY 语句。我们使用列存并指定主键为分区键。其他表的 DDL 可做相似处理或进一步调优。

随后进入 psql 实用工具,通过 PostgreSQL 的 COPY 语句加载数据。

tpch_100=# COPY part FROM '/path/to/nation.csv' DELIMITER '|' CSV;

类似地,加载全部 8 个表的数据。可以使用 COUNT 语句校验数据的完整性。

执行 TPC-H 测试

完成数据导入后,就可以通过正常的和 PostgreSQL 交互的方式发起查询请求执行测试了。

一行执行测试的命令参考如下。

$ psql -a -e tpch_100 > output.txt <<EOF
\timing on
SELECT 1;
EOF

查询语句替换为 TPC-H 的查询语句即可,可以编写脚本来自动化测试流程。

调优方面,Greenplum 默认的内存配置较小,可以修改 statement_mem 配置项调大内存,具体调优和配置方法可参考官方文档或其他分享。

最后附上一个 Perl 自动化脚本,里面假设了 Query 的位置、迭代的次数和输出的位置,可以相应改动适配自己的环境。

#!/usr/bin/env perl


use v5.10.1;
use strict;
use warnings;


use File::Spec ();
use FindBin ();


use Getopt::Long qw( GetOptions :config no_ignore_case);


GetOptions(
    "d|db=s", \(my $db = "tpch_100"),
) or usage(1);


usage(1) unless ($db);


my @queries = @ARGV;
if ( @queries == 0 ) {
    @queries = ( 1..22 );
}


my $q15 = <<'_EOC_';
create view revenue0 (supplier_no, total_revenue) as
    select
        l_suppkey,
        sum(l_extendedprice * (1 - l_discount))
    from
        lineitem
    where
        l_shipdate >= '1997-07-01'
        and l_shipdate < date '1997-07-01' + interval '3' month
    group by
        l_suppkey;


explain analyze select
    s_suppkey,
    s_name,
    s_address,
    s_phone,
    total_revenue
from
    supplier,
    revenue0
where
    s_suppkey = supplier_no
    and total_revenue = (
        select
            max(total_revenue)
        from
            revenue0
    )
order by
    s_suppkey;


select
    s_suppkey,
    s_name,
    s_address,
    s_phone,
    total_revenue
from
    supplier,
    revenue0
where
    s_suppkey = supplier_no
    and total_revenue = (
        select
            max(total_revenue)
        from
            revenue0
    )
order by
    s_suppkey;


drop view revenue0;
_EOC_


for my $i (1..3) {
for my $query ( @queries ) {
    if ($query < 1 || $query > 22) {
        die "$query should be in (1..22)";
    }


    print "Running TPC-H Query $query, iteration=$i...\n";    
    my $sqlpath = File::Spec->catfile($FindBin::RealBin, "query/$query.sql");
    my $sql = qx(cat $sqlpath);
    my $realquery = $query != 15 
        ? "explain analyze $sql" . "$sql"
        : $q15;
    my $cmd = qq(psql -a -e $db > turn$i/q${query}.txt <<EOF\n\\timing on\n$realquery\nEOF);
    my $rc = system($cmd);
    print "rc=$rc\n";
}
}


sub usage {
    my $rc = shift;
    my $msg = <<_EOC_;
gptpch [options] [query|...]
_EOC_


    if ($rc == 0) {
        print $msg;
        exit(0);
    }


    warn $msg;
    exit($rc);
}

References

[1] 官方文档: https://docs.greenplum.org/6-8/install_guide/prep_os.html
[2] dbgen: http://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值