OGSA-DAI 4.1版本新增特性

数据网格访问集成中间件OSGA-DAI为科学数据共享工程提供了分布式的多源数据库查询能力,最新的4.1版本已经发布,新版本更新的特性如下:

  • 能够以新增的TupleToByteArrays行为,将关系型数据转换为二进制格式从服务端传输至客户端,新增的行为较之原有以文本方式传输数据的WebRowSet更为高效,同时避免了转换过程中的信息丢失。目前DQP中默认使用二进制格式进行数据传递;
  • TupleToByteArrays行为允许关系型数据在客户端以JDBC结果集的形式被提取;
  • 支持面向语义网应用的Jena SDB数据库查询,允许使用专为RDF开发的查询语言和数据获取协议SPARQL来查询W3C定义的RDF资源;
  • 在OGSA-DAI面向Web服务提供的数据访问与集成组件WS-DAIR中,加入通用的SQLStatement行为,以提供SQL查询、更新和存储操作;
  • 在DQP提供的函数中增加求模运算;
  • 针对OGSA-DAI Axis版本,默认使用HTTP Keep-Alive功能来保证客户端到服务器端的连接持续有效,并优化了客户端工具与服务端的交互效率。

在OGSA-DAI 4.1版本的新特性中,通过新增的TupleToByteArrays行为支持二进制格式的数据传递,无疑是一项重要的改进。尤其是在访问地理空间数据库过程中,以BLOB字段存储空间位置的WKB格式,无需在获取时将二进制格式转换为文本形式的WKT格式以WebRowSet行为传递,而直接将二进制WKB格式传递至客户端进行渲染或处理,极大增强了空间数据传输的执行的效率。

OGSA-DAI项目以Apache 2.0协议开放源代码,感兴趣的朋友可以进一步查看4.1版本的更新说明,并访问OGSA-DAI文档获取更细节的内容。

OGSA-DAI 4.0新增特性

OGSA-DAI分布式数据源访问与集成中间件包含的工作流引擎能够完成数据资源的访问、更新、传输、联合与交付工作,其最新的4.0版本已经释出。在这个里程碑中,OGSA-DAI新增特性如下:

  • 增加OGSA-DAI SQL Views组件,能够与数据库视图交互进行读取操作。SQL Views在实现上多处使用了与DQP相同的SQL解析器;
  • 集成高级数据挖掘与集成项目ADMIRE为DAI提供的通用行为。对于返回的一系列结果元组,允许使用脚本语言完成元组的连接或转换操作;
  • 支持使用Apache Commons DBCP同基于JDBC的关系型数据资源建立连接,通过Commons-Pool创建与数据服务之间的连接对象,并访问数据资源;
  • 数据接收器和数据源操作支持顺序数,在网络中断的情况下允许客户端重新同步;
  • DAI数据接收器和数据源支持非阻塞读写操作;
  • 增加OGSA-DAI工作流的执行情况跟踪页面;
  • 提供服务器文件缓存行为,能够将缓存数据写入服务端文件保存,并提供RESTful形式的访问接口;
  • 给出将OGSA-DAI结果元组转换为KML格式文档的Activities行为;
  • 改进的配置和部署方式,使得完成复杂配置和在服务器之间拷贝配置文件更为简便;
  • OGSA-DAI升级到Java 1.6环境下编译运行。

在更新的特性中,个人认为比较有用的是通过Apache Commons DBCP连接池与DAI服务进行交互,工作流引擎执行情况跟踪,以及KML格式的元组转换功能。在资源部署方面,先前部署资源和行为的ANT脚本由简单的配置命令代替,并且不需用ANT脚本进行GAR打包,而是仅将包含配置文件的目录拷贝到WebApp下的WSRF文件夹中。OGSA-DAI 4.0的文档也进行了同步更新,感兴趣的朋友可以访问OGSA-DAI文档获取更细节的内容。

OGSA-DAI分布式查询拓展自定义函数

OGSA-DAI通过数据服务对后端单个数据源查询,将整串SQL语句推送给后端数据库执行查询。而在面向分布式数据源的DQP查询中,组合查询在中间层被解析为针对不同数据源的子查询,子查询通过DAI数据服务获取查询结果,并在DQP中间层对不同数据源返回的结果进行组装,并返回给请求用户。

通俗来讲,DQP分布式数据服务查询类似于一个MapReduce过程,现将针对异构分布式数据源的复合查询语句解析拆散,提交给对应不同数据源的DAI服务进行查询,再将多个数据服务的返回结果汇总,有DQP中间层组装得到最终的查询结果。

null

现在的问题是,SQL语句在查询过程中允许嵌入查询函数,比如Count( )、Avg( )、Max( )、Min( )等聚合函数,甚至空间数据库中支持的ST_Buffer( )ST_Union( )等空间分析函数,在查询过程中进行一定的数据处理操作。但DQP查询在查询语句分解时,由于复合查询语义分析的二义性,不能在将嵌套函数传递给子查询。为了弥补嵌入函数的操作,DQP提供了一种在中间层处理数据的UDF(用户自定义)函数拓展方式,使得函数处理过程,在子查询返回结果后由DQP中间层完成函数计算。

DQP已定义了基本的标量(Scalar)和聚合(Aggregate)函数,并为用户自定义函数提供了拓展接口。比方说我们在查询语句中定义一个缓冲区分析函数Buffer( ),其功能实现调用自JTS库提供的缓冲区分析API。Buffer操作需要返回每一列缓冲区分析结果,属于标量函数,需要继承LogicalExecutableFunctionBase类。同时,Buffer操作接受空间数据库子查询返回的Geometry类型输入数据,并需要用户在编写查询语句时给定一个Double型的缓冲区距离参数。

通过PostGIS驱动,子查询能够返回WKT格式的空间数据,DQP将返回数据以Parameters对象传入,我们可以使用JTS库的WKTReader( )读入返回的WKT数据并传给geom对象,再以类似Geometry result = geom.buffer(distance);的JTS调用完成缓冲区分析处理,并将结果以Object对象返回给DQP查询结果装配器,即可实现分布式查询中的空间分析函数嵌入工作。标量函数的拓展示例参见这里。对于聚合函数,则需要继承SQLAggregateFunction类,实现过程不在赘述,示例参见这里

通过自定义函数的拓展,可以进一步丰富DQP分布式查询的功能和适用性。DQP对于复合查询的解析,应该是基于ANTLR提供的语法解析功能实现的,语法解析过程以后有时间研究一下再写出来。

根据OGSA-DAI项目组成员在OGF-28研讨会中公开的的开发线路图,OGSA-DAI 4.0将在2010年的4月份发布,更新的内容包括DQP的优化和拓展,增加SQL Views查询器,改进通用Activities,增加KML行为以及3.x版本中已报告的Bug修改等。

近3年时间里,我对OGSA-DAI项目始终保持关注,也在邮件沟通中认识了一些项目背后的开发者,他们一直在贡献代码和文档来推动着项目进程。希望DAI项目能够持续推进,并且在易用性方面得到进一步改善。

数据网格项目OGSA-DAI新特性

OGSA-DAI是用于分布式异构数据源访问和集成的网格中间件。在新近发布的3.2.x版本中,DAI在功能和易用性方面得到不少改进。

在OGSA-DAI 3.2版本中,最重大的改进是将分布式查询组件DQP进行重写,作为一个组件包含在DAI安装包中,无需之前版本在配置DQP时的DQP EvaluatorDQP Coordinator部署包。通过配置文件加载后的DQP资源,也作为DAI资源和行为(Activities)以标准DAI服务的形式存在,并可通过DAI的SQLClient进行分布式查询,极大简化了DQP配置和使用。

值得关注的是,具备拓展数据类型和函数的关系型数据库,如PostGIS空间数据库,3.2之前版本的DQP分布式查询无法读出包含拓展字段类型如Geometry类型的Schema表结构,而新版本中DQP资源以DAI资源形式对外暴露接口,且DAI支持关系型数据库拓展的JDBC列类型到DAI元组类型的元数据抽取和映射,所以可以读出空间数据库的Schema表结构,并对多个空间数据源进行分布式查询。但在DQP查询过程中,需使用OQL对象查询语句针对异构数据源进行拆分组合,所以DQP查询还不支持直接在SQL语句中嵌入空间分析函数。可行的方法是,对DQP查询进行自定义Functions拓展,加入后端空间数据库支持的空间操作函数

此外,新的DQP索引页面dqp-index.jsp也可以在安装后查看已加载的DQP资源,其中包含DAI数据源信息、DQP数据字典、所有可以查询的表名和字段信息等。同时,DAI 3.2还更新了之前的dai-manager.jsp页面,新增了DAI资源列表dai-resources.jsp,DAI行为列表dai-activities.jsp,配置键值对dai-config.jsp,容器环境键值对dai-context.jsp,请求监视器dai-request-monitor.jsp等多项DAI服务信息页面。

DAI 3.2版本还启用了新的资源监控框架,用于跟踪工作流执行过程中每个Activities产生和消费的数据块的情况。同时,并优化了GridFTP行为的执行效率。在最新的OGSA-DAI 3.2.1版本中,还对已经发现并提交的一些Bug进行了修复。感兴趣的DAI使用者可以查看更新说明,以获取更多细节。

DAI 3.2提供了新的功能并在操作上做了简化,在Ubuntu 9.10下实际安装配置也很顺利,但在版本兼容性方面,测试了DQP提供的GUI组件ogsadqp-3.2.1-od30port,以及驱动程序OSGA-DAI:JDBC都已无法适用于新的DAI 3.2版本,需要等待组件升级或自己在原有基础上修改代码进行定制。

OGSA-DAI的JDBC驱动

OGSA-DAI:JDBC驱动,是OGSA-DAI网格中间件客户端工具的拓展项目,符合Sun JDBC接口v2.0规范,用以帮助开发者通过符合JDBC标准的Java代码与数据服务资源交互。

通常情况下,在DAI安装与数据服务资源部署之后,需要运行环境变量设置脚本setenv.sh加载依赖类库,即可以在命令提示符下,使用DAI自带的SQLClient客户端向服务转入SQL脚本并执行数据资源查询。查询时需要指定的参数包含:服务资源URL地址,数据资源ID(代表与哪个数据源建立连接),以及SQLQuery查询串。

但以命令行方式使用OGSA-DAI客户端,在与网格数据服务交互方面并不方便,OGSA-DQP提供了针对分布式查询的GUI客户端,帮助使用者添加查询计划,并生成OQL查询解析树。但如果计划将已有JDBC应用数据源迁移到DAI服务之上,使用OGSA-DAI:JDBC驱动则更灵活,开发者可以通过一般JDBC的处理方式,操作DAI上部署的各类数据服务,甚至可以使用Hibernate或JPA等ORM层,来构建DAI:JDBC之上的实体关系映射。

OGSA-DAI:JDBC驱动目前最新为0.1版本,在使用时首先需要加载JDBC Metadata Activity,来帮助DAI:JDBC获取后端关系型数据库的元数据信息。之后需要将MetaDataMethodActivity部署在OGSA-DAI中,并设置已有DAI Resource关联新部署的Activity。重启服务容器之后,在dai-manager.jsp监控页面中,就可以看见刚部署的Activity出现在DAI Resource下的行为列表中。

在OGSA-DAI:JDBC驱动编码方面,首先通过语句Class.forName(“br.usp.pcs.lahpc.ogsadai.jdbc.Driver”); 来告知JVM查找并加载指定的JDBC驱动类,之后通过DriverManager.getConnection(“jdbc:ogsadai://localhost:8080/wsrf/services/dai/datasource”); 语句指定访问服务的URL地址和数据资源名称,接下来便可以用JDBC的方式通过PreparedStatement来传入待执行的SQL串,调用execute()函数执行查询,并通过getResultSet()函数获取数据库查询后的结果集。

实际测试中,发现OGSA-DAI:JDBC驱动目前还存在一些问题,与作者邮件联系后确认:驱动对直接在Globus Container中部署的DAI服务支持良好,但如果Globus WS Core和DAI部署在Tomcat中,需要在添加DAI:JDBC依赖项的同时,添加一堆额外的DAI SQLClient运行库,才可以保证代码正常执行。目前版本还在不断修正之中,感兴趣的开发者可以关注OGSA-DAI:JDBC的后续版本。