Comment configurer la base de données de graphes Titan avec Cassandra et ElasticSearch sur Ubuntu 16.04

introduction

Titan est une base de données de graphes open-source hautement évolutive. Une base de données de graphes est un type de base de données NoSQL où toutes les données sont stockées en tant quenodes etedges. Une base de données de graphes convient aux applications qui utilisent des données hautement connectées, où la relation entre les données est une partie importante de la fonctionnalité de l’application, comme un site de réseau social. Titan est utilisé pour stocker et interroger des données volumineuses réparties sur plusieurs ordinateurs. Il peut être configuré pour utiliser n'importe lequel des différents systèmes de stockage disponibles, comme Apache Cassandra, HBase et BerkeleyDB. Il est ainsi plus facile d’éviter le blocage ultérieur des fournisseurs si vous devez modifier le magasin de données.

Dans ce tutoriel, vous allez installer Titan 1.0. Ensuite, vous configurerez Titan pour utiliser Cassandra et ElasticSearch, tous deux fournis avec Titan. Cassandra agit en tant que banque de données contenant les données sous-jacentes, tandis qu'ElasticSearch, un moteur de recherche en texte libre, peut être utilisé pour effectuer certaines opérations de recherche sophistiquées dans la base de données. Vous allez également créer et interroger des données de la base de données à l'aide de Gremlin.

Conditions préalables

Pour compléter ce tutoriel, vous aurez besoin de:

[[step-1 -—- download-unpacking-and-starting-titan]] == Étape 1 - Téléchargement, déballage et démarrage de Titan

Pour télécharger la base de données Titan, rendez-vous surtheir downloads page. Vous verrez deux distributions Titan disponibles au téléchargement. Pour ce tutoriel, nous voulonsTitan 1.0.0 with Hadoop 1. Ceci est la version stable. Téléchargez-le sur votre serveur avecwget:

wget http://s3.thinkaurelius.com/downloads/titan/titan-1.0.0-hadoop1.zip

Une fois le téléchargement terminé, décompressez le fichier zip. Le programme pour décompresser les fichiers n'est pas installé par défaut. Installez-le d'abord:

sudo apt-get install unzip

Puis décompressez Titan:

unzip titan-1.0.0-hadoop1.zip

Cela crée un répertoire nommétitan-1.0.0-hadoop.

Commençons par Titan pour s’assurer que tout fonctionne. Accédez au répertoiretitan-1.0.0-hadoop et invoquez le script shell pour démarrer Titan.

cd titan-1.0.0-hadoop1
./bin/titan.sh start

Vous verrez une sortie semblable à celle-ci:

OutputForking Cassandra...
Running `nodetool statusthrift`... OK (returned exit status 0 and printed string "running").
Forking Elasticsearch...
Connecting to Elasticsearch (127.0.0.1:9300)...... OK (connected to 127.0.0.1:9300).
Forking Gremlin-Server...
Connecting to Gremlin-Server (127.0.0.1:8182)...... OK (connected to 127.0.0.1:8182).
Run gremlin.sh to connect.

Titan dépend d'un tas d'autres outils pour travailler. Ainsi, à chaque démarrage de Titan, Cassandra, ElasticSearch et Gremlin-Server sont également lancés.

Vous pouvez vérifier le statut de Titan en exécutant la commande suivante.

./bin/titan.sh status

Vous verrez cette sortie:

OutputGremlin-Server (org.apache.tinkerpop.gremlin.server.GremlinServer) is running with pid 7490
Cassandra (org.apache.cassandra.service.CassandraDaemon) is running with pid 7077
Elasticsearch (org.elasticsearch.bootstrap.Elasticsearch) is running with pid 7358

Dans l'étape suivante, vous verrez comment interroger le graphique.

[[step-2 -—- querying-the-graph-using-gremlin]] == Étape 2 - Interrogation du graphe en utilisant Gremlin

Gremlin est unGraph Traversal Language qui est utilisé pour interroger, analyser et manipuler les bases de données Graph. Maintenant que Titan est configuré et démarré, vous allez utiliser Gremlin pour créer et interroger des nœuds et des arêtes à partir de Titan.

Pour utiliser Gremlin, ouvrez la console Gremlin en exécutant la commande suivante.

./bin/gremlin.sh

Vous verrez une réponse semblable à ceci:

Output          \,,,/
         (o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.hadoop
plugin activated: tinkerpop.utilities
plugin activated: aurelius.titan
plugin activated: tinkerpop.tinkergraph
gremlin>

La console Gremlin charge plusieurs plug-ins prenant en charge les fonctionnalités spécifiques à Titan et à Gremlin.

Commencez par instancier l'objet graphique. Cet objet représente le graphique sur lequel nous travaillons actuellement. Il existe une poignée de méthodes qui peuvent aider à gérer le graphique, comme l’ajout de sommets, la création d’étiquettes et la gestion des transactions. Exécutez cette commande pour instancier l'objet graphique:

graph = TitanFactory.open('conf/titan-cassandra-es.properties')

Vous verrez cette sortie:

Output==>standardtitangraph[cassandrathrift:[127.0.0.1]]

La sortie spécifie le type d'objet renvoyé par la méthodeTitanFactory.open(), qui eststandardtitangraph. Il indique également le backend de stockage utilisé par le graphique (cassandrathrift) et auquel il est connecté via localhost (127.0.0.1).

La méthodeopen() crée un nouveau graphe Titan, ou en ouvre un existant, en utilisant les options de configuration présentes dans le fichier de propriétés spécifié. Le fichier de configuration contient les options de configuration de haut niveau telles que le système de stockage à utiliser, le système de mise en cache et quelques autres options. Vous pouvez créer un fichier de configuration personnalisé et l’utiliser à la place des paramètres par défaut, ce que vous ferez à l’étape 3.

Une fois la commande exécutée, l'objet graphique est instancié et stocké dans la variablegraph. Pour voir toutes les propriétés et méthodes disponibles pour l'objet graphique, tapezgraph., suivi de la toucheTAB:

gremlin> graph.
addVertex(                    assignID(                     buildTransaction()            close()
closeTransaction(             commit(                       compute(                      compute()
configuration()               containsEdgeLabel(            containsPropertyKey(          containsRelationType(
containsVertexLabel(          edgeMultiQuery(               edgeQuery(                    edges(
features()                    getEdgeLabel(                 getOrCreateEdgeLabel(         getOrCreatePropertyKey(
...
...

Dans les bases de données graphiques, vous interrogez les données principalement partraversing it, par opposition à la récupération des enregistrements avec des jointures et des index comme dans les bases de données relationnelles. Pour parcourir un graphe, nous avons besoin d'une source de parcours de graphe à partir de la variable de référencegraph. La commande suivante réalise ceci.

g = graph.traversal()

Vous effectuez les parcours avec cette variableg. Créons deux sommets à l’aide de cette variable. Les sommets sont comme des lignes en SQL. Chaque sommet a un type de sommet oulabel et ses propriétés associées, analogues aux champs en SQL. Exécutez cette commande:

sammy = g.addV(label, 'fish', 'name', 'Sammy', 'residence', 'The Deep Blue Sea').next()
company = g.addV(label, 'company', 'name', 'DigitalOcean', 'website', 'www.digitalocean.com').next()

Dans cet exemple, nous avons créé deux sommets avec les étiquettesfish etcompany respectivement. Nous avons également défini deux propriétés à savoirname etresidence pour le premier sommet, etname etwebsite pour le deuxième sommet. Accédons maintenant à ces sommets en utilisant les variablessammy etcompany.

Par exemple, pour répertorier toutes les propriétés du premier sommet, exécutez la commande suivante:

g.V(sammy).properties()

La sortie ressemblera à ceci:

Output==>vp[name->Sammy]
==>vp[residence->The Deep Blue Sea]

Vous pouvez également ajouter une nouvelle propriété au sommet. Ajoutons une couleur:

g.V(sammy).property('color', 'blue')

Définissons maintenant une relation entre ces deux sommets. Ceci est réalisé en créant unedge entre eux.

company.addEdge('hasMascot', sammy, 'status', 'high')

Cela crée une arête entresammy etcompany avec l'étiquettehasMascot, et une propriété nomméestatus avec la valeurhigh.

Maintenant, voyons la mascotte de la société:

g.V(company).out('hasMascot')

Cela renvoie les sommets sortants du sommetcompany, et l'arête entre eux étiquetéehasMascot. Nous pouvons également faire l'inverse et associer l'entreprise à la mascottesammy comme ceci:

g.V(sammy).in('hasMascot')

Voici quelques commandes Gremlin de base pour commencer. Pour en savoir plus, jetez un œil aux descriptifsApache Tinkerpop3 documentation.

Quittez la console Gremlin en appuyant surCTRL+C.

Ajoutons maintenant quelques options de configuration personnalisées pour Titan.

[[step-3 -—- configuring-titan]] == Étape 3 - Configuration de Titan

Créons un nouveau fichier de configuration que vous pouvez utiliser pour définir toutes vos options de configuration personnalisées pour Titan.

Titan a une couche de stockage enfichable; au lieu de gérer le stockage des données lui-même, Titan utilise une autre base de données pour le gérer. Titan fournit actuellement trois options pour la base de données de stockage: Cassandra, HBase et BerkeleyDB. Dans ce didacticiel, nous utiliserons Cassandra comme moteur de stockage, car il est hautement évolutif et offre une grande disponibilité.

Tout d'abord, créez le fichier de configuration:

nano conf/gremlin-server/custom-titan-config.properties

Ajoutez ces lignes pour définir le backend de stockage et son emplacement. Le backend de stockage est défini surcassandrathrift, ce qui indique que nous utilisons Cassandra pour le stockage avec l'interfacethrift pour Cassandra:

conf/gremlin-server/custom-titan-config.properties

storage.backend=cassandrathrift
storage.hostname=localhost

Ajoutez ensuite ces trois lignes pour définir le moteur de recherche à utiliser. Nous utiliseronselasticsearch comme moteur de recherche.

conf/gremlin-server/custom-titan-config.properties

...
index.search.backend=elasticsearch
index.search.hostname=localhost
index.search.elasticsearch.client-only=true

La troisième ligne indique qu'ElasticSearch est un client léger qui ne stocke aucune donnée. Le définir surfalse crée un nœud de cluster ElasticSearch normal qui peut stocker des données, ce que nous ne voulons pas maintenant.

Enfin, ajoutez cette ligne pour indiquer au serveur Gremlin le type de graphe qu’il va diffuser.

conf/gremlin-server/custom-titan-config.properties

...
gremlin.graph=com.thinkaurelius.titan.core.TitanFactory

Il existe un certain nombre d'exemples de fichiers de configuration disponibles dans le répertoireconf que vous pouvez consulter pour référence.

Enregistrez le fichier et quittez l'éditeur.

Nous devons ajouter ce nouveau fichier de configuration au serveur Gremlin. Ouvrez le fichier de configuration du serveur Gremlin.

nano conf/gremlin-server/gremlin-server.yaml

Accédez à la sectiongraphs et recherchez cette ligne:

conf/gremlin-server/gremlin-server.yaml

..
 graph: conf/gremlin-server/titan-berkeleyje-server.properties}
..

Remplacez-le par ceci:

conf/gremlin-server/gremlin-server.yaml

..
 graph: conf/gremlin-server/custom-titan-config.properties}
..

Enregistrez et quittez le fichier.

Maintenant, redémarrez Titan en arrêtant Titan et en le redémarrant.

./bin/titan.sh stop
./bin/titan.sh start

Maintenant que nous avons une configuration personnalisée, configurons Titan pour s’exécuter en tant que service.

[[step-4 -—- Managing-titan-with-systemd]] == Étape 4 - Gérer Titan avec Systemd

Nous devons nous assurer que Titan démarre automatiquement à chaque démarrage du serveur. Si notre serveur a été redémarré accidentellement ou a dû être redémarré pour une raison quelconque, nous voulons que Titan démarre également.

Pour le configurer, nous allons créer un fichier d’unité Systemd pour Titan afin de pouvoir le gérer.

Pour commencer, nous créons un fichier pour notre application dans le répertoire/etc/systemd/system avec une extension.service:

sudo nano /etc/systemd/system/titan.service

Un fichier d'unité est composé de sections. La section[Unit] spécifie les métadonnées et les dépendances de notre service, y compris une description de notre service et quand démarrer notre service.

Ajoutez cette configuration au fichier:

/etc/systemd/system/titan.service

[Unit]
Description=The Titan database
After=network.target

Nous spécifions que le service doit démarrerafter la cible réseau a été atteinte. En d'autres termes, nous ne démarrons ce service que lorsque les services de réseau sont prêts.

Après la section[Unit], nous définissons la section[Service] où nous spécifions comment démarrer le service. Ajoutez ceci au fichier de configuration:

/etc/systemd/system/titan.service

[Service]
User=sammy
Group=www-data
Type=forking
Environment="PATH=/home/sammy/titan-1.0.0-hadoop1/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
WorkingDirectory=/home/sammy/titan-1.0.0-hadoop1/
ExecStart=/home/sammy/titan-1.0.0-hadoop1/bin/titan.sh start
ExecStop=/home/sammy/titan-1.0.0-hadoop1/bin/titan.sh stop

Nous définissons d’abord l’utilisateur et le groupe sous lesquels le service est exécuté. Ensuite, nous définissons le type de service auquel il sera destiné. Le type est supposé êtresimple par défaut. Puisque le script de démarrage que nous utilisons pour démarrer Titan lance d'autres programmes enfants, nous spécifions le type de service commeforking.

Ensuite, nous spécifions la variable d'environnementPATH, le répertoire de travail de Titan et la commande à exécuter pour démarrer Titan. Nous affectons la commande de démarrage de Titan à la variableExecStart.

Les variablesExecStop définissent comment le service doit être arrêté.

Enfin, nous ajoutons la section[Install], qui ressemble à ceci:

/etc/systemd/system/titan.service

[Install]
WantedBy=multi-user.target

La sectionInstall vous permet d'activer et de désactiver le service. La directiveWantedBy crée un répertoire appelémulti-user.target dans le répertoire/etc/systemd/system. Systemd créera ici un lien symbolique de ce fichier unité. La désactivation de ce service supprimera ce fichier du répertoire.

Enregistrez le fichier, fermez l'éditeur et démarrez le nouveau service:

sudo systemctl start titan

Activez ensuite ce service pour que Titan démarre à chaque démarrage du serveur:

sudo systemctl enable titan

Vous pouvez vérifier le statut de Titan avec la commande suivante:

sudo systemctl status titan

Pour en savoir plus sur les fichiers unitaires, lisez le tutorielUnderstanding Systemd Units and Unit files.

Conclusion

Vous avez maintenant une configuration de base Titan installée sur votre serveur. Si vous souhaitez approfondir l’architecture de Titan, n’hésitez pas à consulter leursofficial documentation.

Maintenant que vous avez configuré Titan, vous devriez en savoir plus sur Tinkerpop3 et Gremlin en regardant lesofficial documentation.