Some DPF notes
1、体系结构
1. DPF适合数据仓库和数据分析, 当数据量达到10T的时候Db2会遇到性能问题,考虑使用DPF
2. 做数据仓库好的产品:Teradata/Greenplum/Netezza(都是一体机) DPF
3. CAP:(一致性,高可用性,分区)只能达到两条,(高可用/分区独立性不可兼顾),DPF(MPP)只能解决CP,不能解决高可用性。
4. sql-->nosql(not onlysql)-->newsql(在hadoop之上写的sql)
5. purescale是一个集成架构,使用客户不多,有一些问题,实验室已经快放弃对其支持.
6. nfs优缺点,优点:稳定,成本低。缺点:1)因为是主从,如果server出问题,那client不能用,2)数据不能放nfs上。
7. 徐做过测试,db210.5blue性能还不如DPF
8. 多分区架构特点:
Share-nothing的体系结构
每个分区有自己的存储、bufferpool、锁
无限扩展能力(最多999个节点)
并行计算处理
适合数据仓库和数据分析
2、DPF数据库对象
1. db2 oralce teredata,orace强项在交易,db2在分析(查询快)
2. 建索引是: 新版本是32k
3. 根据分区键字段value的hash值找到对应的分区。
4. dpf最影响性能的因素: 分区键,IO规划(DPF怎么建,储存怎么映射),sql语句
5. 常规单分区:实例,库,表空间,表
DPF: 实例,库,分区组,分区,表空间,表
6. node和partition一样。dB2分区节点都是逻辑概念,aix上的airp可以对应
换了主机名(hostname)之后需要改db2nodes.cfg
/etc/service每个节点机器上都要有一份copy过去。
7. 实例路径:
node 0所在server上的实例路径被其他node所在server上通过nfs/gpfs所共享,实例目录可以通过 db2greg -dump得到(I: instance)
8. 实例启动:在0节点db2start
9. DPF节点配置文件db2nodes.cfg
Path: 实例路径下: $HOME/sqllib/db2nodes.cfg
0 bldbzt0084 0
1 bldbzt0085 0
2 bldbzt0085 1
3 bldbzt0085 2
4 bldbzt0085 3
5 bldbzt0085 4
6 bldbzt0085 5
7 bldbzt0085 6
8 bldbzt0085 7
第一列:node(partition)号. 一般0节点独占一个server,是主节点,负责分发数据,任务重,适合存放小表,字典表。其他节点被称为数据节点,放大表。
第二列:主机名字,hostname。如果主机名字做了修改,此处需要修改。
第三列:端口号port,每个server上有多少个node就必须分配多少个port,比如bldbzt0085上有1-8的8个节点,那port就是0-7的8个port,即单个server上每个node的port是唯一的。
(注:此处0--7是port的逻辑序号,具体port值在/etc/services中)
10. 查看当前节点:
db2 query client
CONNECT_MEMBER = 0
ATTACH_MEMBER = 0
则当前节点就为0,如果返回-1表示还没有指定node,如果没有设定,则默认为port0对应的node,
如上例,bldbzt0084上port0对应0节点,bldbzt0085server上port 0 对应node 1.即为他们的默认node
11. DPF对象体系结构:
实例-->数据库-->分区组(包含N个分区)-->表空间-->表
表空间建立在分区组中,表建在表空间中; 分区组包含一个或多个分区;
12. 数据分发
0节点:存放小表,字典表,因为0节点任务重,分发数据。
哈希函数根据分区映射图将数据散列到相关分区. 通过分区键的hash值去寻找对应分区, 比如分区键EMPNO=000120的hash值为9对应的分区为node1
13. 创建DPF分区组/表空间/表 (refer to Xu(2)DPF数据库对象.pdf)
分区组包含db2nodes.cfg里定义的分区
1) 创建分区组:
CREATE DATABASE PARTITION GROUP pg_data ONDBPARTITIONNUMS(1,2,3)
三个缺省的分区组:
IBMCATGROUP: 包含系统表空间,只在0节点
IBMTEMPGROUP:系统临时分区组,跨所有节点
IBMDEFAULTGROUP: 包含用户定义数据,跨所有节点
2) 表空间创建在分区组里,创建表空间:
CREATE TABLESPACE tbs_ods in database partitiongroup pg_data managed by database
USING (file '/data2/datats/cont1' 10M) ondbpartitionnum(1)
USING (file '/data2/datats/cont2' 10M) ondbpartitionnum(2)
USING (file '/data2/datats/cont3' 10M) ondbpartitionnum(3)
bufferpool bp_data;
3) 在表空间里创建表:
CREATE TABLE ORDERS
(ordernum int not null,
orderdate date not null)
DISTRIBUTE BY HASH (ordernum) intbs_ods
14. 查询数据在各个分区的分布倾斜情况
db2 "select dbpartitionnum(id), count(*)from ORDERS group by dbpartitionnum(id)"
15. 常见DPF查询命令
1) 查看分区个数:
db2 list DBPARTITIONNUMS
2) 查看分区组:
db2 list db partition groups [show detail]
3) 查看节点(同1)):
db2 list nodes
4) 查看当前节点:
db2 query client
-1表示默认节点(本server上port0对应的节点)
5) 切换分区节点:
export DB2NODE=2
db2 terminate
6) 查看启动的分区节点:
ps -ef|grep db2sysc
7) 列出某个表空间所在的分区:
db2 "select substr(b.tbspace,1,20) asTBSNAME, a.DBPARTITIONNUM as DB_PARTITION_NUM from syscat.dbpartitiongroupdefas a, syscat.tablespaces as b where a.DBPGNAME = b.DBPGNAME andb.tbspace = 'ESA_DIMS_INDX' "
8) 查看分区组包含的分区:
select * from syscat.dbpartitiongroupdef;
syscat.tablespaces 和syscat.dbpartitiongroupdef联合查询,能得到分区组对应的表空间的详细信息:
notes: 临时表空间显示不了,因为临时表空间在syscat.dbpartitiongroupdef中没有存储.
16. DPF表空间备份
db2 "backup dbesadm on all dbpartitionnums tablespace (ESA_PMHIST_P) online to/dev/null"
可用于fix表空间backuppending,用于对一个表空间ESA_PMHIST_P分布在不同的node上的情况。
17. 分区特性建表语句对比
CREATE TABLE 语句中的子句 | DB2 特性名称 |
DISTRIBUTE BY HASH | DPF —— 数据库分区特性 |
MDC —— 多维聚类 | |
PARTITION BY RANGE | TP —— 表分区 |
e.g.
1) table partition – 表分区
Create table TP_ATABLE(
…
)INDEX IN "ESA_PMHIST_IDX_P" PARTITION BYRANGE("DATA_PERIOD_KEY", "CRM_INSTANCE_CODE")
(PART "WEEK20090128_EM" STARTING(3495,'30')ENDING(3495,'30') IN "ESA_PMHIST_P",
PART"WEEK20090128_AM" STARTING(3495,'AM') ENDING(3495,'AM') IN"ESA_PMHIST_P",
PART"WEEK20090128_AP" STARTING(3495,'AP') ENDING(3495,'AP') IN"ESA_PMHIST_P",
2) DPF — 数据库分区
…
) COMPRESS YES ADAPTIVE
DISTRIBUTE BYHASH("DATA_PERIOD_KEY") in ESA_SUM;
3)DPF/TP ---同时是数据库分区和表分区
Create table DPF_TP_ATABLE(
…
) COMPRESS YES ADAPTIVE
DISTRIBUTE BYHASH("DATA_PERIOD_KEY")
INDEX IN"ESA_SUM_IDX" PARTITION BY RANGE("DATA_PERIOD_KEY","GEO_KEY")
(PART"WEEK20090128_AM" STARTING(3495,51) ENDING(3495,51) IN "ESA_SUM",
PART"WEEK20090128_AP" STARTING(3495,52) ENDING(3495,52) IN"ESA_SUM",
PART"WEEK20090128_EM" STARTING(3495,53) ENDING(3495,53) IN "ESA_SUM",
3、分布键设置注意事项
1. 分布键设计原则
一.分区键必须确保数据分布均匀,选择不同值基数比较大的字段
二.分区键必须作为主键或唯一索引的一部分
三.尽可能使用尽量少的字段作为分区键,最好选择1个字段作为分区键
四.频繁join的一些字段作为备选
五.考虑所有表中哪些字段包含的最多,比如对于银行业务来说,账号、卡号或客户号可能是用的最多的字段
六.根据业务类型确定合适的分布键,主键最好和业务场景有关联
七.避免选择时间、短字符串、值域窄(如交易类型)类字段
八.适合作为分区键的数据类型,int>char>decimal
2. 分布键对性能问题的影响
一.如果join条件使用的是两个表的分布键,join会分别在各个分区内进行,结束后对结果进行汇总。这样每个分区处理的都是小数据量的join,可以产生最佳的性能。
二.Join条件使用了其中一个表的分布键,另外一个表会按照使用表的分布键进行定向重新分布。
三.Join条件没有使用任何一个表的分布键,DB2会选择其中一个小表做广播,将数据在每个节点都复制一份,这种方式对资源的消耗最大,也是最差的场景,必须想办法避免。
3. 考虑因素
一.设计数据库分布键后的数据分布情况
二.SDM层到FDM层的ETL过程,尽量在分区内进行
三.应用程序或下游系统抽数时多表关联的连接条件
四.当前表的分布键设计要支持即将上线的系统,如GDM
五.确保查询连接再各自分区内完成,充分发挥DPF的优势
六.尽量为所有表都定义主键
七.优先完成FDM层的分区键设计
八.根据映射关系选择SDM层的表分区键
4. 针对ODS平台现状的分布键设计
1.单字段主键的表,主键作为分布键;
2.多字段作为复合主键的表,选择一个作为分布键
3.无主键的表,结合业务和数据分布规则,确定分布键
4.数据量小的代码表放在单分区,大于5万行数据的代码表放在多分区
5.汇总类的、数据量较小的报表,建议放在单分区
5. ETL程序中临时表的分布键选择
一.基本规则与普通表的分布键选择方式相同
二.简单情况下,临时表的分布键与原表的分布键相同
三.如果临时表是通过几张表关联而来,分布键选择有所不同
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26224914/viewspace-2122327/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26224914/viewspace-2122327/