基于数据分组方法的数据仓库并行预计算和查询(10)
作者:佚名; 更新时间:2014-12-05
操作方式和文件夹名称发送到每个相应的进程中,如图6.6所示。同时,在从进程中运行的DispatchWorker也调用了recvConfig()。主从进程间通过MPI的点对点通信,完成配置数据的发送和接收。DispatchWorker接收完配置数据之后,将配置数据存如pConfig里。

  在完成配置数据的交互之后,DispatchWorker将会利用收到的数据,如元组条数、维度数和度量值数来决定该分配多大的内存空间以存下将要收到的数据,并开始等待接收数据。而DispatchManager则会调用loadData()来将数据文件载入内存。

  DispatchManager在loadData()时是将数据存入两个长度分别为iDimNum*iTupleNum和iMsrNum*iTupleNum的一维数组中,它们分别是pDimData和pMsrData。与串行预计算程序中的Cubing作用类似,DispatchManager会在载入数据的同时完成映射的工作。但当DispatchManager准备好要发送到其中一个从进程的数据之后,它便会调用sendData(),指明将要发送的进程号,将数据发送出去。如图6.7所示。

基于数据分组方法的数据仓库并行预计算和查询

图6.6     发送和接收配置数据示意图

基于数据分组方法的数据仓库并行预计算和查询

图6.7     发送和接收数据示意图

  在每个从进程都接收完数据和主进程完成loadData之后,每个进程都会有装着维度数据和度量值的两个一维数组。在并行程序的Cubing中,由于不再需要与文件打交道,所以将Cubing::loadData()重载,将它的输入参数由数据文件名改为文件夹名称、pDimData、pMsrData和pAggFun。在这个函数中,Cubing将会把pDimData和pMsrData这两个一维数组的数据读出,存成二维数组。这样,数据发送过程已经完结,预计算开始之前的数据准备工作已经完成,接下来便是各个进程调用QuotientCube里的preCompute()函数,开始预计算工作。接下来在每个进程中的工作情况,和串行环境下的情况一致。

  6.3   串行查询程序结构

  在串行查询程序中,同样也有DFHandle和TupleHandle这两个辅助类。实现查询功能主要由以下三个类完成:AggStorage、CloseCubeQuery、QueryComputation。它们的类图如图6.8所示。

基于数据分组方法的数据仓库并行预计算和查询

图6.8     查询程序类

  AggStorage类的主要功能是面向立方体数据的操作。它封装了读入预计算所产生文件的方法,如loadMapData是将map文件读入,用来映射查询语句。loadAggData用来将某一层立方体文件内容读进内存。

   串行查询程序首先会通过QueryComputation::getQueryRecord()将查询语句批量地读入,存在QueryRecords里,然后调用CloseCubeQuery::Query()。在CloseCubeQuery::Query()中,程序通过aggStorage所实例化的AggStorage对象将映射关系文件读入,并调用MapStoI()将查询语句映射为整型数组。映射后的查询语句存在tqryobj中,然后将tqryobj中的内容,一次一条地递交给pointQuery()进行查询。大致的流程如图6.9所示。

基于数据分组方法的数据仓库并行预计算和查询

图6.9  串行查询流程

       pointQuery首先会确定该条查询语句的层次,然后判断该层次的数据是否已经载入内存,如果没,则调用AggStorage::loadAggData()将其载到内存中。然后开始顺序扫描各条上界,使用isCovered来判断该上界是否被查询语句所覆盖。如果扫描完一层还找不到所覆盖的上界,则继续扫描下一层文件。具体流程在本文4.3节。

  6.4   并行查询

  在并行查询程序中,增加了两个类,分别是QueryManager类和QueryWorker类。串行程序中的QueryComputation类被取消,它的功能将在QueryManager类中实现,CloseCubeQuery中的MapStoI()函数也放在QueryManager类中实现。图6.10中所示为QueryManager类和QueryWorker类的类图。

  6.4.1 QueryManager类和QueryWorker类

  并行查询程序首先会在主进程中调用QueryManager::loadQuery()来将查询语句全部存入内存queryRecords二维数组中。接着就是调用QueryManager::mapQuery()将查询语句映射成整型数组,存入QueryManager::pQuery中。与并行预计算程序类似,并行查询程序中,主进程也会预先将一些配置数据发送给从进程,其中包括了查询语句的条数、数据的维度和度量值数。从进程在接收完这些数据之后,做一些初始化工作,为即将发送过来的查询数据做准备。实现这个功能的是QueryManager::broadcastConfig()和QueryWorker::receiveConfig()。

  在配置数据发送完毕之后,便是开始发送查询数据,主进程调用QueryManager::broadcastQuery()将查询数据分发到各个从进程上,从进程接收完之后,将查询语句存入QueryWorker::pQuery中。

  结果的指针。主进程与从进程分别调用CloseCubeQuery::Query(QueryManager::pQuery, QueryManager::pQueryResults[0])和CloseCubeQuery::Query(QueryWorker::pQuery, QueryWorker::pQueryResult)开始进行查询工作。

基于数据分组方法的数据仓库并行预计算和查询

图6.10    QueryManager类和QueryWorker类

  查询的流程如图6.11所示,在Query()中的实现过程基本与串行程序过程一致。在查询完毕之后,各个从进程将会把存放着查询结果的数组,pQueryResult发送回主进程。主进程调用QueryManager::collectResults()将所有信息收集起来,并将其存在pQueryResults二维数组中。最后,QueryManager将会

核心期刊快速发表
Copyright@2000-2030 论文期刊网 Corporation All Rights Reserved.
《中华人民共和国信息产业部》备案号:ICP备07016076号;《公安部》备案号:33010402003207
本网站专业、正规提供职称论文发表和写作指导服务,并收录了海量免费论文和数百个经国家新闻出版总署审批过的具有国内统一CN刊号与国际标准ISSN刊号的合作期刊,供诸位正确选择和阅读参考,免费论文版权归原作者所有,谨防侵权。联系邮箱:256081@163.com