您的位置:首页 > 其它

DataStage 分区(Partition)

2014-06-01 16:58 148 查看
转自http://hi.baidu.com/developers/item/a76278ea706c1de3fa42ba82

随机分区和Same分区和完全分区

随机(Random)分区是DataStage的分区方法之一。随机分区是这样操作的:

DataStage将输入数据随机地分配到所有节点上。与循环分区类似,随机方法所产生的分区,各个节点上处理的数据也都大致相等。但与循环分区相比,随机分区需要的系统资源开销要大,因为这种方法在分区时,要为每条记录都生成一个随机值。相对循环分区来讲,开销自然要大。

Same分区是另一种分区方法,但也可以说它不是一种分区方法。它是这样操作数据的:

它什么也不做,仅仅将在前一个stage中已经分区过的数据,依然保留在同样的节点上,并不重新进行分区。因此,Same分区是最快的分区方法。

一般情况下,Same分区用于在各个stage之间传递数据。典型的比如Copy stage。

完全分区(Entire)也是一种比较特别的分区方法,它是这样操作数据的:

同一个stage的各个实例,在每个节点上的都能访问到全部的输入数据,也就是说数据并未分区,只是复制了几份分发到各个节点上。

这有什么用呢?可能有时候,每个节点都需要访问全部的输入数据,但是同时也想利用一下并行引擎,此时完全分区就是一个很好的解决方案。

        最有可能用到这种分区方法的就是Lookup stage。当Lookup的主输入被分区后,每个节点上都只有部分数据。但Lookup输入不能被分区,否则主输入上的数据就有可能在某个Lookup链接上找不到相应的数据,因此所有的Lookup输入都应该有完整的Lookup数据。这就是完全分区发挥作用的地方了。

 

哈希(Hash)分区

哈希分区是这样操作的:

对输入数据中每条记录的一个或者多个字段的值进行函数计算,得到一个哈希值,哈希值相同的记录被划分到同一个分区。用来计算哈希值的字段,称做哈希分区键。

哈希分区所产生的各个分区中,数据是否均匀,取决于所选取的分区键。比如在人口数据表中,如果选用邮编作为分区键,那么可能少数分区被分配了大量的数据,其他分区的数据则较少。这很容易产生瓶颈。

所以使用哈希分区时最关键的是分区键的选择。一般都不会选择只有少数几个值的字段作为分区键,比如性别,是否,对错等等,而应该选择数据中能产生大量分区的字段。这跟实际的数据紧密相关。

在进行分组和去重操作时,我们一般需要选择哈希分区,这可以保证相近的数据能分配到同一个分区。比如年龄同为30的人口数据,如果没有使用年龄作业分区键,在分组或者去重时,又使用年龄作为分组的关键字,那么最终计算出的数据肯定就是错的。

 

模数(Modulus)分区

模数(Modulus)分区与哈希分区非常类似,它是这样操作的:

取输入数据中的一个字段作为模,然后除以总的节点数,得到的余数即为分区号,再根据分区号将该行记录送入相应的分区中。

比如输入数据中有一整型字段,其中有四个值如下:44913,22672,90745,4703,总的逻辑节点为四个,44913除4余1,该行记录将被分配到partition 1中,22672除4余0,该行记录将被分配到partition 0中,90745除4余1,该记录也被分配到partition 1中,4703除4余3,该记录就被分配到partition 3中。

由此可见,模数分区方法所产生的分区也是非常不均匀的,有些分区甚至可能空缺,比如例子中的partition 2,有些分区则可能有很多数据,比如partition 1。

再有,模数分区所选取的模数字段,最好是整型,否则取模时弄出无数的小数,反倒有可能降低性能。

同哈希分区相比,模数分区与之有些类似,但是只支持一个字段作为关键字,关键字的选取也有较高求,同时算法也变得相对简单。

 

范围(Range)分区

范围(Range)分区范围分区与前面所讲的几种分区方法相比,有两个主要特点,一是需要为它指定分区键,另一个是它会尽量平均分配数据到各个节点上。指定分区键的操作与模数(Modulus)分区和哈希(Hash)分区相似,但后两者不能保证分区后数据的均匀性;随机分区(Random)和循环分区能保证数据的均匀性,但是这两者不能指定分区键。所以范围分区兼有两种分区方法的特点。

范围分区可以指定多个分区键,它的具体操作方法是按分区键所在的范围将数据尽量平均分配到各个节点上。但要使用这种分区方法,需要先使用一个名为生成范围对照表(Write Range Map)的stage生成一个范围对照表(Range Map),然后stage将依照这个对照表中的内容对数据进行范围分区。

这个生成范围对照表的stage原理非常简单,它使用Sample stage对源数据进行取样,以较小的数据量生成一个分区边界范围表,供需要使用范围分区的Stage使用。它只有一个输入链接。如下所示:



DB2分区和自动(Auto)分区

DB2分区和自动(Auto)分区这里的DB2分区并不是指对DB2表的分区,而是指对输入数据进行分区,只不过这种分区方法与DB2对表的分区方法是一样的,选用这种分区方法的同时,必须也指定相应的DB2表。

DB2对表具体如何分区,偶没有具体研究,在这里不好说。如果分区后输入数据是要更新某张DB2表,那么采用这种分区方法的话,不光是输入数据被分配到各个节点上,DB2表中的数据也被分配到相应的节点上,在并行引擎处理数据的过程中,输入数据和DB2表中的数据相对节点而言,都是本地数据,处理速度会非常的快。

       自动分区就没什么可说的了。这是平时开发作业时最普遍的分区方式了。DataStage将根据本身stage的类型和前一个stage所做的操作,决定一个最优的分区方案。一般情况下,对最初的输入数据一般采用循环分区(Round Robin)方法,而对于作业中除第一个Stage之外的其他Stage,一般就都采用Same分区了。

Round Robin分区

         将数据按一定的方式进行排序,并依照这种排序方式组条记录提取,组个放到分区里。比如有10000条数据,把这10000条数据分成3个分区,如果选择ROUND分区方法,DS就会把第一条数据放到第一个分区了,第二条记录放到第二个分区,第三条记录放到第三个分区,然后循环会来,第四条记录放到第一个分区,第五条记录放到第二个分区,依此类推。

 

重新分区

重新分区是指前一个Stage已经对数据进行了分区,但是该种分区不能满足下一个Stage的要求,因此这个Stage需要重新对数据进行分区。

比如一张客户信息表,前面是一个循环分区,但是下一个Stage需要按邮编对客户数进行统计,这就需要重新按邮编进行一个哈希分区。

很明显,重新分区会导致各个分区上的数据量不平衡。

可以换一种理解方式来说明重新分区的风险。比如你要将原来的四个分区,重新分配到三个分区中,在这种情况下,第一个分区的数据量将比剩余两个分区要多,即使最平衡采用循环分区方式也是如此。

这是因为DataStage将四个分区都当成一个独立的数据源,按照分区号依次将数据读取到新的三个分区中,并且总是从第一个分区开始写数,而不是接续上一个分区的写数位置。比如旧有的四个分区中各有四条记录,采用循环分区的方式重新分配到三个分区的话,第一个分区将会有两条(第1和第四条)进入新分区的第一个分区,剩余三个分区也是如此。最终,新分区的第一个分区将会有8条记录,而新分区的第二和第三个分区则各有4条记录。

如果将四个分区的数据采用循环分区方式重新分配到五个分区中,则新分区间的数据会更加不平衡,因为新分区的前四个分区与旧分区中的数据是完全一样的,但是最后一个分区的数据量则为0。

再考虑前面的客户信息表的例子,我们可以认为按照邮编进行哈希分区得到的分区数量将比原有分区要多。由于哈希分区的处理方法与循环分区不同,可能新分区不会出现数据量为0的情况,但各个分区间的数据平衡也是无法保证的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  datastage 分区