CENTRO UNIVERSITÁRIO DE VILA VELHA CURSO DE CIÊNCIA DA COMPUTAÇÃO INTEGRAÇÃO DE DADOS USANDO OGSA-DAI Elmo Laurenzoni Neto Leonardo de Medeiros Magalhães Lucas Calvi Costa Monografia desenvolvida durante a disciplina de Trabalho de Conclusão de Curso apresentada ao Curso de Ciência da Computação do Centro Universitário de Vila Velha, como requisito parcial para a obtenção do título de Bacharel em Ciência da Computação, sob orientação do prof. Cristiano Biancardi. Vila Velha, Junho de 2008 2 ELMO LAURENZONI NETO LEONARDO DE MEDEIROS MAGALHÃES LUCAS CALVI COSTA Integração de dados Usando OGSA-DAI Monografia do Trabalho de Conclusão de Curso de Graduação em Ciência da Computação apresentada ao Centro Universitário Vila Velha, como requisito parcial para a obtenção do título de Bacharel em Ciência da Computação. Aprovada em ____ de ___________________ de 2008. COMISSÃO EXAMINADORA _________________________________________ Prof. Cristiano Biancardi Mestre em Informática. Centro Universitário de Vila Velha Orientador _________________________________________ Prof. Otacílio Pereira José Pereira Mestre em Informática. Centro Universitário de Vila Velha _________________________________________ Prof. Vinícius Rosalen Mestre em Ciência da Computação. Centro Universitário de Vila Velha 3 “Houve um tempo em que se fazia ciência a partir de quatro elementos: Água, Terra, Fogo e Ar. Naquele tempo não se sabia que podia fazer qualquer coisa com apenas dois: Vontade e Determinação.” <Autor Desconhecido> 4 Dedicamos esse trabalho aos nossos pais, pois sem eles, nada disso seria possível. 5 AGRADECIMENTOS Agradecemos aos nossos Pais, pelo apoio e paciência dispensados, por estarem presentes quando necessitamos e por acreditar em nosso trabalho e potencial. Ao apoio dos nossos colegas de sala, que sempre nos ajudaram, seja pela troca de conhecimentos ou pela imensa ajuda na hora das maiores dificuldades. Ao nosso orientador pela oportunidade concedida, pelo seu apoio e pela suas contribuições que foram fundamentais para a conclusão desse trabalho. As nossas namoradas Juliana e Gabriella pela compreensão de não estarmos presentes em determinados momentos, pelo companheirismo e principalmente pelas ajudas prestadas para finalizarmos esse trabalho. A todos aqueles que de alguma forma contribuíram para completar o nosso objetivo. Por fim, agradecemos principalmente a Deus, por nos dar força para superar as barreiras que nos impediam e alcançar o nosso objetivo. RESUMO Integração de dados promove a junção de dados através de um aplicativo liberando o usuário da necessidade de integrar dados manualmente. Isto é importante porque, atualmente, a quantidade de dados disponíveis está cada vez maior sendo necessário o uso de um sistema capaz de realizar essa integração. Recentemente, ambiente de Grid tem se mostrado como uma boa alternativa para a utilização, de forma segura, coordenada, eficiente e transparente, de recursos computacionais geograficamente dispersos. No que diz respeito à integração de dados em ambiente de Grid tem-se o OGSA-DAI, um middleware que assiste ao acesso e à integração de dados a partir de fontes de dados separadas via ambiente de Grid. Neste contexto, este trabalho apresenta um estudo sobre o middleware OGSA-DAI. Para tanto, o presente trabalho apresenta uma investigação da arquitetura do OGSA-DAI e a descrição de uma aplicação para promover a integração de dados de dois Bancos de Dados distintos. Palavras-chave: Integração de dados; Grid; OGSA-DAI. 7 ABSTRACT Data integration promotes data junction using a middleware system, freeing the user from the need to integrate data manually. This is important because nowadays the amount of data available is getting bigger and bigger, being necessary the use of a system that is capable of performing this integration. Recently, grid environment has shown as a good alternative for a safe, coordinate, efficient and transparent way to use geographically dispersed computational resources. In the matter of data integration using grid environment we have the OGSA-DAI, a middleware that assists in the data integration from data sources separated through a grid environment. In this context, this work presents a study on the middleware OGSA-DAI. To demonstrate its use, the following work presents an investigation of the OGSA-DAI architecture and the description of an application to promote the data integration between two different Data Bases. Key-words: Integration of data; Grid; OGSA-DAI. 8 LISTA DE FIGURAS Figura 01 – Middleware para Integração de dados. .................................................... 19 Figura 02 – Wrappers. ................................................................................................ 21 Figura 03 – ConFiguração Básica do CoDINS ............................................................ 32 Figura 04 – O CoDINS e seus Componentes Básicos ................................................ 33 Figura 05 – Arquitetura do CoDINS-G ........................................................................ 34 Figura 06 – Arquitetura do MOCHA ............................................................................ 35 Figura 07 – Arquitetura do OGSA-DPQ ...................................................................... 36 Figura 08 – Interação entre os frameworks OGSA-DPQ e OGSA-DAI. ....................... 37 Figura 09 – Funcionamento do OGSA-DAI. ................................................................ 38 Figura 10 – Arquitetura do OGSA-DAI. ....................................................................... 40 Figura 11 – Data Service Resourse ............................................................................ 41 Figura 12 – Documento de desempenho contendo elemento de sessão (session element), elemento de atividade (activity element) e um ponto final (end-point). ........ 44 Figura 13 – Exemplo de documento de desempenho. ................................................ 45 Figura 14 – Documento de resposta resultante do documento de desempenho. ........ 45 Figura 15 – Exemplo de Documento de Desempenho enviado de forma Síncrona..... 46 Figura 16 – Documento de resposta contendo os dados resultantes. ......................... 46 Figura 17 – Interação usando uma interface orientada a documentos. ....................... 47 Figura 18 – Exemplo de Entrega de dados. ................................................................ 48 Figura 19 – Resourse File. .......................................................................................... 49 Figura 20 – Consulta realizada pelo Cliente. ............................................................... 50 Figura 21 – Servidor Proxy do OGSA-DAI .................................................................. 51 Figura 22 – DataRequestExecutionResource ............................................................. 51 Figura 23 – SQL Query ............................................................................................... 52 Figura 24 – TupleToWebRowSetCharArrays .............................................................. 52 Figura 25 – CharArraysResize .................................................................................... 53 Figura 26 – DeliverToRequestStatus .......................................................................... 53 9 Figura 27 – Recursos.................................................................................................. 54 Figura 28 – Recursos Passados como Parâmetros .................................................... 54 Figura 29 – Pedido Entregue ao Cliente ..................................................................... 54 Figura 30 – Pedido Disponível .................................................................................... 54 Figura 31 – sqlBag ...................................................................................................... 55 Figura 32 – Consulta realizada pelo sqlBag ................................................................ 55 Figura 33 – Atividade TupleToWebRowSetCharArrays............................................... 56 Figura 34 – TupleToWebRowSetCharArrays.nextResult ............................................ 56 Figura 35 – sqlUpdateStatement ................................................................................ 57 Figura 36 – sqlParameter ........................................................................................... 58 Figura 37 – Esquema da Fonte Relacional “littleblackbook” da Matriz ........................ 60 Figura 38 – Esquema da fonte Relacional “littleblackbook” da Filial. ........................... 61 Figura 39 – Consulta na linguagem SQL. ................................................................... 61 Figura 40 – Diagrama de Implantação ........................................................................ 61 Figura 41 – SQLServer ............................................................................................... 62 Figura 42 – OracleSQL ............................................................................................... 63 Figura 43 – Modelo de grupo de fonte de dados ......................................................... 63 Figura 44 – Modelo de consulta .................................................................................. 64 Figura 45 – Local onde se localiza os driver dos BD’s no OGSA-DAI ......................... 74 Figura 46 – Classpath ................................................................................................. 74 Figura 47 – Comando para criar uma base de dados ................................................. 75 Figura 48 – Comando a ser executado caso o serviço de implementação falhar ........ 75 Figura 49 – Consulta a uma fonte de dados ............................................................... 76 Figura 50 – Comando usado para configurar um servidor .......................................... 76 Figura 51 – MySQLDataResource TupleToWebRowSetCharArrays ........................... 77 Figura 52 – PipelineWorkflow ..................................................................................... 78 Figura 53 – DataRequestExecutionResource ............................................................. 79 Figura 54 – DeliverToRequestStatus .......................................................................... 79 Figura 55 – RequestStatus ......................................................................................... 80 10 Figura 56 – RequestStatus Completo ......................................................................... 80 Figura 57 – Método Principal ...................................................................................... 80 Figura 58 – TupleToWebRowSetCharArrays .............................................................. 81 Figura 59 – Strings Pad .............................................................................................. 81 Figura 60 – TupleToWebRowSetCharArrays Completo .............................................. 82 Figura 61 – Código Completo ..................................................................................... 84 11 LISTA DE TABELAS Tabela 1 – Tecnologias Suportadas pelo OGSA-DAI .................................................. 38 Tabela 2 – Assessores de dados Fornecidos pelo OGSA-DAI.................................... 46 Tabela 3 – Resultado da Consulta da Matriz (MySQL) ............................................... 65 Tabela 4 – Resultado da Consulta da Filial (Oracle) ................................................... 66 Tabela 5 – Resultado Integrado .................................................................................. 66 Tabela 6 – Drivers de Banco de Dados ...................................................................... 73 Tabela 7 – URI’s de Banco de Dados ......................................................................... 73 12 LISTA DE ABREVIAÇÕES E SIGLAS API Application Programming Interface BD Banco de Dados CoDIMS ConFigurable Data Integration Middleware System CORBA Commom Object Request Broker Arquitecture DAP Data Access Provider DB DataBase DBA DataBase Administrator DBMS Database Management System DRER Data Request Execution Resource EJB Enterprise JavaBeans ERE Entidade Relacionamento Estendido GT Globus Tookit JDBC Java Database Connectivity MOCHA Middleware Based on a Code Shipping Architecture OGSA Open Grid Service Architecture OGSA-DAI Open Grid Service Architecture - Data Access and Integration OGSA-DPQ Open Grid Service Architecture - Distributed Query Processor QPC Query Processing Coordinator SGBD Sistema de Gerenciamento de Banco de Dados SOAP Service Oriented Architecture Protocol SQL Structured Query Language WSI Web Services Inter-Operability WSRF Web Services Resourses Framework XML eXtensible Markup Language XLS eXtensible Stylesheet Language 13 SUMÁRIO 1. INTRODUÇÃO........................................................................................................ 16 1.1. Objetivo ............................................................................................................................ 16 1.1.1 Geral ........................................................................................................................... 16 1.1.1 Específico.................................................................................................................... 16 1.2. Organização do Trabalho ................................................................................................. 17 2. CONCEITOS E TECNOLOGIAS............................................................................. 18 2.1. Integração de Dados......................................................................................................... 18 2.1.1. Introdução ................................................................................................................. 18 2.1.2. Middleware para Integração de Dados ..................................................................... 19 2.1.3. Wrappers................................................................................................................... 20 2.1.4. Principais Dificuldades para Integração .................................................................... 21 2.1.5. Conflitos para Integração .......................................................................................... 21 2.1.6. Tipos de Esquema ..................................................................................................... 22 2.1.7. Vantagens e Desvantagens ....................................................................................... 23 2.2. Computação Distribuída ................................................................................................... 24 2.2.1. Definição ................................................................................................................... 24 2.2.2. Cluster ....................................................................................................................... 24 2.3. Grid ................................................................................................................................... 24 2.3.1. Visão Geral ................................................................................................................ 24 2.3.2. Características ........................................................................................................... 26 2.3.3. Benefícios .................................................................................................................. 26 2.3.4. Grid VS Computação Distribuída ............................................................................... 29 2.3.5. Grid VS Cluster .......................................................................................................... 30 3. TRABALHOS RELACIONADOS ............................................................................. 31 3.1. Introdução ........................................................................................................................ 31 3.2. CoDIMS ............................................................................................................................. 31 3.2.1. CoDIMS-G .................................................................................................................. 33 14 3.3. Mocha............................................................................................................................... 35 3.4. OGSA-DPQ ........................................................................................................................ 36 4. OPEN GRID SERVICE ARCHITECTURE – DATA AND INTEGRATION ................ 38 4.1. Introdução ........................................................................................................................ 38 4.2. Arquitetura do OGSA-DAI ................................................................................................. 39 4.2.1. Camada de Dados...................................................................................................... 40 4.2.2. Interface entre a Camada de Dados e a Camada Lógica de Negócios ...................... 40 4.2.3. Camada Lógica de Negócios ...................................................................................... 41 4.2.4. Interface entre a Camada de Lógica de Negócios e a Camada de Aplicação............ 42 4.2.5. Camada de Apresentação ......................................................................................... 43 4.2.6. Camada de Cliente .................................................................................................... 43 4.3. Serviços de Dados............................................................................................................. 43 4.3.1. Operações Usando Dados ......................................................................................... 44 4.4. Recursos de Serviços de Dados ........................................................................................ 46 4.5. Assessor de Recursos de Dados ....................................................................................... 47 4.6. Relacionamento ............................................................................................................... 47 4.7. Especificação Funcional .................................................................................................... 48 4.7.1. Representando uma Fonte de Dados........................................................................ 48 4.7.2. Fluxograma de Execução ........................................................................................... 50 4.8. Modificando um Banco de Dados .................................................................................... 57 4.9. Vantagens ......................................................................................................................... 58 4.10. Desvantagens ................................................................................................................. 59 5. ESTUDO DE CASO ................................................................................................ 60 5.1. Descrição da Aplicação ..................................................................................................... 60 5.2. Resourse File dos Bancos de Dados .................................................................................. 62 5.3. Criando um Grupo de Fonte de Dados ............................................................................. 63 5.4. Criando Uma Consulta...................................................................................................... 64 5.5. Resultado da Consulta ...................................................................................................... 65 15 6. CONCLUSÕES....................................................................................................... 68 REFERÊNCIAS BIBLIOGRÁFICAS ............................................................................ 69 ANEXO A – MANUAL DE INSTRUÇÃO DO OGSA-DAI ............................................. 72 ANEXO B – WORKFLOWS ........................................................................................ 78 ANEXO C – CÓDIGO COMPLETO ............................................................................ 84 ANEXO D – Perguntas e Respostas ........................................................................... 94 16 1. INTRODUÇÃO Atualmente está disponível um grande volume de dados, essencialmente heterogêneos e distribuídos, devido principalmente à disseminação da Internet e ao desenvolvimento das redes de alta velocidade. Neste contexto a heterogeneidade se manifesta sob diferentes formas, tais como: diferentes sistemas operacionais, modelos de dados (modelo de entidade-relacionamento OO, XML, etc.), servidores de dados, sistemas de comunicação e hardware. Assim, cresce o número de aplicações que demandam acesso a tais dados através de uma visão integrada, uniforme e homogênea, em um tempo cada vez menor. Com um grande aumento de sistema informatizado espalhados pelo mundo a integração de dados tem ficado cada vez mais necessária, e conseqüentemente a implementação de sistemas capazes de tal interação. Assim, é importante conseguir combinar banco de dados e tecnologias relacionadas para incrementar o uso da informação. Recentemente, o ambiente de Grid tem se mostrado como uma boa alternativa para a utilização, de forma segura, coordenada, eficiente e transparente, de recursos computacionais geograficamente dispersos. No que diz respeito à integração de dados em ambiente de Grid tem-se o OGSA-DAI, que é um middleware que assiste no acesso e na integração de dados a partir de fontes de dados separadas via ambiente de Grid. Este middleware também concede ao usuário a facilidade da utilização de serviços web para se comunicar com bancos de dados espalhados pelo mundo. 1.1. Objetivos 1.1.1. Geral O objetivo deste projeto é o estudo do middleware OGSA-DAI e o desenvolvimento de uma aplicação para integração de dados heterogêneos e distribuídos usando essa tecnologia. 1.1.2. Específico • Estudo do ambiente Grid e integração de dados • Investigação da arquitetura do OGSA-DAI e como é feita a integração de dados do mesmo • Configuração e Instalação do OGSA-DAI • Análise, projeto e implementação em um estudo de caso usando OGSA-DAI. 17 1.2. Organização do Trabalho No capítulo 2 são apresentados alguns conceitos e tecnologias estudadas para a realização desse estudo, como por exemplo: Integração de Dados, Computação Distribuída, Cluster, Grid; No capítulo 3 são apresentados alguns trabalhos sobre integração de dados heterogêneos e distribuídos, relacionados com o presente trabalho; O capítulo 4 apresenta o estudo da tecnologia OGSA-DAI, incluindo sua coleção de componentes para a manipulação de dados e sua coleção de ferramentas para desenvolver aplicações de clientes. No capítulo 5 é apresentado o estudo de caso; No capítulo 6 apresenta a conclusão desse trabalho. 18 2. CONCEITOS E TECNOLOGIAS Esse capítulo tem como objetivo mostrar o conceito, as vantagem e desvantagens do uso da integração de dados. 2.1. Integração de Dados 2.1.1. Introdução Integração de dados refere-se a combinar dados heterogêneos e distribuídos de forma que uma única visão, uniforme e homogênea, seja apresentada para o usuário [HAKIMPOUR; GEPPERT; 2001]. Para tanto, sistemas de integração de dados vêm sendo desenvolvidos com a finalidade de integrar um grande número de fontes de dados heterogêneas, desenvolvidas independentemente. O objetivo maior desses sistemas é liberar o usuário de ter que localizar as fontes de dados, interagir com cada uma isoladamente e combinar os dados das múltiplas fontes de dados manualmente [HAKIMPOUR; GEPPERT, 2001; HALEVY, 2003]. Para gerenciar dados em múltiplos bancos de dados, é necessário lidar com a distribuição dos SGBDs. O acesso integrado a bases de dados distribuídas e heterogêneas é um dos grandes problemas encontrados pelas organizações, sendo um dos grandes problemas também na comunidade de banco de dados. Para proporcionar interoperabilidade entre sistemas heterogêneos, deve-se estabelecer uma visão global e uniforme para dados e serviços [KALINICHENKO, 1999]. A integração de um modelo global e a adição de uma camada de software são umas das técnicas utilizadas para integrar a base de dados distribuídos. No primeiro caso, a definição do modelo conceitual global é realizada através da comparação entre modelos conceituais locais, identificação de equivalência, identificação e resolução de conflitos [MÁRCIO PICOSSI SCHNEIDER, 2004]. Já no segundo caso, uma camada de software providencia a integração a partir da definição de regras entre os participantes. Esta camada é muitas vezes citada como mediador, e também tem a finalidade de fundir as informações de fontes de dados heterogêneas removendo redundâncias e resolvendo inconsistências [PAPAKONSTANTINOU, ABITEBOUL, 1996]. 19 2.1.2. Middleware para Integração de Dados Middleware é um componente de software que tem a finalidade de interligar processos clientes a processos servidores, disponibilizando um conjunto de serviços e visando reduzir a complexidade do desenvolvimento e da execução de uma aplicação [BARBOSA; 2001]. É uma designação genérica utilizada para se referir ao software que é executado entre os usuários e o servidor em um sistema de banco de dados cliente/servidor [JAKOBOVITS, 1997]. Um middleware também pode ser definido como uma camada existente entre o cliente, a rede, os sistemas operacionais e dos possíveis servidores de recurso, mais focalizado em servidores de dados. É constituído, na maioria das vezes, por módulos que possuem APIs de alto nível, proporcionando a sua integração com sistemas desenvolvidos em diversas linguagens de programação e APIs de baixo nível, permitindo a independência relativa ao dispositivo. Seu objetivo é ocultar a heterogeneidade e fornecer um modelo de programação mais produtivo para os programadores de aplicativos. É composto por um conjunto de processos em um determinado grupo de computadores, implementando uma comunicação e oferecendo suporte para compartilhamento de recursos aos aplicativos distribuídos. O objetivo de um middleware para integração de dados (Figura 1) é fornecer informação integrada sem a necessidade de se integrar as fontes de dados, ou seja, um mediador permite a interoperação de informação, somente selecionando resultados derivados das fontes de dados [KIM, 1995] [WIEDERHOLD, 1999]. Figura 1 – Middleware para Integração de dados 20 Para viabilizar a integração de dados, torna-se necessário realizar a integração de esquemas [RAHM; BERNSTEIN, 2001]. O problema é que os esquemas dos diferentes bancos de dados componentes podem estar expressos em diferentes modelos de dados. Assim, torna-se necessário, inicialmente, transformar todos os esquemas para um mesmo modelo de dados, denominado de Modelo de Dados Comum (MDC). No caso de sistemas componentes não baseados em banco de dados, deverá existir um mecanismo que simule a existência de um esquema, metadados, para permitir o processo de integração. O esquema conceitual de cada banco de dados componente é denominado de esquema local. Este esquema, expresso no modelo de dados do sistema componente, deve ser transformado para o MDC para poder ser integrado. O esquema derivado desta transformação é denominado de esquema de exportação. Um esquema global, ou federado, descrito no MDC, é então criado pela integração de múltiplos esquemas de exportação. Finalmente, são definidos os esquemas externos, visões, sobre o esquema global, para atender às necessidades de um grupo específico de usuários ou de aplicações, ou ainda, por razões de controle de acesso. Para efetuar a tradução entre modelos, esquema externo para esquema local, são utilizados os wrappers que são os W1, W2, W3 e Wn na Figura 1 [BIANCARDI, 2005]. 2.1.3. Wrappers São programas que encapsulam fontes de dados e são usados para fazer a tradução entre o modelo de dados comum, utilizado no sistema integrador, e o modelo de dados de cada fonte [BIANCARDI, SILVERSTRE, BARBOSA, 2005]. Um Wrapper encapsula uma única fonte de dados para que ela possa ser utilizada de maneira mais conveniente. Através do uso de Wrappers, pode-se transformar uma fonte de dados em uma forma mais estruturada (BARBOSA, 2001). Os Wappers são utilizados para apresentar uma interface simples e funcional de uma interface interna de um banco de dados. Na Figura 2 são exibidas três fontes de dados, XML, Relacional e Orientado a Objeto (OO), e utilizado um modelo Global (Relacional) como sendo uma fonte principal, logo os wappers tem o papel de converter os bancos de dados XML, bancos orientados a objetos (OO) e fontes de dados relacionais para que possa ser realizada a integração de dados. 21 Figura 2 – Wrappers Para realizar a seleção de um Wrapper, a ser usado pelo middleware, devem ser analisadas quais as fontes de dados serão tratadas pelos mesmos, se elas estão bem documentadas, quais são as suas funções, como foram construídas e as arquiteturas internas das fontes [BIANCARDI, 2005]. 2.1.4. Principais Dificuldades Para Integração • Integrar dados de diferentes SGBDs; • Integrar dados que possuem diferentes modelos de banco de dados (relacional, hierárquico, Objeto-Relacional...); • Criar algoritmos que sejam compatíveis na realização de consultas, transações atualizações e até exclusões nos SGBDs; • O sistema requer que exista pelo menos um usuário para gerenciar o sistema, pois este não pode ser totalmente automatizado, para corrigir problemas no processo de integração. 2.1.5. Conflitos para Integração Quando comparamos esquemas de dados heterogêneos irá ocorrer conflito em esquemas locais. Esses conflitos devem ser tratados durante a integração dos esquemas ou integração de visões [HEPNER, 1995]. Diferentes nomes podem ser usados para mesma entidade ou entidades diferentes podem possuir o mesmo nome. A mesma entidade pode ser representada através de 22 diferentes estruturas de atributos ou alguns atributos podem não ser representados. Entidades podem ser representadas por tabelas em um banco de dados e podem ser representadas como atributos em outro. Tipos diferentes de dados são atribuídos a atributos semanticamente equivalentes. Conflitos de escalas ocorrem quando unidades métricas diferentes são utilizadas em cada sistema, ou diferentes níveis de precisão são usados. [JAKOBOVITS, 1997]. Em simples integrações de bancos de dados, os conflitos podem ser resolvidos pelo usuário ou pelo programador envolvido na integração. Para sistemas fortemente acoplados, os sistemas de integração possuiriam um mapeamento de nomes, tipos, valores e etc., para que as entidades possam ser representadas ou vistas da mesma maneira [HEPNER, 1995]. 2.1.6. Tipos de Integração A seguir serão mostrados os três tipos de esquemas considerados no cenário de integração de dados: Esquema global, esquema de exportação e esquema local. No esquema global existe somente um único esquema que é utilizado para manipulação dos dados. Este é gerado a partir dos esquemas semânticos de cada sistema participante. Sua principal vantagem é o fato do usuário conhecer apenas o esquema global, e não os outros diversos esquemas. A integração via esquema global é baseada na integração completa dos esquemas de exportação dos vários bancos de dados com o objetivo de fornecer uma única visão do banco de dados heterogêneo. [SCHNEIDER, 2004]. Um esquema exportação representa o subconjunto do esquema componente que será compartilhado na federação, que significa serviços formados em grupos. Um banco de dados não precisa disponibilizar para a federação e seus usuários a sua coleção completa de dados. Além disso, este esquema inclui informações para controle de acesso relativo a sua acessibilidade para usuários específicos da federação. Em um esquema local representa o esquema conceitual de uma fonte de dados componente. Este esquema representa o modelo de dados nativo do componente, que pode ser um banco de dados relacional, banco de dados orientado a objetos, arquivo XML, página HTML, entre outros. Portanto, os esquemas locais componentes da federação podem ser representados seguindo diferentes modelos de dados. Pode-se disponibilizar um esquema global geral, ou vários esquemas globais parciais (views) de acordo com as necessidades dos vários usuários. Integração de esquemas via bancos de dados federados não precisa ser total, e depende das necessidades dos usuários. Semelhante à integração via esquema 23 global com a utilização de diversas views sobre o conjunto de dados integrados, mas cada banco de dados participante tem que conhecer todos os demais. Os bancos de dados federados podem ser fortemente ou fracamente acoplados, onde o primeiro é adequado para sistemas que têm por objetivo a leitura e a atualização dos dados, e o outro é adequado para sistemas que têm por objetivo a leitura dos dados [SCHNEIDER,2004]. 2.1.7. Vantagens e Desvantagens As principais vantagens do uso de integração de dados são [MOTRO, BUNEMAN, 1981]: • Os usuários possuem uma visão exclusiva dos dados integrados; • Integram diversas fontes de dados sem que haja a necessidade de modificação das plataformas tecnológicas existentes; • Possibilidade de ampliar a visão da empresa para planejar, analisar e informar, realizando o cruzamento de dados para extração de informações relevantes, usando-as para tomar decisões; • Possibilita acessar a base de dados e gerar relatórios específicos do negócio; e • Promove a melhoria da qualidade dos dados com a padronização, garantindo a qualidade dos produtos e atendendo as expectativas dos consumidores. As principais desvantagens são [MOTRO, BUNEMAN, 1981]: • A geração de um novo esquema global integrado geralmente altera a semântica dos atributos e tabelas, portanto após a integração pode ser necessário alterar os softwares que utilizam o banco de dados, para que estes possam acessar o novo esquema integrado. Uma solução para este problema pode ser obtida através de visões e renomeações de atributos e tabelas. • Diversos métodos de integração existem para mais de dois bancos de dados: combinação dois a dois, combinação de todos de uma só vez, entre outros, e cada método pode definir esquemas globais completamente diferentes 24 2.2. Computação Distribuída 2.2.1. Definição Um sistema distribuído é uma coleção de computadores independentes que se apresenta ao usuário como um sistema único e consistente [TANENBAUM]. Assim, a computação distribuída consiste em adicionar o poder computacional de diversos computadores interligados por uma rede de computadores ou mais de um processador trabalhando em conjunto no mesmo computador, para processar colaborativamente determinada tarefa de forma coerente e transparente, ou seja, como se apenas um único e centralizado computador estivesse executando a tarefa. A união desses diversos computadores com o objetivo de compartilhar a execução de tarefas, é conhecida como sistema distribuído. 2.2.2. Cluster Um ambiente cluster é formado por um conjunto de computadores, que utiliza-se de um tipo especial de sistema operacional classificado como sistema distribuido. É construído muitas vezes a partir de computadores convencionais, sendo que estes vários computadores são ligados em rede e comunicam-se através do sistema de forma que trabalham como se fosse uma única máquina de grande porte. Há diversos tipos de cluster. Um tipo famoso é o cluster da classe Beowulf, constituido por diversos nós escravos gerenciados por um só computador [BIANCARDI, 2005]. Cluster constitui um sistema formado por hardware e software conectados em um único local, usado exclusivamente para resolver os problemas computacionais de uma determinada organização. Assim, em um Cluster, os recursos são gerenciados por uma entidade central, e os computadores agem como se fossem um único dispositivo [BIANCARDI, 2005]. 2.2.3. GRID 2.2.3.1. Visão Geral Um Grid pode ser definido de maneira bem abrangente como uma infra-estrutura de software capaz de interligar e gerenciar diversos recursos computacionais [FOSTER; KESSELMAN, 2003], distribuídos por uma área geográfica grande, oferecendo ao usuário, de forma confiável e econômica, o acesso transparente a tais recursos 25 independente de sua localização. Nesse sentido, a tecnologia de Grid visa fornecer o acesso compartilhado a recursos de computação, de uma maneira que quem for utilizá-los não necessite de conhecer os detalhes dos componentes computacionais envolvidos, onde eles estão localizados, como gerenciá-los, como corrigir erros ou mesmo como efetuar uma atualização. Dessa forma, a infra-estrutura Grid conecta diversos recursos de hardware, software e dados através de uma rede, fornecendo um acesso flexível e seguro para aplicações e dados [MALAIKA; EISENBERG; MELTON, 2003]. A tecnologia de Grid possibilita agregar recursos computacionais variados e dispersos em um único supercomputador virtual, acelerando a execução de um variado tipo de aplicações e diminuindo custos com o uso de recursos compartilhados. Em um Grid, os serviços podem ser executados em diferentes nós com o objetivo de balancear a carga de trabalho e aumentar o desempenho. Considerando que cada nó de um Grid executa tarefas distintas, as aplicações mais adequadas ao Grid são as que possuem tarefas independentes, ou seja, tarefas que não dependem da execução de outras e podem ser executadas em qualquer ordem e, a princípio, em qualquer nó do Grid [BIANCARDI, 2005]. De uma forma simples, um ambiente de Grid é aquele no qual as aplicações podem utilizar múltiplos recursos computacionais que podem estar distribuídos geograficamente. Mais recentemente, têm-se os recursos de dados, como por exemplo, os bancos de dados. Um ambiente Grid deve conter três pontos recomendados [CAMPOS JR, ALVES, HIRA, ZUFFO]: • Coordenação de Recursos não subordinados a um controle centralizado: Um ambiente de Grid deve coordenar recursos e usuários pertencentes a domínios distintos; • Utilização de interfaces e protocolos com padrões e abertos: Devido os propósitos das grades computacionais, a utilização de padrões abertos é trivial para permitir a interoperabilidade com outros sistemas já existentes; • Distribuição de qualidade de serviço não trivial: Um ambiente de grade computacional possibilita o uso coordenado de seus recursos, garantindo a qualidade de acesso ao mesmo. Esses requisitos são suportados pela arquitetura dos Grids, na qual é possível escalonar, de maneira dinâmica, os recursos computacionais. Além disso, um Grid pode englobar máquinas localizadas em lugares diferentes, utilizando seus recursos 26 ociosos. Com isso, é possível utilizar hardware comum, não sendo necessário fazer a utilização de máquinas de grande porte como supercomputadores. 2.2.3.2. Características Segundo [GOLDCHLEGER, 2004], podemos citar os seguintes aspectos relacionados ao Grid: • Não substituem sistemas operacionais - Os sistemas de computação em Grid podem utilizar serviços do sistema operacional, porém são estruturados como um middleware que provê serviços para os usuários e aplicações do Grid; • Podem integrar recursos distribuídos e descentralizados - a maioria dos sistemas de computação em Grid é capaz de integrar recursos dispersos por múltiplos domínios administrativos e conectados por redes de grande área. Essa característica separa os sistemas em Grid dos sistemas em Cluster, uma vez que estes últimos normalmente são capazes de integrar recursos em apenas um domínio administrativo; • Podem ser utilizados por diversas aplicações - a maioria dos sistemas de computação em Grid provê serviços que podem ser utilizados por diversas aplicações, caracterizando uma arquitetura reutilizável; • Podem incluir várias plataformas de hardware e software - a maioria dos sistemas de Computação em Grid pode integrar recursos heterogêneos, compostos por diversas plataformas de hardware e software. Para tal, entretanto, o sistema de Computação em Grid deve incluir mecanismos que lidem com a diversidade de tais plataformas; • Adaptabilidade às políticas locais - apesar de integrarem recursos dispersos por vários domínios administrativos, os sistemas de computação em Grid devem se adaptar às políticas e restrições de uso de cada um destes domínios. Por exemplo, é comum o cenário onde o administrador do domínio, apesar de compartilhar os recursos com outros domínios, deseja priorizar os usuários locais. Proprietários de estações de trabalho, por exemplo, não aceitam que o desempenho de suas aplicações sofra devido às aplicações em Grid que executam em seus recursos. 2.2.3.3. Benefícios Segundo [BERSTIS, 2003], os benefícios que o Grid possui são os seguintes: 27 • Explorar recursos subutilizados e recursos adicionais - A princípio, uma aplicação pode ser executada em qualquer máquina que faça parte de um Grid, desde que esta possua acesso a determinados recursos solicitados pela aplicação. Pode-se escolher esta máquina utilizando-se diversos parâmetros, como por exemplo: a que estiver com menor carga de processamento, a que possuir disponível certo tipo de dispositivo ou determinados dados. Existem alguns tipos de aplicação que podem melhor utilizar as características dos Grids. Um exemplo seria o de aplicações que exigem grande processamento de dados e pouca interação com o usuário, podendo ser melhor escalonadas através do Grid. Além dos recursos de processamento, muitas máquinas também possuem seus discos rígidos subutilizados. Assim, o Grid pode ser utilizado como um Data Grid, alocando o espaço disponível como se fosse um disco apenas. Outra forma de alocar o espaço seria dividir os dados de forma que as aplicações possam ser executadas em uma máquina mais próxima de onde se encontram os dados que processa, ou para garantir uma maior disponibilidade caso alguma máquina falhe. Diversos outros recursos podem ser compartilhados em um Grid. Para uma aplicação que demande um maior acesso à Internet, por exemplo, pode-se dividir o trabalho entre outras máquinas que também possuam acesso à rede, acelerando os resultados. Outros exemplos podem abranger uma impressora remota com maior qualidade, um gravador de DVD ou equipamentos médicos e científicos avançados como um microscópio eletrônico ou um robô. Com isso, os recursos de uma instituição ou empresa podem ser melhor utilizado, diminuindo despesas e aumentando a eficiência e a competitividade. • Capacidade de processamento paralelo - Outra característica interessante é a possibilidade de melhor utilizar o processamento paralelo através de Grids. Em alguns tipos de aplicações tais como científicas, financeiras, processamento de imagens e simulações, a utilização de processamento paralelo pode trazer bastante ganhos com relação ao desempenho. Uma aplicação que faça uso de algoritmos e técnicas de programação paralela pode ser dividida em partes menores e estas podem ser separadas e processadas independentemente. Cada uma destas partes de código pode ser executada em uma máquina distinta no Grid, melhorando o desempenho. Existem algumas barreiras que podem impedir que uma aplicação utilize todo este potencial. Por exemplo, se a aplicação deve ser dividida em um número fixo de partes independentes, isso torna-se uma barreira que impede sua escalabilidade. Outra forma de problema encontrado é quando as partes não 28 podem ser completamente independentes e precisam comunicar-se entre si, causando uma possível espera para que as comunicações sejam sincronizadas ou o tempo necessário para as mensagens serem transmitidas. Essas características devem ser levadas em conta no momento de se utilizar a funcionalidade de processamento paralelo, mas isso não impede a grande utilização dos Grids como uma excelente arquitetura para o processamento paralelo. • Dispositivos e Organizações Virtuais - A colaboração entre os mais diversos tipos de usuários e aplicações é outra capacidade que pode ser desenvolvida com o advento dos Grids. Recursos e máquinas podem ser agrupados e trabalharem juntos formando o que pode ser chamado de uma Organização Virtual (OV). Uma OV [FOSTER, KESSELMAN, TUECKE; 2001] é uma entidade que compartilha recursos através do Grid, utilizando uma determinada política de compartilhamento. Uma OV varia tremendamente em seus propósitos, escopo, tamanho, duração, estrutura, comunidade e sociologia. Pode ser definida de acordo com sua área de pesquisa ou de negócio, juntando usuários e aplicações com propósitos semelhantes, colaborando em prol de uma razão comum como, por exemplo, empresas, centros de pesquisa e universidades. Esses recursos podem abranger processamento, dados, licenças, entre outros, e podem ser virtualizados para melhor interoperabilidade entre os participantes do Grid. Dentro deste contexto, um Grid poderá, por exemplo, permitir o acesso remoto a instrumentos científicos altamente especializados e caros. Por exemplo, um cientista no laboratório A poderá manipular remotamente um telescópio presente no laboratório B, e receber as imagens captadas através da rede. Opcionalmente, ele poderá, de maneira transparente, armazenar as imagens nos equipamentos de grande capacidade do instituto C e, caso necessário, processar as imagens nos computadores disponíveis nas três instituições. Também é possível vislumbrar experimentos colaborativos, onde diversos cientistas espalhados por várias instituições colaboram para realizar experimentos e simulações. Na indústria, além da possibilidade de se utilizar a capacidade ociosa de centenas de estações de trabalho já existentes, os Grids poderão permitir novas formas de colaboração entre os funcionários espalhados por diversas filiais, por exemplo. • Confiabilidade - Existem diversas maneiras de aumentar a confiabilidade em um sistema computacional. Processadores e discos são duplicados, de modo 29 que caso um falhe o outro assuma seu lugar, fontes de energia e circuitos redundantes, geradores elétricos, entre outros. Todas estas formas comprovadamente aumentam a disponibilidade e a confiança em um sistema, mas seus altos custos podem torná-las impraticáveis. Utilizando-se uma abordagem baseada em Grids, com máquinas espalhadas em diversos lugares diferentes, quando uma falha atinge uma parte do Grid, as demais podem continuar sua operação normalmente. Sistemas de gerenciamento podem executar novamente processos importantes caso seja detectada alguma falha ou estes podem ser executados redundantemente para garantir sua consistência. Dados podem ser duplicados ou separados em diversas partes através do Grid, aumentando sua disponibilidade. Um grande avanço nessa área serão sistemas que podem automaticamente detectar uma falha e tomar as medidas necessárias para contornar o problema. 2.2.3.4. GRID VS Computação Distribuída Computação em grade é um caso em particular da computação distribuída, já que são orientadas para grandes aplicações, seja com enorme quantidade de dados transmitidos ou com uma grande capacidade de cálculos, ou ambas. Com a evolução da tecnologia de Grid, criava a oportunidade de se oferecer serviços sob demanda, surgindo a idéia de um Grid onde seria possível dispor qualquer serviço computacional sob demanda. O Grid, portanto, seria uma rede na qual o individuo se conecta para obter serviços computacionais que agregam recursos sob demanda (ex.: ciclos, armazenamento, software, periféricos, etc) [CIRNE; NETO, 2005]. A computação distribuída passa a ser uma computação em Grid no momento em que existe uma infra-estrutura de hardware e software que permita criar a ilusão de um supercomputador virtual, em grande escala, facilmente gerenciável e com uma grande quantidade de recursos (ciclos de CPU, dados, dispositivos de armazenamento etc.) sendo compartilhado de forma confiável, consistente, econômica e persistente, possibilitando, com isso, coordenar os trabalhos a serem processados e garantir a qualidade de serviço [BERSTIS, 2003]. Algumas tecnologias de computação distribuídas, tais como CORBA e EJB, são voltadas para sistemas distribuídos altamente acoplados, nos quais cliente e servidor são muito dependentes um do outro. Tecnologias de Grid se distinguem destas pelo fato de serem baseados no conceito de Grid Services, uma evolução de Web Services, o que implica em sistemas fracamente acoplados, nos quais um cliente pode não ter conhecimento do serviço até que ele o invoque. Nesse sentido, sistemas 30 distribuídos altamente acoplados são ideais para aplicações intranet, enquanto que Grid são mais adequados para alcançar as demandas de uma aplicação Internet [SOTOMAYOR, 2003]. 2.2.3.5. GRID VS Cluster A diferença principal entre Grid e Cluster [BUYYA, 2002] está relacionada ao modo como é feito o gerenciamento dos recursos, ou seja, se o compartilhamento de recursos é gerenciado por um único sistema global, sincronizado e centralizado, então é um Cluster. Em um Cluster, todos os nós trabalham cooperativamente em um objetivo comum, e a alocação de recursos é executada por um gerente centralizado e global. Em um Grid, os recursos estão distribuídos geograficamente, sendo que os donos desses recursos possuem autonomia para fazer o gerenciamento local. A alocação dos recursos é feita pelos usuários do Grid, e os nós executam diferentes tarefas relacionadas a objetivos distintos. Um Grid pode ser encarado como sendo uma evolução do Cluster, dado que os recursos deste podem ser compartilhados pelo Grid. Assim, um Grid é mais heterogêneo, complexo e distribuído. Com o objetivo de esclarecer a definição de Grid, já que se confunde com o significado real de Grid, foi elaborado um Grid CheckList por Foster [FOSTER, 2002] , onde são definidas três características básicas, onde pode ser definido se um sistema computacional pode ser chamado de Grid: • Recursos coordenados que não se sujeitam a um controle centralizado: Sistemas em Grid podem englobar recursos entre os mais variados tipos, desde o desktop de um usuário até um supercomputador. Pode haver um controle local em uma empresa, mas não existe um controle central para todo o Grid; • Utilizar padrões abertos, interfaces e protocolos de propósito geral: A utilização de protocolos e padrões abertos é essencial para que os sistemas em Grid possam realizar funções fundamentais como autenticação, autorização, descoberta de recursos e acesso a eles, sem perder a capacidade de escalar e interagir com diferentes plataformas de hardware e software; • Prover o mínimo em qualidade de serviços: Sistemas em Grid permitem que os recursos sejam utilizados de forma coordenada com o objetivo de alcançar qualidades de serviço como, por exemplo, tempo de resposta, throughput (vazão), disponibilidade, segurança e/ou a co-alocação de recursos para se adequar às exigências do usuário. Assim, a utilidade de um sistema combinado é significativamente maior que a soma das partes. 31 3. TRABALHOS RELACIONADOS 3.1. Introdução Na literatura da área, são encontrados vários sistemas tentando resolver o problema de integração de dados. Dentre os trabalhos que mais se relacionam com o tema do presente trabalho, podemos citar o CoDIMS, MOCHA e o OGSA-DPQ. A seguir, esses mesmos serão descritos. 3.2. CoDIMS (ConFigurable Data integration Middleware Systen) Com o grande aumento de sistemas informatizados espalhados pelo mundo, a integração de dados tem ficado cada fez mais difícil de ser realizada, sendo cada vez mais necessária a implementação de sistemas capazes de integrar dados heterogêneos. O Sistema CoDIMS, tem por objetivo, resolver tal problema de integração de dados em um ambiente flexível e configurável, permitindo a geração de sistemas lightweight, onde cada aplicação possui o seu sistema especifico de integração de dados distribuídos. Sua principal característica é o fato de ser baseado na técnica de composição de frameworks, possibilitando, com isso, flexibilidade e configuração, podendo ser adaptado para ser utilizado em diversos domínios de aplicação que exigem diferentes tipos de serviços [Barbosa, 2001]. Flexível, no sentido de que permite: integrar diferentes fontes de dados; utilizar diferentes técnicas de comunicação, tanto entre os componentes internos quanto com as fontes de dados; possibilitar a utilização de diferentes modelos de dados internamente. Configurável, de forma que o middleware pode ser configurado apenas com os componentes necessários para uma aplicação específica e que seja instanciado de acordo com os requisitos da aplicação e das características das fontes de dados que se deseja integrar [BIANCARDI, SILVESTRE, BARBOSA, 2005a]. Os frameworks são componentes que fazem parte da arquitetura de CoDIMS, e possuem o DIMS (Data Integration Middleware Services). instanciado para implementar serviços de integração de dados, como por exemplo o gerenciamento de dados. Os componentes do CoDIMS são implementados como webservices, possibilitando distribuição do ambiente, execução remota de tarefas e reuso de tais componentes (TREVISOL 2004). 32 Um modelo global é implementado para que CoDIMS possa realizar a integração de dados, onde os modelos locais são integrados e mapeados dentro do modelo global. Figura 3 – Configuração Básica do CoDINS A Figura 3 mostra os componentes básicos da configuração do CoDIMS. Os Componentes de Controle, Gerência de Metadados, Processamento de Consultas e Acesso de Dados são os componentes que devem existir em todas as configurações. Dependendo do domínio da aplicação para qual está sendo desenvolvida a aplicação, poderiam estar presentes outros componentes da configuração. Na Figura 4 é mostrada a configuração básica do CoDIMS assim como uma possível interação entre os mesmos. O componente Controle é a essência do ambiente CoDIMS, pelo fato de disponibilizar os mecanismos que implementam as configurações física e lógica. A configuração física diz respeito à seleção e ao registro dos componentes que farão parte do sistema a ser configurado, incluindo os serviços oferecidos e requisitados por cada um destes componentes. A configuração lógica é modelada através de um mecanismo baseado no conceito de workflow, sendo responsável por efetuar um escalonamento dos serviços, ou seja, determinar a seqüência de execução dos serviços oferecidos pelos componentes necessários para o processamento de um comando submetido ao sistema configurado. O componente Gerência de Metadados é responsável por gerenciar os esquemas envolvidos no processo de integração de dados. O componente Processamento de Consulta analisa, re-escreve, otimiza e executa as consultas de usuário submetidas ao sistema. Por fim o componente Acesso aos Dados é responsável por, através dos wrappers, traduzir e encaminhar as sub-consultas a serem executadas sobre as fontes de dados e recuperar os resultados das mesmas. É importante ressaltar que, na versão atual do CoDIMS, seus componentes são implementados como Web Services [TREVISOL, 2004]. 33 Figura 4 - O CoDIMS e seus Componentes Básicos [BIANCARDI, 2005] Para o processo de configuração, customização e modelagem de uma instância do CoDIMS, são necessárias as etapas de configuração física, configuração lógica e carga dos metadados1 de acordo com os requisitos de uma aplicação específica. Um exemplo de instância do framework CoDIMS é o CoDIMS-G (FONTES et al., 2004), que vem sendo desenvolvida no LNCC2 com o objetivo de suportar aplicações de visualização científicas executando em um ambiente de Grid. 3.2.1. CoDIMS-G CoDIMS-G é um sistema de integração de dados e programas gerados a partir da configuração do CoDIMS [BARBOSA; PORTO; MELO, 2002; BARBOSA, 2001]. Esse sistema pode ser visto como um serviço de integração de dados e programas para Grid, o qual fornece para os usuários um acesso transparente para dados e programas distribuídos no Grid, assim como gerenciamento e alocação de recursos dinâmicos. Nele também é proposto um novo algoritmo de escalonamento de nós e projetada uma máquina de consulta distribuída adaptativa para o ambiente de Grid. Assim, no CoDIMS-G, os usuários podem expressar consultas que combinam processamento distribuído de dados com a invocação de programas sobre os mesmos [BIANCARDI, 2005]. A arquitetura do CoDIMS-G, mostrada na Figura 5, é subdividida em vários componentes. O componente Control administra a comunicação entre os vários componentes, armazenando, gerenciando, validando e verificando as instâncias de configuração. 1 2 Para uma descrição mais detalhada do processo de configuração consulte [BARBOSA, 2001]. Laboratório Nacional de Computação Científica - http://www.lncc.br/frame.html 34 Figura 5 – Arquitetura do CoDINS-G [FONTES et al., 2004] A requisição de um usuário é encaminhada para o componente Controle, que é enviada para o componente Analisador (Parser). Este transforma a requisição do usuário em uma representação de grafo de consulta. O Otimizador de Consulta (Query Optimizer - QO) recebe o grafo e gera um plano de execução de consulta distribuído (DQEP), usando um modelo de custo baseado em estatísticas de dados e programas armazenadas no Gerenciador de Metadados (Metadata Manager - MM). Para DQEPs que incluem operações para a avaliação de programas de uso paralelo, o otimizador chama o componente Escalonador (Scheduler - SC). Este último acessa o MM para capturar o histórico de desempenho de execução de nós do Grid e custos de avaliação de programas de usuário, além de estatísticas dos resultados intermediários. Baseado nas estatísticas coletadas, o SC aplica um algoritmo de escalonamento de nós do Grid para encontrar um sub-conjunto de nós a serem alocados pelo gerenciador da máquina de execução (Query Engine Manager - QEM), onde serão executados os programas do usuário. O QEM é responsável por implantar os serviços da máquina de execução de consulta (QE) nos nós especificados no DQEP, e gerenciar os seus ciclos de vida durante a execução da consulta. O QEM gerencia o desempenho, em tempo real, dos QEs por consultar as estatísticas de vazão de dados e decidir por realocação, em tempo de execução, das QEs com um plano re-otimizado. Os QEs são implementados como instâncias do framework de execução de consulta [AYRES; PORTO; MELO]. 35 3.3. MOCHA É um middleware proposto pela universidade de Maryland, projetado para interconectar fontes de dados distribuídos sobre uma grande área de rede [RODRIGUES-MARTINEZ; ROSSOUPOULOS, 2000]. Foi projetado para integrar centenas de fontes de dados distribuídas sobre a Web, tendo sido construído com a idéia de que um middleware para um ambiente distribuído de larga escala deve ser auto-extensível. Esta extensibilidade permite o envio de classes Java para os sites remotos de um modo automático, de acordo com as características das fontes de dados. As classes Java são necessárias para executar uma sub-consulta no próprio site, diminuindo o tráfego de dados entre o site e o sistema [PEREIRA BARBOSA, 2001]. A motivação do MOCHA é que os dados armazenados em diversos sites são baseados em tipos de dados complexos, e que a Web tem se tornado, de fato, uma interface de usuário para aplicações em rede. Assim, os usuários necessitam de uma solução que permita, facilmente, integrar os clientes baseados em Web e visualizar os dados disponibilizados pelos mesmos (BIANCARDI, 2005). Os principais componentes da arquitetura MOCHA, mostrados na Figura 6, são: • Processador de consulta (QPC); • Wrappers (DAP); • Repositório de código JAVA (Code Repository); • Catálogo de armazenamento de metadados (Catalog). Figura 6 – Arquitetura do Mocha [BIANCARDI, 2005] A Aplicação Cliente - um applet, um servlet, ou uma Aplicação Java, é usada para submeter consultas ao sistema; o Coordenador de Processamento de Consultas (QPC) - fornece serviços tais como análise de consulta, otimização de consulta, 36 escalonamento de operador de consulta, gerenciamento de catálogo e execução de consulta, além de ser o responsável por implantar todas as funcionalidades necessárias para o cliente e para os sites remotos, a partir dos quais os dados serão extraídos; o Fornecedor de Acesso aos Dados (DAP) - fornece ao QPC um mecanismo de acesso uniforme para uma fonte de dados remota, e executa alguns dos operadores na consulta (aqueles que filtram os dados sendo acessados); e o Servidor de Dados - armazena um conjunto de dados de um site em particular. 3.4. OGSA-DPQ OGSA-DPQ é um framework de integração de dados e orquestração de serviços no qual é possível fazer a coordenação e a incorporação de serviços Web para efetuar análise e recuperação de dados [ALPDEMIR et al., 2003]. Figura 7 – Arquitetura do OGSA-DPQ [ALPDEMIR et al., 2003] Como pode ser observado na Figura 7, o OGSA-DQP usa os serviços oferecidos pelo framework OGSA-DAI para acessar, de forma homogênea, as fontes de dados, potencialmente heterogêneas. Em um nível menor, temos a camada GT3 (Globus Tookit), que é usada tanto pelo OGSA-DAI quanto pelo OGSA-DQP para criação de instâncias, acesso do estado e gerenciamento do tempo de vida das instâncias de serviços. A Figura 8 mostra a interação entre os frameworks OGSA-DQP e OGSA-DAI [BIANCARDI, 2005]. No OGSA-DPQ, instâncias de serviço de execução de consulta são implantadas em nodos de GRID para implementar paralelismo de programas de usuário. Operadores algébricos, tal como, exchange e operation-call, implementam comunicação entre nodos e invocação de programas de usuário, respectivamente [FONTES et al., 2004]. 37 Figura 8 - Interação entre os frameworks OGSA-DPQ e OGSA-DAI. Assim como o OGSA-DAI, o OGSA-DPQ possui algumas restrições que devem ser explicadas. Dentre elas estão as que foram herdadas do próprio OGSA-DAI, já que o mesmo é utilizado pelo OGSA-DPQ, e outras pertencentes somente ao OGSA-DPQ. Uma delas está relacionada com a obtenção dos esquemas das fontes de dados, pois nenhuma integração de esquema e resolução de conflitos é suportada durante a importação dos esquemas. Os esquemas importados são simplesmente acumulados e mantidos localmente. Isso dificulta a vida do usuário final, dado que ele terá grandes dificuldades para integrar "visualmente" os esquemas e resolver conflitos semânticos e/ou estruturais entre os mesmos. Uma outra restrição é que o plano de execução de consulta gerado pelo OGSA-DPQ é estático [FONTES et al., 2004]. Além disso, existe a possibilidade de um ou mais nodos alocados para este plano estático ficarem sobrecarregados, ou a fonte com a qual eles se comunicam não está mais respondendo. Neste sentido, no OGSA-DPQ, não é possível fazer uma análise, em tempo de execução, dos nodos alocados no GRID para que, se necessário, seja feita uma realocação dos mesmos e a geração de um novo plano. 38 [OGSA-DAI] 4. OPEN GRID SERVICE ARCHITECTURE – DATA AND INTEGRATION (OGSA-DAI)¹ 4.1. Introdução A maior parte das empresas utiliza serviços web para se comunicar com o mundo. Este é um dos motivos pelo qual este middleware foi desenvolvido, pois atualmente para se manipular bancos de dados é preciso estar conectado diretamente ao mesmo. Sendo assim foi preciso criar uma estrutura na qual pudesse modificar um banco de dados pela internet, facilitando o acesso a qualquer hora. Outra necessidade é a de juntar tipos diferentes de recursos de dados, pois se estes forem diferentes, como por exemplo, Oracle e MySQL, ficaria impossível a junção dos mesmos. O OGSA-DAI inclui uma coleção de componentes para a manipulação de dados de diversas maneiras e também um uma outra coleção de ferramentas para desenvolver aplicações de clientes. Além disso, umas de suas diversas utilidades seria o fato de este software ser facilmente modificado, fornecendo ao usuário a opção de adicionar novas funcionalidades criadas pelo próprio usuário. Figura 9 – Funcionamento do OGSA-DAI ¹ Este capítulo está baseado no material contido em [OGSA-DAI] 39 Pode-se dizer que o principal foco deste software é na contribuição de um futuro onde os cientistas da computação possam focar o seu conhecimento na análise e processamento de dados ao invés de se preocupar na localização física dos dados, na sua transferência, estrutura e manipulação. O OGSA-DAI é um middleware, ou seja, um programa que faz a ligação entre outros softwares (Figura 9). Este software tem como principal característica o fato de podermos manipular vários recursos de dados ao mesmo tempo. Por exemplo, podemos utilizar, em um ambiente de Grid, recursos de dados relacionais ou banco de dados em XML, sendo que estes dados podem ser consultados, alterados, atualizados e mostrados via web para outros clientes. O OGSA-DAI suporta um número limitado de tecnologias exemplificadas na Tabela 1. SGBD MySQL IBM DB2 Versão Suportada Relacional 3.2.3 em diante --- Microsoft SQL Server --- Oracle 10g Enterprise Edition 10.2.0.1.0 PostgreSQL --- EXist XML Feito desde 03/12/2005 Sistema de arquivos Arquivos --- Observações Detalhes em www.mysql.com OGSA-DAI não suporta a criação ou deleção de bancos de dados usando BD2 . Não Suporta a coluna IMAGE no OGSA-DAI. OGSA-DAI não suporta a criação ou deleção de base de dados usando Oracle. Detalhes em www.postgresql.org É recomendável que a instalação do eXist ocorra dentro de um contêiner com seus próprios serviços Web. Ex: OMIM, SWISSPROT e EMBL. Tabela 1 – Tecnologias Suportadas pelo OGSA-DAI 4.2. Arquitetura do OGSA-DAI A arquitetura OGSA-DAÍ, representada na Figura 10, é composta de várias camadas com suas respectivas funções e finalidades. Dentro destas camadas existem componentes e entre as camadas existem um tipo de interface. 40 Figura 10 - Arquitetura do OGSA-DAI 4.2.1. Camada de dados (data layer) De baixo para cima está a camada de dados que consiste dos recursos de dados que são suportados pelo OGSA-DAI, sendo esses recursos: relacionais, bancos XML, arquivos e diretórios em formatos conhecidos pelo software. 4.2.2. Interface entre camada de dados e camada lógica de negócio Entre a camada de dados e a camada de negócio existe uma interface que permite uma comunicação em ambas as direções de informações. Para que ocorra tal comunicação é preciso que cada recurso de serviço de dados tenha um assessor de recursos de dados que irá controlar acesso para um recurso de dados adjacente. Dentro do OGSA-DAI ainda existe a possibilidade de o usuário construir o seu próprio assessor de recurso de dados para expor novos tipos de recursos de dados (Figura 11). 41 Figura 11 – Data Service Resource 4.2.3. Camada Lógica de Negócios (Business Logic Layer) Esta camada do OGSA-DAI contém a funcionalidade do seu núcleo. Esta consiste de componentes conhecidos como recursos de serviço de dados. Como mostrado na Figura 10, vários recursos de serviços de dados podem ser instalados para expor várias fontes de dados. Existe uma relação de 1-1(um para um) entre recursos de serviços de dados e recursos de dados. Algumas das funcionalidades ou até responsabilidades de um recurso de serviço de dados são listadas abaixo. • Execução de documentos de desempenho – este documento descreve as ações que um recurso de serviço de dados deve tomar no interesse do cliente. Cada ação é conhecida como uma atividade. O OGSA-DAI já inclui um número alto de atividades para que sejam realizadas as operações mais comuns como queries de base de dados, transformação de dados e entrega de dados. • Geração de documentos de resposta – este documento descreve o status da execução de um documento de desempenho e pode conter resultados em forma de dados, por exemplo, os resultados de uma query na base de dados. • Acesso a recursos de dados – interações com os recursos de dados acontecem graças ao componente de recursos de dados. • Funcionalidade de transporte de dados – dados podem ser transportados de um recurso de serviço de dados para um cliente ou outro recurso de serviço de dados qualquer e vice-versa. • Gerência de Sessão – seria a criação, acesso e terminação de objetos de sessão permitindo que estados possam ser guardados através de múltipos pedidos para o recurso de serviço de dados. Todos os pedidos de documentos de desempenho são processados dentro de uma sessão. Sessões também servem para guardar streams que foram usadas pela funcionalidade de transporte de dados sendo assim conhecidas por sessões stream. • Gerência de propriedade – seria a criação, acesso e remoção de propriedades associadas com os recursos de serviços de dados sendo conhecidos como propriedades de recursos de serviços de dados. Estes geralmente são usados 42 para expor os datos, por exemplo, o status de um pedido ou um esquema de recurso de dados adjacente. 4.2.4. Interface entre a camada lógica de negócios e a camada de apresentação Esta interface faz a comunicação com as duas camadas adjacentes, lógica de negócios e de apresentação, em ambas as direções. Ela suporta a chamada de funcionalidades do OGSA-DAI dentro da camada lógica de negócio de um jeito que é independente de um ambiente web particular. Quando pedidos de SOAP (Service Oriented Architecture Protocol) chegam aos serviços de dados do OGSA-DAI, esta interface é usada para passar informações e instruções para a camada lógica de negócio e vice-versa. A seguir é mostrado quais os tipos de informações que são passadas entre estas duas camadas. Camada de apresentação Camada lógica de negócio São enviadas informações sobre os nomes dos data service resourses e • suas propriedades, vomo também identificações de session streams Certificado de Proxy do cliente e credenciais em um formato que não • depende da web. • Documentos de desempenho e dados de clientes. • Informação de configuração de recursos de serviços de dados incluindo drivers para os bancos de dados, URIs dos mesmos, nome e senha de usuários de base de dados, informação sobre atividades suportadas, informação sobre sessão de data service resourse recursos de serviços de dados e simultaneidade suportada. Camada lógica de negócios Camada de apresentação • É passado pela camada de apresentação os documentos de resposta e resultados em forma de dados. • O status do processamento de um pedido dentro de uma sessão em particular. Isto é conhecido como status de pedido de sessão. • Valores para as propriedades de recursos de serviços de dados como esquemas de um recurso de dados adjacente. 43 • Informação sobre as atividades que são suportadas pelos recursos de serviços de dados. Estas atividades são aquelas que podem ser pedidas pelo usuário usando documentos de desempenho. 4.2.5. Camada de Apresentação (Presentation layer) Esta camada encapsula a funcionalidade requerida para expor recursos de serviços de dados usando interfaces que utilizam serviços web. O OGSA-DAI contém dois conjuntos destas funcionalidades encapsuladas, uma compatível com WSRF (Web Services Resourses Framework) e a outra com WSI (Web Services Inter-Operability). 4.2.6. Camada de Cliente (Client layer) Um cliente pode interagir com um data service resourse através de um data service correspondente. O OGSA-DAI também inclui um client toolkit Java que proporciona uma API de alto nível para interação de serviços de dados. Este kit de ferramentas simplifica o desenvolvimento de aplicações fornecendo meios convenientes de construir e enviar pedidos e interpretar as respostas subseqüentes. Quando uma aplicação é escrita usando este kit de ferramentas de ciente, esta poderá interagir e acessar recursos de dados WSRF e WSI transparentemente. 4.3. Serviços de Dados Serviço de dados é um ponto de contato para clientes que queiram acessar, pesquisar ou atualizar um recurso de dados específico, ou até desempenhar outras ações relacionadas a dados usando o OGSA-DAI. Um serviço de dados oferece uma interface que é voltada ao uso de documentos, nela é aceito o uso de documentos de desempenho pelos clientes e o uso de documentos de resposta para os clientes. Um serviço de dados oferece um grande número de operações que permitem que informações sobre o serviço possam ser recuperadas, e também fornece acesso aos recursos do serviço de dados sendo que estes são expostos pelo próprio serviço de dados. 44 4.3.1. Operações Usando Dados -Documento de Desempenho Documentos de desempenho são usados pelos clientes para instruir recursos de serviços de dados a desempenhar atividades. Estas atividades incluem consultas e atualizações, transformação de dados e operações de entrega de dados. Um documento deste tipo poderia conter, nos casos mais simples, apenas uma simples query ou até, em casos mais complexos, um aglomerado de requisições de atividades que podem conter consultas, atualizações, entrega de dados, entre outros. O fato de podermos juntar várias atividades em apenas um documento é uma grande vantagem, pois assim não ocorre o imenso fluxo de dados que teríamos caso tivéssemos que transportar cada atividade usando um pedido ou serviço diferente. As APIs que são concedidas junto com o OGSA-DAI permitem desenvolvedores Java construírem aplicações que geram documentos de desempenho e interpretam documentos de resposta automaticamente. A seguir será descrito a estrutura subjacente e o conteúdo de documentos de desempenho. Na Figura 12 podemos ver um documento de desempenho que é expresso usando XML. A raiz deste documento é o elemento <perform>, logo após vem o elemento <session>, que é opcional, pois ele pode conter nenhuma ou várias atividades. O elemento de atividade é aquele que contém tudo que o recurso de dados deverá realizar. Este deve conter um único valor para o atributo name. Para que várias atividades possam ser enviadas juntas é preciso que o stream de saída (output stream) de uma atividade seja referenciado pelo stream de entrada (input stream) da próxima atividade. Na Figura 13 é exibida um exemplo de documento de desempenho. Figura 12 - Documento de desempenho contendo elemento de sessão (session element), elemento de atividade (activity element) e um ponto final (end-point) 45 Figura 13 – Exemplo de documento de desempenho Sendo assim todos os dados que estiverem entre estas atividades serão entregues de volta ao cliente através de um documento de resposta. -Documento de Resposta Um documento de resposta é usado para responder ao usuário quando este envia um documento de desempenho para um serviço de dados. O conteúdo deste documento de resposta pode variar de acordo com o que foi enviado. Por exemplo, o documento de resposta pode conter dados resultantes de atividades descritas no documento de desempenho. Sendo assim, ao receber um documento de resposta o usuário poderá analisá-lo para saber se ocorreu algum erro ou então para extrair algo que lhe seja de interesse. Figura 14 - Documento de resposta (dir) resultante do documento de desempenho (esq) Neste exemplo da Figura 14 podemos observar um documento de desempenho que utiliza um end-point chamado myActivityOutput, sendo assim este documento será processado de modo síncrono e por isso o documento de resposta só será enviado de volta para o cliente quando os pedidos forem todos processados. Analisando mais de perto o corpo deste documento podemos ver que ele possui um elemento <session> que contem a identificação da sessão na qual o pedido entrou para ser processado, um elemento <request> que define o status em que se encontra o pedido, um elemento <result> para cada uma das atividades contidas no documento e também 46 uma seção denominada CDATA que irá conter os dados que resultaram do processamento das atividades. Outro exemplo deste documento pode ser encontrada na Figura 15 e o seu documento de resposta correspondente na Figura 16. Caso o documento enviado não contenha nenhum ponto de saída então o processamento irá ocorrer de forma assíncrona, ou seja, nenhum dado será retornado no documento de resposta para o usuário e por isso não será mais preciso esperar que todas as atividades sejam concluídas. Sendo assim este documento poderá ser enviado assim que o pedido for inicializado. Por causa disso o documento de resposta resultante somente irá conter elementos do tipo <response> e <request>. Figura 15 - Exemplo de Documento de Desempenho enviado de forma Síncrona Figura 16 - Documento de resposta contendo os dados resultantes 4.4. Recursos de Serviços de Dados Os recursos de serviços de dados que servem para receber os documentos enviados pelos serviços de dados e então analisá-los e validá-los. Após isso as atividades são executadas e então é criado o documento de resposta para que possa ser enviado de volta para o serviço de dados. 47 Figura 17 - Interação usando uma interface orientada a documentos Na Figura 17 podemos observar com mais precisão a interação destas camadas usando documentos para fazer a comunicação entre elas. 4.5. Assessor de Recursos de Dados Estes assessores servem para fazer a comunicação entre os recursos de serviços de dados e os bancos de dados sendo utilizados. Com o assessor de recursos de dados do OGSA-DAI o usuário pode criar o seu próprio assessor de recurso de dados para que este possa fazer a comunicação a um banco de dados que ainda não são suportados pelos assessores listados na Tabela 2. Assessor de Recurso de Dados Descrição Assessores de dados padrões JDBC Data ResourceAccessor Fornece acesso a uma única base de dados JDBC relacional XMLDB Data Resource Accessor Fornece acesso a uma única base de dados XML Files Data Resource Accessor Fornece acesso a um único sistema de arquivos Assessores de integração de dados SQL Multiple Data Resource Accessor Agrega um ou mais recurso de serviço de dados Assessores de demonstração Demo Factory Data Resource Accessor Exemplo de um assessor que pode criar dinamicamente recursos de serviços de dados. Demo Instance Data Resource Accessor Exemplo de assessor utilizado pelo resurso de serviço de dados. Demo Transient Factory Data Resource Accessor Exemplo que pode criar recursos de serviços de dados transientes. Demo Transient Instance Data Resource Accessor Exemplo de assessor utilizado pelorecurso de serviço de dados. Tabela 2 - Assessores de dados fornecidos pelo OGSA-DAI 4.6. Relacionamento A seguir será descrito como é o relacionamento entre os serviços de dados (data service), fontes de serviços de dados (data service resource), assessores de fontes de 48 serviços de dados (data service resource accessors) e as fontes de dados (data resources), ou seja, será descrita e ilustrada a interação entre eles. Na Figura 18 podemos identificar vários componentes. A seguir estarão algumas de suas características. Primeiramente um serviço de dados (data service) pode expor nenhuma ou várias fontes de serviço de dados (data service resource). O serviço de dados e a fonte de serviço de dados (data service resource) precisam estar em um mesmo servidor. Uma fonte de serviço de dados expõe uma fonte de dados (data resource). A fonte de dados (data resource) não precisa estar no mesmo servidor que a fonte de serviço de dados (data service resource). O assessor de fonte de dados (data resource accessor) gerencia as interações com as fontes de dados em nome da fonte de serviço de dados. Uma fonte de serviço de dados possui um conjunto de arquivos de configuração que especificam as atividades suportadas, informação sobre a sessão e o nome da classe do assessor de fonte de dados. Um assessor de fontes de dados também possui um conjunto de arquivos de configuração que fala sobre a fonte de dados relacionada. Figura 18 – Exemplo de Entrega de dados 4.7. Especificação Funcional O objetivo desse capítulo é explicar como o OGSA-DAI se comunica com as fontes de dados e como ambas se comunicam com o middleware. 4.7.1. Representando uma Fonte de Dados no OGSA-DAÍ Primeiramente, é preciso obter as informações das fontes de dados desejadas, como por exemplo, o Driver de cada banco (Tabela 3 – Anexo A), a URI da fonte de dados (Tabela 4 – Anexo A) e a versão dessa fonte (Tabela 1 – Cap 4). Com isso em mãos é 49 preciso criar um resourse file contendo os argumentos necessários. O passo seguinte seria realizar o transporte desse arquivo para o servidor Tomcat de sua máquina (Vide Anexo A). Uma declaração resourse file (Figura 19) contêm as seguintes informações para o recurso: • Resourse ID – Corresponde ao nome do arquivo; • Resourse Type – Tipo dos nomes dos recursos do OGSA-DAI; • Creation Time – valor em milissegundos a partir do inicio do evento. Também pode ser nulo; • Termination Time – valor em milissegundos a partir do inicio do evento. Também pode ser nulo; • Nenhuma ou várias propriedades da persistência do recurso; o Delimitado por Properties e End; o Os valores são strings; • Nenhuma ou várias propriedades de configuração; o Delimitado pelo Config e End; o Os valores são strings; • Nenhuma ou várias propriedades de apoio; o Delimitado por Activities e End; id=RESOURCE-ID type=RESOURCE-TYPE creationTime=CREATION-TIME terminationTime=TERMINATION-TIME PROPERTIES [NAME=VALUE]* END CONFIG [KEY=VALUE]* END ACTIVITIES [ACTIVITY-NAME=ACTIVITY-ID]* END Figura 19 – Resourse File 50 4.7.2. Fluxograma de Execução O OGSA-DAI possui várias classes que fazem consultas em bancos de dados. Um URI, um resource file e um comando SQL são os parâmetros necessários para fazer uma consulta em uma fonte de dados integrada ao OGSA-DAI Client. Todos estes parâmetros devem estar incluídos numa classe específica do middleware que é utilizada para fazer acesso ao banco. O conceito básico é que o cliente irá construir um fluxo de trabalho das atividades que serão executadas sobre o OGSA-DAI Server. Os dois elementos chaves são as atividades e o fluxo de trabalho. As atividades são os módulos básicos do OGSA-DAI. Eles são discretos pacotes que fazem um passo lógico em um processo. As atividades são divididas em várias categorias, algumas específicas, outras não. As categorias são as seguintes: • Input data delivery – atividade que recupera as entradas remotas nas fontes de dados. • Data Access and collection - atividades que acessa os dados, realizada normalmente em recursos como bancos de dados. • Data transform – atividades que transforma os dados de um formato para o outro. • Output data delivery – atividade que envia dados ao OGSA-DAI. • Management and control – atividade que gerencia o OGSA-DAI Server. Cada categoria contém atividades que se focam em torno de uma tarefa específica e só estão interessadas em realizar essa tarefa, por exemplo, a atividade SQLQuery lida com a missão de resgatar um banco de dados SQL e obter um conjunto de resultados. As principais etapas que terão de ser abordadas através de atividades são os seguintes: • Examina o banco de dados • Transforma os resultados para um formato mais utilizável • Transforma os resultados para um formato mais eficiente. • Mostra os resultados de volta para o cliente. Para explicar melhor o funcionamento, utilize como base a seguinte consulta mostrada na Figura 20 realizada pelo cliente. SELECT * FROM littleblackbook WHERE id <10; Figura 20 – Consulta realizada pelo cliente 51 Para facilitar a conexão com o servidor, é fornecido um Serverproxy que implementa um servidor de interface. É necessário saber as URL dos bancos de dados para serem fornecidos ao servidor. A Figura 21 é um Proxy da representação de um servidor OGSA-DAI da parte do cliente. Ele pode ser obtido através de proxies para cada serviço web e, por isso, cada recurso, implantado sobre o servidor OGSA-DAI. Server mServer; public void setupServer(String serverURLStr) throws ClientToolkitException, MalformedURLException { mServer = new ServerProxy(); mServer.setDefaultBaseServicesURL(new URL(serverURLStr)); } Figura 21 - Servidor Proxy do OGSA-DAI A classe Server fornece um exemplo de métodos de acesso aos proxies que representam os diferentes recursos disponíveis no servidor do OGSA-DAI. As proxies, que correspondem aos seis tipos de recursos do OGSA-DAI, são: • DataRequestExecutionResource • DataSinkResource • DataSourceResource • DataResource • RequestResource • SessionResource A Figura 22 mostra um exemplo de utilização de alguns desses recursos. O primeiro deles é o DataRequestExecutionResource para um DRER. Seria um pedido de execução de dados dos recursos que aceita o fluxo de trabalho do cliente e, executa e retorna estes resultados. Uma DRER pode ser vista como um fluxo de trabalho de gestão e execução dos recursos. 52 DataRequestExecutionResource mDRER; public void setupDRER(ResourceID drerID) throws ServerException, ClientToolkitException { mDRER = mServer.getDataRequestExecutionResource(drerID); } Figura 22 – DataRequestExecutionResource Como a ligação básica foi efetuada, as atividades podem ser desenvolvidas para a utilização. São necessárias quatro atividades: • SQLQuery • TupleToWebRowSetCharArrays • CharArraysResize • DeliverToRequestStatus Ao criar um fluxo de trabalho, todas as entradas e saídas das atividades deverão ser devidamente conectadas. Caso contrário, ocorrerá um erro no decorrer da execução. O primeiro passo é criar a atividade SQLQuery. A Figura 23 mostra o código para a criação da atividade para uma consulta SQL e um recurso de dados. public SQLQuery makeSQLQuery(ResourceID dataResourceID, String sqlStr) { SQLQuery tempQuery = new SQLQuery(); tempQuery.setResourceID(dataResourceID); tempQuery.addExpression(sqlStr); return tempQuery; } Figura 23 – SQL Query Os parâmetros do método são os dados ResourceID para o recurso que está a ser orientada, por exemplo, a um banco de dados MySQL exibidas pelo servidor do OGSA-DAI e da consulta SQL representada pelo sqlStr. A atividade SQLquery não verifica o comando SQL antes da execução para que esse comando seja validado. Esta atividade exige que o método setResourceID seja utilizado para segmentar um DataResource. O próximo passo é a criação da atividade TupleToWebRowSetCharArrays. Esta atividade converte tuples, um conjunto de variáveis, tais como os de saída de uma consulta de uma atividade web. Esta atividade não tem de ser alvo de um recurso, ela 53 exige que outra atividade verifique a entrada. Nesta fase, apenas uma instância é criada usando um método semelhante ao do SQLQuery (Figura 24). Public TupleToWebRowSetCharArrays makeTupleToWebRowSetCharArrays() { return new TupleToWebRowSetCharArrays(); } Figura 24 - TupleToWebRowSetCharArrays Essa atividade pode causar problema quando utilizado com produtividade via SOAP HTTP, o meio utilizado para a comunicação cliente-servidor pelo middleware. A atividade CharArraysResize (Figura 25) reestrutura as matrizes em uma dimensão que resulta na melhoria da eficiência quando transportá-los via SOAP sobre HTTP. O tamanho dos arrays pode ser especificado pelo cliente e, se necessário, sintonizado. Public CharArraysResize makeCharArraysResize() { CharArraysResize resize = new CharArraysResize(); resize.addArraySizeInput(5000); return resize; } Figura 25 - CharArraysResize A entrega de dados no OGSA-DAI, pode ser realizada de várias formas, através de FTP, GridFTP, SMTP, ou, como na Figura 26, através de uma atividade DeliverToRequestStatus. Esta atividade assegura que quaisquer dados que serão recebidos, serão colocadas no pedido de status que é retornado a um cliente por um DRER quando o seu workflow completa a execução. A atividade de transformação referida, não tem de ser explicitamente orientados para um recurso. public DeliverToRequestStatus makeDeliverToRequestStatus(){ return new DeliverToRequestStatus(); } Figura 26 – DeliverToRequestStatus Dividir a atividade de entrega de dados permite uma integração mais fácil no corpo principal do código. Ao realizar uma consulta específica, como mostrada na Figura 20, a aplicação do OGSA-DAI deve conter uma atividade chamada grupo de recursos. Somente assim 54 ela poderá direcionar uma consulta SQL para diversas fontes de dados. A atividade gerada é o CreateResourceGroup. Ela espera que as ID’s dos grupos de recursos como entradas. Para o exemplo da Figura 27, existem dois recursos que agrupados em um único grupo de recurso. String id1 = "Resource1"; String id2 = "Resource2"; Figura 27 – Recursos Os IDs dos recursos são colocados em uma string (array) e passado para a atividade CreateResourceGroup como um parâmetro (Figura 28). String resources = new String[]{ id1, id2 }; CreateResourceGroup create = new CreateResourceGroup(); create.addResourceIdsAsArray(resources); Figura 28 – Recursos passados como parâmetros A lista da Figura 29 mostra um pedido em que a saída da atividade CreateResourceGroup, que é a identificação do recém criado recurso, é entregue ao cliente. DeliverToRequestStatus deliverToRequestStatus1 = new DeliverToRequestStatus(); deliverToRequestStatus1.connectInput(create.getOutput()); PipelineWorkflow createWorkflow = new PipelineWorkflow(); createWorkflow.add(create); createWorkflow.add(deliverToRequestStatus1); Figura 29 – Pedido entregue ao cliente Depois que o pedido tenha sido executado o recurso ID do grupo está disponível a partir do resultado CreateResourceGroup. (Figura 30) Drer.execute(createWorkflow, RequestExecutionType.SYNCHRONOUS); ResourceID groupID = create.nextResult(); Figura 30 – Pedido disponível 55 Após a geração da atividade CreateResourceGroup, outra atividade realiza a consulta em múltiplos BD’s, chamada de sqlBag, que tem como funcionalidade executar um comando SQL em todas as fontes listadas em um grupo de fonte de dados. A atividade sqlBag (Figura 31) possui função de agrupar esquemas de fontes de dados diferentes. Ao mesmo tempo em que essa atividade dispara a query para os bancos, o mesmo recebe os resultados e integrando-os em um único resultset. <sqlBag name="sqlAnd"> <sqlStatement value="SELECT * FROM littleblackbook WHERE id=5"/> <timeout> 100000 </ timeout> <sqlBagOutput name="sqlOutput"/> </sqlBag> </ sqlBag> Figura 31 – sqlBag Os elementos da classe são: • Name - nome exclusivo para a atividade dentro do escopo de um pedido. • sqlStatement (obrigatório) - defini a consulta SQL a ser enviada para as fontes de dados. • timeout (opcional) - a quantidade de tempo dentro dos recursos de dados deve retornar resultados. Deve ser um número não negativo e longo. Se o valor fornecido for zero, então o tempo limite é considerado ilimitado. Se o valor for superior a zero, então é considerado o mínimo entre o valor providenciado e o máximo tempo limite definido no padrão SQL data resource accessor. Se nenhum valor for fornecido, então o tempo limite é igual ao tempo limite definido no SQL data resource accessor. • sqlBagOutput (obrigatório) - output stream que produz os resultados da consulta SQL. Agora, o novo recurso disponível no CreateResourceGroup pode ser usado como meta para uma consulta no sqlBag, que executa a consulta. A criação de uma consulta ao sqlBag é mostrada na Figura 32. SQLBag query = new SQLBag(); query.setResourceID(groupID); query.addExpression("SELECT * FROM littleblackbook WHERE id<3"); Figura 32 – Consulta realizada pelo sqlBag 56 Mais de uma expressão SQL podem ser adicionadas como o método da Figura 32, caso se deseje realizar diversas consultas ao banco. Na consulta realiza neste trabalho, os resultados são transferidas para a atividade TupleToWebRowSetCharArrays que os transforma como XML e são entregues (Figura 33). Após executar o pedido da Figura 36, os resultado podem ser recuperados a partir da atividade TupleToWebRowSetCharArrays. Para cada expressão SQL que foi adicionada ao sqlBag, haverá um conjunto resultado disponível. Cada chamada para TupleToWebRowSetCharArrays.nextResult() retorna um objeto java.sql.ResultSet para proporcionar o acesso à linha de base dos resultados, como exemplificado na Figura 34. TupleToWebRowSetCharArrays tupleToWebRowSet = new TupleToWebRowSetCharArrays(); tupleToWebRowSet.connectDataInput(query.getDataOutput()); DeliverToRequestStatus deliverToRequestStatus = new DeliverToRequestStatus(); deliverToRequestStatus.connectInput(tupleToWebRowSet.getResultOutput()); PipelineWorkflow pipeline = new PipelineWorkflow(); pipeline.add(query); pipeline.add(tupleToWebRowSet); pipeline.add(deliverToRequestStatus); Figura 33 – Atividade TupleToWebRowSetCharArrays drer.execute(pipeline, RequestExecutionType.SYNCHRONOUS); while (tupleToWebRowSet.hasNextResult()) { ResultSet rs = tupleToWebRowSet.nextResultAsResultSet(); // iterate through the rows of the result set while (rs.next()) { ... // do something with the result values } } Figura 34 - TupleToWebRowSetCharArrays.nextResult 57 A integração dos resultados das sub-consultas também é realizada pela atividade sqlBag, que coleta todos os resultados da query e os coloca em um único result set que também incluirá linhas duplicadas, caso existam. 4.8. Modificando Um Banco de Dados O OGSA-DAI permite que modifique o banco de dados para que se possa realizar algumas atualizações. Esse tipo de modificação é realizada pela atividade sqlUpdateStatement. Essa atividade executa uma ou mais seqüências de uma declaração SQL através de uma conexão JDBC. O código da Figura 35 mostra um exemplo da utilização da atividade. <sqlUpdateStatement name="statement"> <!-- value of first parameter --> <sqlParameter position="1" from="datatoinsert"/> <!-- value of second parameter --> <sqlParameter position="2">321</sqlParameter> <expression> insert into littleblackbook values ? ? </expression> <resultStream name="results"/> </sqlUpdateStatement> Figura 35 – sqlUpdateStatement Os elementos da atividade são: • Name: nome exclusivo da atividade dentro escopo de um pedido • sqlParameter (zero ou mais): define um parâmetro. o Position: posição dentro da expressão do elemento o From (opicional): nome da saída de outra atividade que fornece o valor desse parâmetro o Se o valor do From não for especificado, então esse elemento deve conter o valor do parâmetro. o A seqüência em que os elementos aparecem é importante quando a atividade sqlParameter fornecer o valor de mais de um parâmetro. A seqüência em que os elementos aparecem é a seqüência a ser entregue (Figura 36). • Expression (Obrigatório): declaração da atualização SQL. 58 o A atualização do SQL está dentro desse elemento. o ?: pode ser usado no lugar de qualquer parâmetro definido no sqlParameter • resultStream (Obrigatório): produz o fluxo da saída do elemento XML que detém o numero de linhas alteradas. <sqlParameter position ="1" from="inputStream"/> <sqlParameter position ="3" from="inputStream"/> <sqlParameter position ="2" from="inputStream"/> Figura 36 - sqlParameter 4.9. Vantagens Existem muitas razões pelas quais o OGSA-DAI pode ser mais adequado para o acesso aos dados e integração, requisitados em um ambiente grid. Estas incluem: • Adapta-se com modelo grid / web service. • O Workflow encapsula múltiplas interações de web services em uma única interação. • Solução para múltiplos acessos aos dados, transformação, distribuição e integração de cenários sem a necessidade de desenvolver atividades específicas de aplicativo. • Extensa base de dados para consultas, atualizações, transformação e distribuição. • Framework extensível e versátil, ou seja, desenvolvedores podem adicionar ou personalizar funcionalidades. • Plataformas independentes. Roda em qualquer plataforma que suporte Java. • Camadas de segurança complementares podem ser fornecidas, se necessário. Por exemplo, autorização pode ser feito no nível de serviço da web e / ou ao nível dos recursos. • Transparência da localização da base de dados e os tipos de produtos. • Programação em uma linguagem neutra. O web services podem ser acessados a partir de clientes desenvolvidos em qualquer linguagem que suporta interação com web services. • Funciona muito bem com outros middlewares que suportam grid, por exemplo, Axis / Tomcat e Globus Toolkit. 59 4.10. Desvantagens O problema na utilização OGSA-DAI inclui: • O acesso via Web é mais lento do que o acesso direto aos dados ou então via uma aplicação de web service dedicada. Em particular, OGSA-DAI pode não ser adequado se: • Existe uma única fonte de dados que não vai mudar. • Não tem nenhuma requisição para transformação de dados. • O usuário querer ter um acesso rápido aos dados em um único recurso. 60 5. ESTUDO DE CASO 5.1. Descrição da Aplicação Ao realizar uma consulta em seus BD’s, um Banco Privado deseja saber, dentre as pessoas que já tenham os dados cadastrados em suas fontes, quais os telefones para eventuais consultas. Essa informação é necessária, pois, na matriz desse banco, ocorrem diversos telefonemas para cadastramento de habilitação da função de cartão de crédito para clientes que não a possuem. Para possibilitar a habilitação, sempre que houver a necessidade, e caso o cliente não tenha a função em seu cartão, é realizada uma consulta nos dados cadastrais de todos os clientes que possuem cartão desse banco, para descobrir aqueles que possuem a função habilitada. Essa consulta só é possível, pois nos cadastros dos clientes, existe a informação do tipo do cartão. Isso é feito com o objetivo de tentar estabelecer um contato e solicitar uma possível aderência do cliente. Entretanto, caso não exista um banco de dados central, e as informações podem estar presentes em diferentes filiais desse Banco, sempre que existe a necessidade de fazer este tipo de consulta, é necessário acessar as fontes de dados das filiais e da matriz. Além disso, os dados podem estar armazenados em dois tipos de fontes, possuindo representações diferentes, já que foram desenvolvidos de uma maneira independente. Assim, é necessário o acesso e a integração destas duas fontes de dados, distribuídas e heterogêneas, de forma que uma única visão, uniforme e homogênea, seja fornecida. A base de dados "littleblackbook1", presente na unidade matriz, tem seus dados armazenados segundo o modelo de dados relacional armazenado em MySQL, como pode ser visto na Figura 37. Figura 37 – Esquema da Fonte Relacional “littleblackbook” da Matriz 1 Utilizamos um banco de dados MySQL como base e dentro dele criamos uma tabela chamada littleblackbook com o auxilio do OGSA-DAI. 61 O banco de dados "littleblackbook", presente nas unidades da filial, tem seus dados armazenados no modelo de dados relacional em OracleSQL, como pode ser visto na Figura 38. Figura 38 – Esquema da fonte Relacional “littleblackbook” da Filial Como as fontes de dados devem possuir o mesmo esquema, em termos de nome de tabelas e nome de atributos, uma mesma consulta é encaminhada para cada fonte de dados a ser integrada (Figura 39). Figura 39 - Consulta na linguagem SQL Para realizar a Integração é necessário ter o OGSA-DAI em todas as maquinas. A Figura 40 ilustra um exemplo de uma aplicação, onde de um lado está o OGSA-DAI Cliente e do outro lado as duas fontes de dados que serão integradas. Figura 40 – Diagrama de Implantação 62 5.2. Resourse File dos Bancos de Dados Na máquina onde está rodando a aplicação cliente deverá ser criado os arquivos de recursos (Resource File) de cada banco de dados que se deseja fazer a integração. Na Figura 41 é mostrado o Resource File necessário para se conectar com banco MySQL presente na Matriz do banco privado. id=MySQLDataResource type=uk.org.ogsadai.DATA_RESOURCE creationTime=null terminationTime=null PROPERTIES uk.org.ogsadai.resource.dataresource.product=MySQL uk.org.ogsadai.resource.dataresource.vendor=MySQL uk.org.ogsadai.resource.dataresource.version=5 END CONFIG dai.driver.class=org.gjt.mm.mysql.Driver dai.data.resource.uri=jdbc:mysql://localhost:3306/ogsadai dai.login.provider=uk.org.ogsadai.LOGIN_PROVIDER END ACTIVITIES uk.org.ogsadai.SQLQuery=uk.org.ogsadai.SQLQuery uk.org.ogsadai.SQLUpdate=uk.org.ogsadai.SQLUpdate uk.org.ogsadai.SQLBulkLoadTuples=uk.org.ogsadai.SQLBulkLoadTuples uk.org.ogsadai.GetAvailableTables=uk.org.ogsadai.GetAvailableTables uk.org.ogsadai.SQLParameterisedQuery=uk.org.ogsadai.SQLParameterisedQuery uk.org.ogsadai.SQLParameterisedUpdate=uk.org.ogsadai.SQLParameterisedUpdate uk.org.ogsadai.ExtractTableSchema=uk.org.ogsadai.ExtractTableSchema END dataResourceClass=uk.org.ogsadai.resource.dataresource.jdbc.JDBCDataResource Figura 41 - SQLServer Na Figura 42 é mostrado o Resource File necessário para se conectar com banco OracleSQL presente na Filial desse banco privado. 63 id=OracleDataResource type=uk.org.ogsadai.DATA_RESOURCE creationTime=null terminationTime=null PROPERTIES uk.org.ogsadai.resource.dataresource.product=Oracle uk.org.ogsadai.resource.dataresource.vendor=Oracle uk.org.ogsadai.resource.dataresource.version=10g END CONFIG dai.driver.class=oracle.jdbc.driver.OracleDriver dai.data.resource.uri=jdbc:oracle:thin:@myhost:1521:ogsadai dai.login.provider=uk.org.ogsadai.LOGIN_PROVIDER END ACTIVITIES uk.org.ogsadai.SQLQuery=uk.org.ogsadai.SQLQuery uk.org.ogsadai.SQLUpdate=uk.org.ogsadai.SQLUpdate uk.org.ogsadai.SQLBulkLoadTuples=uk.org.ogsadai.SQLBulkLoadTuples uk.org.ogsadai.GetAvailableTables=uk.org.ogsadai.GetAvailableTables uk.org.ogsadai.SQLParameterisedQuery=uk.org.ogsadai.SQLParameterisedQuery uk.org.ogsadai.SQLParameterisedUpdate=uk.org.ogsadai.SQLParameterisedUpdate uk.org.ogsadai.ExtractTableSchema=uk.org.ogsadai.ExtractTableSchema END dataResourceClass=uk.org.ogsadai.resource.dataresource.jdbc.JDBCDataResource Figura 42 - OracleSQL 5.3. Criando um Grupo de Fonte de Dados Depois de ter adquirido o resource file dos bancos de dados e necessário criar uma atividade (CreatResourceGroup), onde serão especificadas todas as fontes de dados que serão integradas (Figura 43). String id1 = "MySQLDataResource"; String id2 = "OracleDataResource"; String resources = new String[]{ id1, id2}; CreateResourceGroup create = new CreateResourceGroup(); create.addResourceIdsAsArray(resources); 64 DeliverToRequestStatus deliverToRequestStatus1 = new DeliverToRequestStatus(); deliverToRequestStatus1.connectInput(create.getOutput()); PipelineWorkflow createWorkflow = new PipelineWorkflow(); createWorkflow.add(create); createWorkflow.add(deliverToRequestStatus1); drer.execute(createWorkflow, RequestExecutionType.SYNCHRONOUS); ResourceID groupID = create.nextResult(); Figura 43 – Modelo de grupo de fonte de dados 5.4. Criando uma Consulta Logo após de ter criado um grupo de fonte de dados é necessário cria outra atividade que realizara as consultas as fontes de dados que o Banco Privado possui (Figura 44). SQLBag query = new SQLBag(); query.setResourceID(groupID); query.addExpression("SELECT * FROM littleblackbook WHERE id<10"); TupleToWebRowSetCharArrays tupleToWebRowSet = new TupleToWebRowSetCharArrays(); tupleToWebRowSet.connectDataInput(query.getDataOutput()); DeliverToRequestStatus deliverToRequestStatus = new DeliverToRequestStatus(); deliverToRequestStatus.connectInput(tupleToWebRowSet.getResultOutput()); PipelineWorkflow pipeline = new PipelineWorkflow(); pipeline.add(query); pipeline.add(tupleToWebRowSet); pipeline.add(deliverToRequestStatus); drer.execute(pipeline, RequestExecutionType.SYNCHRONOUS); while (tupleToWebRowSet.hasNextResult()) { ResultSet rs = tupleToWebRowSet.nextResultAsResultSet(); // itera através das linhas do result set while (rs.next()) { 65 // Neste local pode-se tratar o resultado da consulta } } createWorkflow.add(deliverToRequestStatus1); Figura 44 – Modelo de consulta 5.5. Resultado da Consulta A Tabela 3 mostra a consulta realizada pelo OGSA-DAÍ na Fonte de dados da Matriz e Tabela 4 mostra a consulta realizada na Filial. Nome | Endereço | Telefone Mario Krause | 45 Krause Avenue, Southampton | 272940105 | débito | Tipo_Cartao Ally Jackson | 43 Jackson Lane, San Jose | 27258982 | débito Tom Thompson | 17 Thompson Gardens, Winchester | 273712657 | débito Craig Atkinson | 87 Atkinson Street, Edinburgh | 27972611 | débito Kostas Atkinson | 30 Atkinson Street, Edinburgh | 2712317111 | débito Craig Thompson | 122 Thompson Road, San Jose | 272010467 | débito Ali Sugden | 1 Sugden Lane, San Jose | 273140125 | débito Mario Krause | 120 Krause Place, Edinburgh | 27787831 | débito Malcolm Dobrzelecki | 128 Dobrzelecki Street, Edinburgh | 2742529 | débito Tom Chue Hong | 59 Chue Hong Lane, San Jose | 27112289 | débito Bartosz Scott | 26 Scott Place, Edinburgh | 2737164 | débito Kostas Anjomshoaa | 119 Anjomshoaa Crescent, Southampton | 277592124 | débito Craig Dobrzelecki | 25 Dobrzelecki Crescent, Southampton | 277811829 | débito David Scott | 89 Scott Avenue, Southampton | 27125717 | débito Ali Atkinson | 40 Atkinson Crescent, Southampton | 2710662105 | débito Craig Krause | 100 Krause Street, Edinburgh | 273857 | débito David Antonioletti | 80 Antonioletti Road, San Jose | 27577882 | débito Bartosz Hume | 35 Hume Drive, Winchester | 27809757 | débito Malcolm Theocharopoulos | 2 Theocharopoulos Place, Edinburgh | 2799311 | débito Neil Theocharopoulos | 106 Theocharopoulos Place, Edinburgh | 278861111 | débito Malcolm Hume | 81 Hume Lane, San Jose | 273610267 | débito Tabela 3 – Resultado da Consulta na Matriz (MySQL) 66 Nome Tom Scott Mario Atkinson Mike Theocharopoulos David Anjomshoaa Mario Illingworth Mike Sugden Malcolm Chue Hong Ali Krause Bartosz Krause Bartosz Karasavvas Ali Chue Hong Mario Hume David Anjomshoaa Ali Scott Craig Theocharopoulos Malcolm Karasavvas Kostas Jackson | | | | | | | | | | | | | | | | | | Endereco 58 Scott Crescent, Southampton 86 Atkinson Crescent, Southampton 10 Theocharopoulos Avenue, Southampton 80 Anjomshoaa Crescent, Southampton 120 Illingworth Street, Edinburgh 115 Sugden Road, San Jose 128 Chue Hong Drive, Winchester 6 Krause Place, Edinburgh 27 Krause Place, Edinburgh 95 Karasavvas Gardens, Winchester 61 Chue Hong Lane, San Jose 87 Hume Road, San Jose 105 Anjomshoaa Street, Edinburgh 1 Scott Crescent, Southampton 28 Theocharopoulos Place, Edinburgh 3 Karasavvas Road, San Jose 31 Jackson Lane, San Jose | | | | | | | | | | | | | | | | | | Telefone 275692124 274211829 27105717 279162105 271857 27157882 27249757 27409311 2712361111 2754455 2712010267 2711169125 27342931 2773843 27534329 27643689 2762960 | | | | | | | | | | | | | | | | | | Tipo_Cartao débito débito débito débito débito débito débito débito débito débito débito débito débito débito débito débito débito Tabela 4 – Resultado da Consulta da Filial (Oracle) Depois de ter especificado os banco de dados, ter criado a atividade CreatResourceGroup, onde nesta atividade é passado todas as informações sobre as fontes de dados que serão integradas, e de ter criado uma outra atividade (SQLBag) que realiza consultas ao grupo especificado, a Tabela 5 mostra o resultado desta consulta realizada nas fontes de dados do Banco Privado. Nome | Endereco | Telefone | Tipo_Cartao Mario Krause | 45 Krause Avenue, Southampton | 272940105 | débito Ally Jackson | 43 Jackson Lane, San Jose | 27258982 | débito Tom Thompson | 17 Thompson Gardens, Winchester | 273712657 | débito Craig Atkinson | 87 Atkinson Street, Edinburgh | 27972611 | débito Kostas Atkinson | 30 Atkinson Street, Edinburgh | 2712317111 | débito Craig Thompson | 122 Thompson Road, San Jose | 272010467 | débito Ali Sugden | 1 Sugden Lane, San Jose | 273140125 | débito Mario Krause | 120 Krause Place, Edinburgh | 27787831 | débito Malcolm Dobrzelecki | 128 Dobrzelecki Street, Edinburgh | 2742529 | débito Tom Chue Hong | 59 Chue Hong Lane, San Jose | 27112289 | débito Bartosz Scott | 26 Scott Place, Edinburgh | 2737164 | débito Kostas Anjomshoaa | 119 Anjomshoaa Crescent, Southampton | 277592124 | débito Craig Dobrzelecki | 25 Dobrzelecki Crescent, Southampton | 277811829 | débito David Scott | 89 Scott Avenue, Southampton | 27125717 | débito Ali Atkinson | 40 Atkinson Crescent, Southampton | 2710662105 | débito Craig Krause | 100 Krause Street, Edinburgh | 273857 | débito David Antonioletti | 80 Antonioletti Road, San Jose | 27577882 | débito Bartosz Hume | 35 Hume Drive, Winchester | 27809757 | débito Malcolm Theocharopoulos | 2 Theocharopoulos Place, Edinburgh | 2799311 | débito Neil Theocharopoulos | 106 Theocharopoulos Place, Edinburgh | 278861111 | débito Malcolm Hume | 81 Hume Lane, San Jose | 273610267 | débito 67 Tom Scott | 58 Scott Crescent, Southampton | 275692124 | débito Mario Atkinson | 86 Atkinson Crescent, Southampton | 274211829 | débito Mike Theocharopoulos | 10 Theocharopoulos Avenue, Southampton | 27105717 | débito David Anjomshoaa | 80 Anjomshoaa Crescent, Southampton | 279162105 | débito Mario Illingworth | 120 Illingworth Street, Edinburgh | 271857 | débito Mike Sugden | 115 Sugden Road, San Jose | 27157882 | débito Malcolm Chue Hong | 128 Chue Hong Drive, Winchester | 27249757 | débito Ali Krause | 6 Krause Place, Edinburgh | 27409311 | débito Bartosz Krause | 27 Krause Place, Edinburgh | 2712361111 | débito Bartosz Karasavvas | 95 Karasavvas Gardens, Winchester | Ali Chue Hong | 61 Chue Hong Lane, San Jose | 2712010267 | débito 2754455 | débito Mario Hume | 87 Hume Road, San Jose | 2711169125 | débito David Anjomshoaa | 105 Anjomshoaa Street, Edinburgh | 27342931 | débito Ali Scott | 1 Scott Crescent, Southampton | 2773843 | débito Craig Theocharopoulos | 28 Theocharopoulos Place, Edinburgh | 27534329 | débito Malcolm Karasavvas | 3 Karasavvas Road, San Jose | 27643689 | débito Kostas Jackson | 31 Jackson Lane, San Jose | 2762960 | débito Tabela 5 – Resultado Integrado O resultado mostrado são as duas fontes de dados integradas que foram listadas na atividade CreatResourceGrup. O SQLBag é o responsável por está realizando a consulta a estes bancos de dados e é o responsável por integrar os dados enviados pelas fontes. 68 6. CONCLUSÕES Computação em Grid tem se tornado muito popular. Muitos projetos têm sido iniciados para suportar, em parte, a visão de um Grid [FOSTER; KESSELMAN, 1999]. Com isso, a computação baseada em Grid tem emergido como um importante novo campo, distinto da computação distribuída convencional, dado que o seu foco está no compartilhamento de recursos, onde a principal idéia é criar a ilusão de um supercomputador virtual, em grande escala, facilmente gerenciável e com uma grande quantidade de recursos (ciclos de CPU, dados, dispositivos de armazenamento etc.) sendo compartilhados [BERSTIS, 2003]. Outra tecnologia que tem emergido bastante ultimamente é a integração de dados feita por um middleware, no nosso caso o OGSA-DAI. Este modo de integrar dados libera o usuário de ter que gastar muitos recursos para fazer uma integração manual de dados e mesmo assim ficar limitado a rede local para obter acesso aos dados. O middleware aqui discutido garante o acesso via Web dos dados mesmo que estes estejam distribuídos através do mundo, mesmo que sejam de empresas diferentes ou até mesmo de bancos de dados distintos. Apesar dessas vantagens ainda existem neste middleware algumas desvantagens na sua utilização, como por exemplo, a limitação que ele possui em termos de número de fontes de dados suportadas. Esse middleware não suporta integração de esquemas diferentes. As fontes de dados devem possuir o mesmo esquema de tabela, porém, permite que os atributos possuam tipos diferentes de dados. Por estarmos utilizando integração de dados em nosso sistema, isto nos oferece muitas vantagens como o fato de o usuário poder ter uma visão exclusiva dos dados que foram integrados, e também o fato de que esta integração pode ocorrer sem que haja a necessidade de modificação das plataformas tecnológicas existentes. Podemos acrescentar que este middleware chamado OGSA-DAI possui inúmeras funcionalidades altamente necessárias para serem usadas na maioria das empresas existentes, fazendo com que ele seja bastante reconhecido por todos. Futuramente, pode-se utilizar a tecnologia do OGSA-DPQ, sendo um framework de integração de dados na qual é possível coordenar e incorporar serviços Web para análise e recuperação de dados, e integrar diferentes tipos de esquemas. Ele utiliza os serviços oferecidos pelo OGSA-DAÍ para geograficamente e com sistemas heterogêneos. acessar as fontes distribuídas 69 REFERÊNCIAS BIBLIOGRAFICAS ALDEMIR, N. et al. Ogsa-dqp: A service-based distributed query processor for the grid. In: UK e-Science All Hands Meeting Nottingham. EPSRC, 2003. AYRES, F.; PORTO, F.; MELO, R. An Extensible Query Execution Engine for Supporting New Query Execution Models. To appear in LNCS 2004. BARBOSA, A. C. P., 2001. Middleware para Integração de Dados Heterogêneos Baseado em Composição de Frameworks. Tese de Doutorado, PUC - Rio, Brasil, 2001. BARBOSA, A. C. P.; PORTO, F.; MELO, R. N. ConFigurable data integration middleware system. J. Braz. Comp. Soc., v. 8, n. 2, p. 12_19, 2002. BERSTIS, V. Fundamentals of Grid Computing. Dec 2003. Redbooks. BIANCARDI, C, 2005. Distribuição e Execução de Wrappers em Ambiente de Grid para o CoDIMS. Tese de mestrado. BIANCARDI, C., SILVESTRE, L. J., & BARBOSA, A. C. P., 2005a. Uma abordagem grid para integração de dados. In Proceedings of the XXVI Iberian Latin-American Congress on Computational Methods in Engineering CILAMCE 2005 BIANCARDI, C., SILVESTRE, L. J., & BARBOSA, A. C. P., 2005. Uma proposta para distribuição e execução de wrappers em um ambiente de grid para o codims. In Proceedings of the WCGA. BUYYA, R. Grid Computing Info Centre (GRID Infoware). 2002. CAMPOS JR, M. A., ALVES, H., HIRA, A. Y., ZUFFO, M. K.. Computação em Gradena Saúde: Proposta de uma Arquitetura Para Interação de Informações Médicas Distribuídas. São Paulo - SP, Brasil CASTANO, S. et al. Ontology-based integration of heterogeneous xml datasources. In: Proc. of 10th Italian Symposium on Advanced Database Systems SEBD'02. Isola d'Elba, Italy: [s.n.], 2002. 70 CIRNE, W.; NETO, E. S. Grids Computacionais: Da Computação de Alto Desempenho a Serviços sob Demanda. 2005. Minicursos - Simpósio Brasileiro de Redes de computadores (SBRC). FONTES, V. et al. Codims-g: a data and program integration service for the grid. In: Proceedings of the 2nd Workshop on Middleware for Grid Computing. [S.l.]: ACM Press, 2004. FOSTER, I.; KESSELMAN, C. The Grid 2: Blueprint for a New Computing Infrastructure. Morgan Kaufmann Publishers Inc., 2003. FOSTER, I.; KESSELMAN, C.; TUECKE, S. Open grid services infrastructure (OGSI) version 1.0. Global Grid Forum Draft Recommendation, Junho 2003. GOLDCHLEGER, A. InteGrade: Um Sistema de Middleware para Computação em Grade Oportunista. Dissertação de Mestrado. USP, São Paulo - SP, Brasil, 2004. HAKIMPOUR, F. & GEPPERT, A., 2001. Resolving semantic heterogeneity in schema integration: an ontology based approach. In Proceedings of the international conference on Formal Ontology in Information Systems, volume 2001, pp. 297–308, USA. HALEVY, A. Y. Data integration: A status report. In: Proceedings of 10th Conference on Database Systems for Business Technology and the Web (BTW 2003). Germany: [s.n.], 2003. JAKOBOVITS, REX. Integrating Autonomous Heterogeneous Information Sources. Dept. of Computer Science & Engineering, University of Washington. 15 de Julho de 1997. KIM, W. (Ed.). Modern database systems: the object model, interoperability, and beyond. New York, NY, USA: ACM Press/Addison-Wesley Publishing Co., 1995. MOTRO, A.; BUNEMAN P. Constructing Superviews. In Proc. ACM SIGMOD Int. Conf. on Management of Data, 1981. http://www.ogsadai.org.uk 71 OGSA-DAI. http://www.ogsadai.org.uk acessado pela última vez em 29 de maio de 2008. PAPAKONSTANTINOU, Y.; ABITEBOUL, S. GARCIA-MOLINA, H. Object Fusion in Mediator Systems. Proceedings of the 22nd vldb conference Munbai (Bombay), India, 1996. PERREIRA BARBOSA, A. C., 2001. Middleware para integração de dados heterogêneos baseados em composições de frameworks. Tese de Doutorado, 2001, PUC Rio de Janeiro – RJ, Brasil RODRIGUEZ-MARTINEZ, M.; ROUSSOPOULOS, N. Automatic deployment of application-specific metadata and code in mocha. In: EDBT'00: Proceedings of the 7th International Conference on Extending Database Technology. [S.l.]: SpringerVerlag, 2000. p. 69_85. ISBN 3-540-67227-3. SOTOMAYOR, B. The Globus Toolkit 3 Programmer's Tutorial. Dez 2003. Tutorial. Disponível em: <http://gdp.globus.org/gt3-tutorial/>. TAKAI, O. K., ITALIANO, I. C., FERREIRA, J. E., 2005. Introdução de banco de dados: notas de aula. São Paulo – SP, Brasil. TANENBAUM, A. S. Sistemas distribuídos: Princípios e paradigmas. TREVISOL, G. G. (2004). Codims: Incorporando nova abordagem na comunicação entre seus componentes. Monografia de Graduação - UFES. WIEDERHOLD, G. Mediation to deal with heterogeneous data sources. v. 1580, 1999. 72 ANEXO A – MANUAL DO OGSA-DAI Esse anexo mostra passo a passo os mecanismos necessários para instalação e configuração do OGSA-DAI. A. PROGRAMAS NECESSÁRIOS Para o perfeito funcionamento do middleware OGSA-DAI, é necessário uma serie de softwares. Abaixo estão listados o software e a versão necessária para o funcionamento. a. Jakarta Tomcat Para usar a distribuição do OGSA-DAI Axis, é necessário a utilização do Jakarta Tomcat 5.0, podendo realizar o download em http://tomcat.apache.org/download55.cgi#5.0.28. O middleware só foi testado nessa versão e não é compatível com a versão 5.5. b. Apache ANT É recomendada a utilização do ANT versão 1.6 ou superior, podendo realizar o download em http://ant.apache.org. c. Java É requerido Java 1.4 ou 1.5, podendo realizar o download em http://java.sun.com/javase/downloads/index.jsp. OGSA-DAI não compila com Java 1.6. d. Programa de Banco de Dados É necessário a utilização de um Banco de Dados. Para consulta de quais bancos o OGSA-DAI suporta, verifique o Capítulo 4 – OGSA-DAI desse artigo. B. DETALHES DOS BANCOS DE DADOS SUPORTADOS Cada BD possui diferentes drivers e diferentes URI’s que são requeridas para a configuração dos bancos, mostrando o caminho para o OGSA-DAI. a. Drivers dos Bancos de Dados A tabela 6 são detalhados os drivers necessários para cada banco de dados compatível com OGSA-DAI. 73 Banco de Dados MySQL IBM DB2 Microsoft SQL Server Oracle PostgreSQL eXist Driver JARs MySQL Connector J/2 DB2 JDBC Driver Microsoft SQL Server JDBC Driver Oracle JDBC Drivers for Java 1.2+ Postgres JDBC Driver eXist XMLDB driver Classes mysql-connector-java-5.0.4bin.jar db2jcc.jar, db2jcc_licence_cu.jar mssqlserver.jar, msbase.jar, msutil.jar ojdbc14.jar (this may be distributed in a file with a .zip - the file can be renamed to have a .jar extension). postgresql-8.1-407.jdbc3.jar org.gjt.mm.mysql.Driver exist.jar, xmlrpc-1.2patched.jar, xmldb.jar (xmldb.jar is shipped with OGSA-DAI). org.exist.xmldb.DatabaseImpl com.ibm.db2.jcc.DB2Driver oracle.jdbc.driver.OracleDriver oracle.jdbc.driver.OracleDriver org.postgresql.Driver Tabela 6 – Drivers de Banco de Dados b. URI’s dos Bancos de Dados A Tabela 7 são detalhados as URI’s necessários para cada banco de dados compatível com OGSA-DAI. Banco de Dados Exemplo de URI MySQL jdbc:mysql://myhost:3306/daitest IBM DB2 jdbc:db2://myhost:50000/ogsadai Microsoft SQL Server jdbc:microsoft:sqlserver://myhost:1433;DatabaseName=ogsadai Oracle jdbc:oracle:thin:@myhost:1521:ogsadai PostgreSQL jdbc:postgresql://myhost:5432/ogsadai eXist xmldb:exist://myhost:9120/exist/xmlrpc/db/littleblackbook Tabela 7 – URI’s dos Bancos de Dados C. Fazendo o Download do OGSA-DA A Distribuição pode ser baixada do site do OGSA-DAI em http://www.ogsadai.org.uk. O usuário terá de registrar-se para obter um nome de usuário e senha para acessar os downloads. 74 D. Criando uma Base de Testes O OGSA-DAI contém um conjunto de clientes para criar uma base de teste. Para utilizar esses clientes é preciso obter um driver para o banco de dados e, em seguida, definir o classpath. a. Pegando os Drivers do Bancos de Dados A Tabela 3 contém as informações sobre os bancos de dados suportados pelo OGSADAI e onde se podem obter os drivers dos respectivos bancos. Deve-se pegar o driver específico com extensão *.JAR para o seu BD e colocar esses recursos no diretório da distribuição do OGSA-DAI (Figura 45). OGSA-DAI/thirdparty/lib Figura 45 – Local onde se localiza os driver dos BD’s no OGSA-DAI Logo apos o usuário deverá definir a classpath executando o comando da Figura 46 no Prompt de Comando: $ Setenv.bat Figura 46 – Classpath b. Criando uma Base de Testes OGSA-DAI fornece um conjunto de clientes simples para criar uma tabela chamada littleblackbook teste de dados que contém quatro colunas: • Id - ID único (chave) do tipo INTEGER. • Nome - primeiro e apelido do tipo VARCHAR (64). • Endereço - endereço do tipo VARCHAR (128). • Número de telefone celular do tipo VARCHAR (20). Para criar uma base de testes, digite o seguinte comando: o Em DB2: $ Java uk.org.ogsadai.dbcreate.CreateTestDB2DB; o Em MySQL: $ Java uk.org.ogsadai.dbcreate.CreateTestMySQLDB; o Em Oracle: $ Java uk.org.ogsadai.dbcreate.CreateTestOracleDB; o Em PostegreSQL: $ Java uk.org.ogsadai.dbcreate.CreateTestPostgreSQLDB; o Em SQL Server: $ Java uk.org.ogsadai.dbcreate.CreateTestSQLServerDB 75 E. Implementando OGSA-DAI Para implantar OGSA-DAI Axis para Tomcat: Executar o Tomcat e logo depois executar o comando da Figura 47 $ Ant -Dtomcat.dir = / PATH / TO / TOMCAT -Ddai.host = HOST -Ddai.port = PORT buildDeployWARAndServices Figura 47 – Comando para criar uma base de dados Aonde : PATH / TO / TOMCAT é o caminho para o diretório raiz do Tomcat. HOST é o acolhimento em que Tomcat está rodando. Este deve ser um bom nome do host e não localhost. PORT é a porta em que Tomcat aceita conexões. A porta 8080 e assumida como padrão. Um arquivo OGSA-DAI WAR será criado, copiado para o Tomcat. Em seguida, é implantado um padrão de serviço OGSA-DAI. Se o serviço de implementação falhar, e o Tomcat não reconhecer o arquivo WAR, execute o comando da Figura 48. $ Ant-Dtomcat.dir = / PATH / TO / TOMCAT-Ddai.host = HOST-Ddai.port = PORT deployServices Figura 48 – Comando a ser executado caso o serviço de implementação falhar F. Fazendo teste no servidor Visite a seguinte link usando um navegador internet: http://HOST:PORT/dai/services/. Por exemplo: http://localhost:8080/dai/services/. Onde: • HOST é o host em que Tomcat está rodando. • PORT é a porta em que Tomcat aceita conexões. Isto pressupõe que o padrão OGSA-DAI AXIS foi utilizado na implantação. Se tudo tem corrido bem, você verá uma lista de serviços, incluindo os serviços OGSA-DAI, mais informação sobre as suas atividades e as suas ligações ao serviço descrição documentos WSDL. 76 a. A Pagina JSP do OGSA-DAI Visite a seguinte página usando um navegador internet: http://HOST:PORT/dai/dai-manager.jsp. Por exemplo: http://localhost:8080/dai/dai-manager.jsp. Onde: • HOST é o host em que Tomcat está rodando. • PORT é a porta em que Tomcat aceita conexões. Isto pressupõe que o padrão OGSA-DAI foi utilizado na implantação. Se tudo ocorrer bem você verá informações sobre a versão do OGSA-DAI, a lista de recursos mobilizados, incluindo o seu recurso de dados, bem como uma lista de atividades conhecida para o servidor. b. Realizando uma consulta de teste A linha de comando da Figura 49 é para executar consultas SQL em uma fonte de dados e imprimindo os resultados. Você pode especificar o ID da solicitação de dados da execução dos recursos e o OGSA-DAI irá executar o pedido. Para executar uma consulta sobre um recurso de dados execute, por exemplo o seguinte comando: $ Java uk.org.ogsadai.client.toolkit.example.SQLClient \-u http://localhost:8080/dai/services/ \-d MyOwnJDBCDataResource \-q "SELECT * FROM littleblackbook onde id <10" Figura 49 – Consulta a uma fonte de dados G. Configurando o Servidor Para criar um arquivo de recurso relacional createRelationalConfig, execute o comando da Figura 50. $ ant -Ddai.db.product=PRODUCT -Ddai.db.vendor=VENDOR -Ddai.db.version=VERSION \ -Ddai.db.uri=DATABASE-URI -Ddai.db.driver=DATABASE-DRIVER-CLASS \ Ddai.resource.id=RESOURCE-ID createRelationalConfig Figura 50 – Comando usado para configurar um servidor 77 Isso leva os seguintes argumentos: • Dai.db.product - argumento opcional aonde especifica o banco de dados e o nome do produto. • Dai.db.vendor - argumento opcional especificando a base produto. • Dai.db.version - argumento opcional aonde especifica o banco de dados e versão do produto. • Dai.db.uri – database da conexão URI. Verifique a Tabela 4 desse artigo. • Dai.db.driver - database da classe driver. Verifique a Tabela 3 desse artigo. • Dai.resource.id – recurso de dados ID. A identificação dos recursos dos dados que mostram os dados relacionais. O recurso terá este arquivo ID como o seu nome. Por exemplo, a configuração da Figura 51 cria um recurso para os dados do OGSADAI chamado MySQLDataResource que expõe a base de dados do MySQL: $ Ant-Ddai.db.product = MySQL-Ddai.db.vendor = MySQL-Ddai.db.version = 5 \Ddai.db.uri = jdbc: mysql: / / somehost: 3306/daitest \-Ddai.db . Driver = org.gjt.mm.mysql.Driver \-Ddai.resource.id = MySQLDataResource createRelationalConfig Figura 51 – MySQLDataResource H. Desistalando o OGSA-DAI Para desistalar o OGSA-DAI Axis realize as seguintes operações: 1. Encerre o Tomcat. 2. Delete os arquivos: • PATH / TO / TOMCAT / webapps / dai. • PATH / TO / TOMCAT / webapps / dai.war. • PATH / TO / TOMCAT / conf / Catalina / localhost / dai.xml. Onde: PATH / TO / TOMCAT é o caminho para o diretório da raiz do Tomcat. Isto pressupõe que o nome do webapps usado quando OGSA-DAI foi implantado foi executado desse local. 78 ANEXO B – WORKFLOWS O workflows é um fluxo de trabalho e uma seqüência de atividades que estão ligadas umas às outras, estas atividades constituem um caminho através do qual irá o controle de fluxo de dados. O seguinte método tem como parâmetros as atividades já discutidas e as suas entradas e saídas conectados adequadamente e adicionadas a um PipelineWorkflow. A saída do SQLQuery é conectada à entrada do TupleToWebRowSetCharArrays que, por sua vez, tem sua saída ligada ao CharArraysResize que, por sua vez, tem sua saída ligada ao DeliverToRequestStatus. Estas atividades são então adicionadas a todos os fluxos de trabalho utilizando o método acrescentar (Figura 52). public PipelineWorkflow makePipelineWorkflow(SQLQuery query, TupleToWebRowSetCharArrays transform, CharArraysResize resize, DeliverToRequestStatus delivery) { // Create a new pipeline. PipelineWorkflow tempFlow = new PipelineWorkflow(); // Connect the query output to the transform input. transform.connectDataInput(query.getDataOutput()); // Connect the transform output to the transform input. resize.connectDataInput(transform.getResultOutput()); // Connect the transform output to the delivery input. delivery.connectInput(resize.getOutput()); // Add the activities to the pipeline. tempFlow.add(query); tempFlow.add(transform); tempFlow.add(resize); tempFlow.add(delivery); return tempFlow; } Figura 52 – PipelineWorkflow Depois que um fluxo de trabalho foi criado o passo seguinte é o de executá-lo utilizando o DataRequestExecutionResource (Figura 53). 79 public RequestResource executePipeline(PipelineWorkflow pipe) throws ServerCommsException, ServerException, ResourceUnknownException, ClientException, RequestException, ClientToolkitException { return mDRER.execute(pipe, RequestExecutionType.SYNCHRONOUS); } Figura 53 – DataRequestExecutionResource O CTk toma o fluxo de trabalho e envia ao OGSA-DAI para execução de serviço web que expõe o DRER. O DRER executa o fluxo de trabalho e retorna um pedido de status. A utilização de uma atividade DeliverToRequestStatus significa que a consulta retorna os dados do pedido. Este método retorna um RequestResource em que o CTk o deposita o pedido no OGSA-DAI servidor. O RequestExecutionType pode ser sincronizado, executa o método e não retornar até o DRER, sobre o servidor OGSA-DAI, tenha concluído o fluxo de trabalho ou de execução assíncrono onde o método retorna imediatamente, mas a DRER sobre o OGSA-DAI servidor irá continuar com o fluxo de trabalho execução. Em tais casos, o servidor DRER irá criar uma solicitação dos recursos que o cliente possa, através da enquete RequestResource retornar por este método A atividade DeliverToRequestStatus irá retornar o status do fluxo de trabalho e os resultados a partir da sua entrada para a RequestStatus ligado ao objeto.Isto é obtido através da Figura 54. RequestResource rr = sqlClient.executePipeline(pipeline); RequestStatus rs = rr.getRequestStatus(); Figura 54 – DeliverToRequestStatus Os resultados devem incluir a saída do TupleToWebRowSetCharArrays (os efeitos de CharArraysResize sejam transparentes em termos de conteúdo dos dados). A execução do pedido pode ser verificada através da convocação do método getExecutionStatu e o método RequestStatus sobre o objeto. O código da Figura 55 irá simplesmente imprimir o resultado da execução. 80 RequestStatus rs = rr.getRequestStatus(); System.out.println(rs.getExecutionStatus()); Figura 55 – RequestStatus E, na maioria dos casos, a Figura 56 deverá ser a saída. uk.org.ogsadai.resource.request.status.COMPLETED Figura 56 – RequestStatus completo Como um exemplo simples de usar os códigos listados, um método principal pode ser adicionados e utilizado. Lembrando que, a base de serviços URL pode ser alterada, assim como o comando SQL e os dados dos recursos ID, dependendo do seu servidor de configuração. O código da Figura 57 não leva em conta exceções ate este ponto. As primeiras linhas criam uma consulta SQL e os recursos IDs. public static void main(String[] args) throws Exception { String serverURL = "http://localhost:8080/dai/services/"; ResourceID drerID = new ResourceID("DataRequestExecutionResource"); String sqlStr = "SELECT * FROM littleblackbook WHERE id<3;"; ResourceID dataResourceID = new ResourceID("MySQLDataResource"); SQLClient iSQLClient = new SQLClient(); iSQLClient.setupServer(serverURL); iSQLClient.setupDRER(drerID); SQLQuery sqlQ = iSQLClient.makeSQLQuery(dataResourceID, sqlStr); DeliverToRequestStatus dtrs = iSQLClient.makeDeliverToRequestStatus(); TupleToWebRowSetCharArrays ttwrsca = iSQLClient.makeTupleToWebRowSetCharArrays(); CharArraysResize car = iSQLClient.makeCharArraysResize(); PipelineWorkflow pwf = iSQLClient.makePipelineWorkflow(sqlQ, ttwrsca, car, dtrs); RequestResource rr = iSQLClient.executePipeline(pwf); RequestStatus rs = rr.getRequestStatus(); System.out.println(rs.getExecutionStatus()); } Figura 57 – Método Principal 81 Antes de passar a considerar as exceções, a produção a partir da TupleToWebRowSetCharArrays pode ser usado de várias maneiras. Isto pode aceder diretamente à atividade de saída e de obter acesso aos métodos para o formato de saída resultante em uma tabela. Primeiro um pequeno método que mostra ao TupleToWebRowSetCharArrays uma referência direta ao pedido para que ela possa analisá-la. Isso é uma conseqüência da utilização do CharArraysResize para melhorar o seu rendimento (Figura 58). private static void setRequestStatus(TupleToWebRowSetCharArrays tupleToWebRowSet, DeliverToRequestStatus deliverToRequestStatus) { tupleToWebRowSet.getResultOutput().setDeliverToRequestStatusActivity(deliverToRequ estStatus); } Figura 58 – TupleToWebRowSetCharArrays A Figura 58 mostra um pequeno método para ajudar a melhorar as strings. private static String pad(String base, int width) { StringBuffer baseBuffer = new StringBuffer(base); int padLength = width - base.length(); for (int i = 0; i < padLength; i++) { baseBuffer.append(" "); } return baseBuffer.toString(); } Figura 59 – strings pad Depois de escrever o quadro de resultados, a TupleToWebRowSetCharArrays é acessado diretamente após que o pedido tenha acabado de ser escrito e executando em uma tabela usando os métodos. O código da Figura 60 irá utilizar o método pad e escrever a tabela de saída. 82 Public void Printable(TupleToWebRowSetCharArrays tupleToWebRowSet) throws SQLException, DataStreamErrorException, UnexpectedDataValueException, WebRowSetResultSetParseException, DataSourceUsageException { if (tupleToWebRowSet.hasNextResult()) { // Get ResultSet. ResultSet rs = tupleToWebRowSet.nextResultAsResultSet(); // Get ResultSet metadata. ResultSetMetaData md = rs.getMetaData(); // Get column names and initial column widths. Int numColumns = md.getColumnCount(); String[] columns = new String[numColumns]; int[] widths = new int[numColumns]; for (int i = 0; i < numColumns; i++) { String column = md.getColumnLabel(i + 1); columns[i] = column; widths[i] = column.length(); } // Get ResultSet rows and update column widths also. Vector rows = new Vector(); while (rs.next()) { String[] fields = new String[numColumns]; for (int i = 0; i < numColumns; i++) { fields[i] = rs.getString(i + 1); if (fields[i] == null) { fields[i] = “null”; } widths[i] = Math.max(widths[i], fields[i].length()); 83 } rows.add(fields); } rs.close(); // Print column names. String tableHeading = “| “; for (int i = 0; i < numColumns; i++) { tableHeading += (pad(columns[i], widths[i]) + “ | “); } System.out.println(tableHeading); // Print rows. For (int j = 0; j < rows.size(); j++) { String[] row = (String[])rows.get(j); String rowString = “| “; for (int i = 0; i < numColumns; i++) { rowString += (pad(row[i], widths[i]) + “ | “); } System.out.println(rowString); } } } Figura 60 – TupleToWebRowSetCharArrays Completo 84 ANEXO C – CODIGO COMPLETO import java.net.MalformedURLException; import java.net.URL; import java.util.Vector; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import uk.org.ogsadai.client.toolkit.DataRequestExecutionResource; import uk.org.ogsadai.client.toolkit.DataValueIterator; import uk.org.ogsadai.client.toolkit.PipelineWorkflow; import uk.org.ogsadai.client.toolkit.RequestExecutionType; import uk.org.ogsadai.client.toolkit.RequestResource; import uk.org.ogsadai.client.toolkit.Server; import uk.org.ogsadai.client.toolkit.ServerProxy; import uk.org.ogsadai.client.toolkit.activities.block.CharArraysResize; import uk.org.ogsadai.client.toolkit.activities.delivery.DeliverToRequestStatus; import uk.org.ogsadai.client.toolkit.activities.sql.SQLQuery; import uk.org.ogsadai.client.toolkit.activities.transform.TupleToWebRowSetCharArrays; import uk.org.ogsadai.client.toolkit.exception.ClientException; import uk.org.ogsadai.client.toolkit.exception.ClientToolkitException; import uk.org.ogsadai.client.toolkit.exception.RequestException; import uk.org.ogsadai.client.toolkit.exception.ResourceUnknownException; import uk.org.ogsadai.client.toolkit.exception.ServerCommsException; import uk.org.ogsadai.client.toolkit.exception.ServerException; import uk.org.ogsadai.client.toolkit.exception.DataSourceUsageException; import uk.org.ogsadai.client.toolkit.exception.DataStreamErrorException; import uk.org.ogsadai.client.toolkit.exception.UnexpectedDataValueException; import uk.org.ogsadai.converters.webrowset.WebRowSetResultSetParseException; import uk.org.ogsadai.resource.ResourceID; import uk.org.ogsadai.resource.request.RequestStatus; 85 /** * Example SQL Client */ public class SQLClient { private Server mServer; private DataRequestExecutionResource mDRER; /** * Constructor */ public SQLClient() { mServer = null; mDRER = null; } /** * Method will retrieve an OGSA-DAI server from the parameter * serverURLstr. * * @param serverURLStr * @throws ClientToolkitException * @throws MalformedURLException */ public void setupServer(String serverURLStr) throws ClientToolkitException, MalformedURLException { mServer = new ServerProxy(); mServer.setDefaultBaseServicesURL(new URL(serverURLStr)); } /** 86 * Method will get the DRER identified by the ResourceID from the server. * * @param drerID * @throws ClientToolkitException */ public void setupDRER(ResourceID drerID) throws ServerException, ClientToolkitException { mDRER = mServer.getDataRequestExecutionResource(drerID); } /** * Method creates a SQLQuery activity for the identified resource * and given query * @param dataResourceID * @param sqlStr * @return SQLQuery */ public SQLQuery makeSQLQuery(ResourceID dataResourceID, String sqlStr) { SQLQuery tempQuery = new SQLQuery(); tempQuery.setResourceID(dataResourceID); tempQuery.addExpression(sqlStr); return tempQuery; } /** * Creates a new DeliverToRequestStatus activity * @return DeliverToRequestStatus */ public DeliverToRequestStatus makeDeliverToRequestStatus() { 87 return new DeliverToRequestStatus(); } /** * Creates a new TupleToWebRowSetCharArrays activity * @return TupleToWebRowSetCharArrays */ public TupleToWebRowSetCharArrays makeTupleToWebRowSetCharArrays() { return new TupleToWebRowSetCharArrays(); } /** * Creates a new CharArraysResize activity * @return CharArraysResize */ public CharArraysResize makeCharArraysResize() { CharArraysResize resize = new CharArraysResize(); resize.addArraySizeInput(5000); return resize; } /** * * Creates a new pipelineworkflow for the three activities. * Connects the activities, query-transform-delivery * @param query * @param transform * @param delivery * @return PipelineWorkflow */ public PipelineWorkflow makePipelineWorkflow(SQLQuery query, 88 TupleToWebRowSetCharArrays transform, CharArraysResize resize, DeliverToRequestStatus delivery) { PipelineWorkflow tempFlow = new PipelineWorkflow(); transform.connectDataInput(query.getDataOutput()); resize.connectDataInput(transform.getResultOutput()); delivery.connectInput(resize.getOutput()); tempFlow.add(query); tempFlow.add(transform); tempFlow.add(resize); tempFlow.add(delivery); return tempFlow; } /** * Executes a pipelineworkflow in a synchronous mode and returns * a requestResource * * @param pipe * @return RequestResource * @throws ServerCommsException * @throws ServerException * @throws ResourceUnknownException * @throws ClientException * @throws RequestException * @throws ClientToolkitException */ public RequestResource executePipeline(PipelineWorkflow pipe) throws ServerCommsException, ServerException, ResourceUnknownException, ClientException, 89 RequestException, ClientToolkitException { return mDRER.execute(pipe, RequestExecutionType.SYNCHRONOUS); } /** * Prints a table format to standard output using the data from the * transform activity passed in as parameter. * * @param tupleToWebRowSet * @throws SQLException * @throws DataStreamErrorException * @throws UnexpectedDataValueException * @throws WebRowSetResultSetParseException * @throws DataSourceUsageException */ public void printTable(TupleToWebRowSetCharArrays tupleToWebRowSet) throws SQLException, DataStreamErrorException, UnexpectedDataValueException, WebRowSetResultSetParseException, DataSourceUsageException { if (tupleToWebRowSet.hasNextResult()) { // Get ResultSet. ResultSet rs = tupleToWebRowSet.nextResultAsResultSet(); // Get ResultSet meta data. ResultSetMetaData md = rs.getMetaData(); // Get column names and initial column widths. Int numColumns = md.getColumnCount(); String[] columns = new String[numColumns]; 90 int[] widths = new int[numColumns]; for (int i = 0; i < numColumns; i++) { String column = md.getColumnLabel(i + 1); columns[i] = column; widths[i] = column.length(); } // Get ResultSet rows and update column widths also. Vector rows = new Vector(); while (rs.next()) { String[] fields = new String[numColumns]; for (int i = 0; i < numColumns; i++) { fields[i] = rs.getString(i + 1); widths[i] = Math.max(widths[i], fields[i].length()); } rows.add(fields); } rs.close(); // Print column names. String tableHeading = “| “; for (int i = 0; i < numColumns; i++) { tableHeading += (pad(columns[i], widths[i]) + “ | “); } System.out.println(tableHeading); // Print rows. For (int j = 0; j < rows.size(); j++) { String[] row = (String[])rows.get(j); String rowString = “| “; for (int i = 0; i < numColumns; i++) 91 { rowString += (pad(row[i], widths[i]) + “ | “); } System.out.println(rowString); } } } /** * Pads out a string to the width given as parameter * @param base * @param width * @return String */ private static String pad(String base, int width) { StringBuffer baseBuffer = new StringBuffer(base); int padLength = width – base.length(); for (int i = 0; i < padLength; i++) { baseBuffer.append(“ “); } return baseBuffer.toString(); } /** * Allow TupleToWebRowSetCharArrays access to the request status. * * @param transform * @param delivery */ private static void setRequestStatus(TupleToWebRowSetCharArrays tupleToWebRowSet, 92 DeliverToRequestStatus deliverToRequestStatus) { tupleToWebRowSet.getResultOutput().setDeliverToRequestStatusActivity(deliverToRequ estStatus); } public static void main(String[] args) throws Exception { // Setup String serverURL = “http://localhost:8080/dai/services/”; ResourceID drerID = new ResourceID(“DataRequestExecutionResource”); SQLClient iSQLClient = new SQLClient(); ResourceID dataResourceID = new ResourceID(“MySQLDataResource”); String sqlStr = “SELECT * FROM littleblackbook WHERE id<3;”; // Server iSQLClient.setupServer(serverURL); iSQLClient.setupDRER(drerID); // Activities Creation SQLQuery sqlQ = iSQLClient.makeSQLQuery(dataResourceID, sqlStr); DeliverToRequestStatus dtrs = iSQLClient.makeDeliverToRequestStatus(); TupleToWebRowSetCharArrays ttwrsca = iSQLClient.makeTupleToWebRowSetCharArrays(); CharArraysResize car = iSQLClient.makeCharArraysResize(); // Workflow and Execution PipelineWorkflow pwf = iSQLClient.makePipelineWorkflow(sqlQ, ttwrsca, car, dtrs); RequestResource rr = iSQLClient.executePipeline(pwf); RequestStatus rs = rr.getRequestStatus(); // outputs 93 System.out.println(rs.getExecutionStatus()); iSQLClient.setRequestStatus(ttwrsca, dtrs); iSQLClient.printTable(ttwrsca); } } Figura 61 – Código Completo 94 ANEXO D – PERGUNTAS E RESPOSTAS 1 - Como representar uma fonte de dados no OGSA-DAI? Primeiramente, é preciso obter as informações das fonte de dados desejada, como por exemplo, a URI da fonte de dados, o driver e a versão desta fonte. Com isso em mãos é preciso criar um resource file contendo os argumentos necessários. O próximo passo é fazer o transporte deste resource file para o servidor Tomcat que está configurado na sua máquina. 2 - Como representar uma consulta no OGSA-DAI para as fontes que estão sendo integradas? O OGSA-DAI possui classes que realizam consultas em bancos de dados. Uma URI, um resource file e um comando SQL são os parâmetros necessários para fazer uma consulta em uma fonte de dados integrada ao OGSA-DAI. Todos estes parâmetros devem estar incluídos numa classe específica do OGSA-DAI que é utilizada para fazer acesso ao banco. 3 - Existe um esquema global para a elaboração de consulta global ou tenho que consultar o esquema de cada fonte? O OGSA-DAI não possui a funcionalidade de estar construindo um esquema global, pois os esquemas de todas as fontes de dados que forem listados no CreatresourceGrupo devem conter o mesmo esquema, portanto a atividade SQLBag tem a função de realizar a mesmo consulta SQL a todas as fontes. 4 - Como a consulta é dividida em sub-consultas e enviadas para as fontes de dados envolvidas? Não existe um esquema a global, pois todas as fontes devem possuir o mesmo esquema. Assim a mesma consulta é enviada para todas as fontes através de atividades oferecidas pelo OGSA-DAI. Portanto existem atividades no OGSA-DAI capazes de realizar acesso a múltiplos bancos de dados. A primeira atividade a ser criada e a CreatResourceGrup, nesta atividade e criado um grupo de banco de dados que serão integrados. Logo após criar um grupo de banco é necessária criar outra atividade que realize a consulta nas fontes 95 de dados listadas, o SQLBag que tem como funcionalidade executar um comando SQL em todos os bancos listados na atividade CreatResourceGrup. 5 - Como os resultados das sub-consultas são integrados? A integração dos resultados das sub-consultas é feita pela atividade SQLBag, que coleta todos os resultados da query e os coloca em um único result set que também incluirá linhas duplicadas, caso existam.Caso seja enviado mais do que uma consulta para as fontes de dados, cada consulta terá o seu result set. 6 - Quais os recursos que o OGSA-DAI oferece para acesso à fonte? O OGSA-DAI, oferece inúmeras atividades que possibilitam acesso a fontes de dados heterogêneas. Além de possuir essas atividades o OGSA-DAI libera o usuário de estar criando novas atividades, pois o OGSA-DAI possui código aberto. Possibilita ao usuário de estar realizando mudanças nas fontes de dados, como por exemplo, realizar um up-date, um delete, colocar ou retira linhas ou colunas na tabela.