gpfdist的工作原理及性能优化
4,675 total views, 3 views today
在 《Greenplum数据加载方式(2) – 外部表(gpfdist)》 和 《Greenplum数据加载方式(3) – gpload》 两篇文章中都使用到了gpfdist。本篇文章将详细介绍gpfdist的工作原理;Greenplum主要适用于大数据场景,数量都是TB级别,那么利用gpfdist加载数据必须要高效,因此gpfdist的性能优化也很重要。
一、工作原理
<1>启动gpfdist,并在Master上建表。表建好后并没有任何数据流动,只是定义好了外部表的原始数据信息。
<2>将外部表插入到一张Greenplum的物理表中,开始导入数据。
<3>Segment根据建表时定义的gpfdist url个数,启动相同的并发到gpfdist获取数据,其中每个Segment节点都会连接到gpfdist上获取数据。
<4>gpfdist收到Segment的连接并要接收数据时,开始读取文件,顺序读取文件,然后将文件拆分成多个块,随机抛给Segment。
<5>由于gpfdist并不知道数据库中有多少个Segment,数据是按照哪个分布键拆分的,因此数据是随机发送到每个Segment上的,数据到达Segment的时间基本上是随机的,所以外部表可以看成是一张随机分布的表,将数据插入到物理表的时候,需要进行一次重新分布。
<6>为了提高性能,数据读取于与重分布是同时进行的,当数据重分布完毕后,整个数据导入流程结束。
二、gpfdist最主要的功能
<1>负载均衡:每个Segment分配到的数据都是随机的,所以每个节点的负载都非常均衡。
<2>并发读取,性能高:每台Segment都同时通过网卡到文件服务器获取数据,并发读取,从而获取了比较高的性能。相对于copy命令,数据要通过Master流入,使用外部表就消除了Master这个单点问题。
三、如何提高gpfdist性能
Greenplum数据导入,容易出瓶颈的2个地方。
<1>文件服务器
因为所有Segment都连接到文件服务器上获取数据,所以如果文件服务器是单机的,那么文件服务器很容易在磁盘IO和网卡上出现性能瓶颈。
<2>Segment节点
Segment节点比文件系统要多不少,Segment一般不会出现磁盘IO和网卡性能问题。当Segment出现瓶颈时,数据导入引起的瓶颈可能性极小,更多的是整个数据库的性能都出现了瓶颈。
四、如何提高文件服务器性能
<1>IO出现瓶颈。考虑使用磁盘阵列,也可以采用分布式文件系统来提高整体性能,如MooseFS。
<2>网卡出现瓶颈。第一种方法:换成万兆网卡,这种方式成本很高,因为还需要万兆交换机等。第二种方法:通过多网卡机制来解决网络带宽瓶颈。
例如:
1 2 3 4 5 6 7 |
CREATE EXTERNAL TABLE table_name (column_name date_type [,...] like other table) LOCATION ('gpfist://filehostip1[:port1]/file_pattern1', 'gpfist://filehostip2[:port2]/file_pattern2', 'gpfist://filehostip3[:port3]/file_pattern3', 'gpfist://filehostip4[:port4]/file_pattern4' ) |
我们可以只启动一个gpfdist,通过不同ip连接到gpfdist上,这样文件的gpfdist只有一个,不能实现IO并发,但是网卡可以使用多张,从而消除网卡瓶颈。