AWS

29 dez, 2015

Armazenamento e Processamento de Banco de Dados de Grafos usando o DynamoDB Storage Backend for Titan

Publicidade

Este artigo foi publicado em 08/09/2015. Por ter sido considerado um dos melhores artigos de 2015, foi republicado hoje.

Os Bancos de Dados de Grafos representam, de forma elegante e eficiente, entidades (também chamadas de vértices ou nós) ligadas entre elas pelas arestas (ou relationships). Aqui está um exemplo simples de um gráfico:

Graph

Bill e Candace têm uma filha chamada Janet, e ela tem um filho chamado Bob. Isso faz com que Candace seja avó de Bob, e Bill seja seu avô.

Uma vez que um grafo foi construído, ele é processado atravessando as arestas entre os vértices. No grafo acima, podemos atravessar de Bill para Janet, e de lá para Bob. Os grafos podem ser usados para modelar redes sociais (amigos e “Curtir”), relações de negócios (empresas, funcionários, parceiros, fornecedores e clientes), dependências, e assim por diante. Tanto os vértices quanto as arestas podem ser editados; alguns vértices poderiam ser pessoas como no nosso exemplo, e outros poderiam ser lugares. Da mesma forma algumas arestas poderiam denotar (como acima) relações familiares e outras arestas poderiam denotar “curtidas”. Cada banco de dados de grafos permite que informações adicionais sejam anexadas a cada vértice e a cada aresta, muitas vezes sob a forma de pares nome-valor.

O Titan é um banco de dados de grafos escalável otimizado para armazenar e consultar grafos que contêm centenas de bilhões de vértices e arestas. É transacional, e pode suportar o acesso simultâneo de milhares de usuários.

DynamoDB Storage Backend para Titan

A camada de armazenamento de dados plugáveis do Titan já suporta várias bases de dados NoSQL e armazenamento key-value. Isso te permite escolher o backend que fornece o desempenho e os recursos necessários para a sua aplicação, dando-lhe a liberdade de mudar de um backend para outro com mudanças mínimas no código do aplicativo.

Agora estamos disponibilizando o novo DynamoDB Storage Backend para Titan. Armazenar seus grafos do Titan no Amazon DynamoDB permite dimensionar para lidar com grandes grafos sem ter que se preocupar com a construção, execução, ou manter o seu próprio cluster de banco de dados. Como o DynamoDB pode ser escalado para qualquer tamanho e, ainda, oferece alta disponibilidade de dados e desempenho previsível, você pode se concentrar na sua aplicação, em vez de no seu armazenamento e infraestrutura de processamento do grafo. Você também pode executar o Titan e o DynamoDB Local no seu laptop para desenvolvimento e testes.

O backend funciona com as versões 0.4.4 e 0.5.4 do Titan. Ambas as versões suportam percursos rápidos, arestas que são tanto dirigidas como digitadas e relacionamentos armazenados. A versão mais recente adiciona suporte para particionamento de vértices, etiquetas de vértices, e armazenamento de transações definidas por usuários. A infraestrutura é baseada no cliente; nós não efetuamos quaisquer alterações no DynamoDB para apoiá-lo. Você estará simplesmente usando o DynamoDB como uma forma eficiente de armazenar seus grafos Titan.

A versão 0.4.4 do Titan é compatível com a versão 2.4 da pilha Tinkerpop; a versão 0.5.4 de Titan é compatível com a versão 2.5 da pilha. Tinkerpop é uma coleção de ferramentas e algoritmos que fornece ainda mais opções de processamento e análise de grafos.

Já que eu estou falando de grafos, eu deveria mostras todos os itens de que eu falei sob a forma de um grafo! Aqui está:

gr_the_parts_3

O meu colega Alex Patrikalakis criou o seguinte script Gremlin. Ele replica o grafo acima usando Titan e DynamoDB:

\conf = new BaseConfiguration()
conf.setProperty("storage.backend", "com.amazon.titan.diskstorage.dynamodb.DynamoDBStoreManager")
conf.setProperty("storage.dynamodb.client.endpoint", "http://localhost:4567")
g = TitanFactory.open(conf)
titan = g.addVertex(null, [name:"Titan"])
blueprints = g.addVertex(null, [name:"Blueprints"])
pipes = g.addVertex(null, [name:"Pipes"])
gremlin = g.addVertex(null, [name:"Gremlin"])
frames = g.addVertex(null, [name:"Frames"])
furnace = g.addVertex(null, [name:"Furnace"])
rexster = g.addVertex(null, [name:"Rexster"])
DynamoDBStorageBackend = g.addVertex(null, [name:"DynamoDB Storage Backend for Titan"])
DynamoDBLocal = g.addVertex(null, [name:"DynamoDB Local"])
DynamoDB = g.addVertex(null, [name:"DynamoDB"])
g.addEdge(titan, blueprints, "implements")
g.addEdge(pipes, blueprints, "builds-on")
g.addEdge(gremlin, blueprints, "builds-on")
g.addEdge(frames, blueprints, "builds-on")
g.addEdge(furnace, blueprints, "builds-on")
g.addEdge(rexster, blueprints, "builds-on")
g.addEdge(titan, DynamoDBStorageBackend, "backed-by")
g.addEdge(DynamoDBStorageBackend, DynamoDBLocal, "connects-to")
g.addEdge(DynamoDBStorageBackend, DynamoDB, "connects-to")
g.commit()

Começando

DynamoDB Storage Backend para Titan está disponível como um projeto Maven no GitHub. Ele roda em Windows, OSX e Linux e requer Maven e Java 1.7 (ou posterior). O Amazon DynamoDB Storage Backend para Titan inclui instruções de instalação e um exemplo que faz uso criativo do conjunto de dados públicos Marvel Universe Social Graph. Nos também criamos um modelo do CloudFormation que vai lançar uma instância EC2 que tem a pilha Titan/Rexster e o DynamoDB Storage Backend para Titan instalado e pronto para uso.