前書き
Titanは、拡張性の高いオープンソースのグラフデータベースです。 グラフデータベースは、すべてのデータがnodesおよびedgesとして格納されるNoSQLデータベースの一種です。 グラフデータベースは、ソーシャルネットワーキングサイトのように、データ間の関係がアプリケーションの機能の重要な部分である、高度に接続されたデータを使用するアプリケーションに適しています。 Titanは、複数のマシンに分散されている大量のデータの保存とクエリに使用されます。 Apache Cassandra、HBase、BerkeleyDBなど、利用可能なさまざまなストレージバックエンドのいずれかを使用するように構成できます。 これにより、将来データストアを変更する必要がある場合に、ベンダーのロックインを簡単に回避できます。
このチュートリアルでは、Titan 1.0をインストールします。 次に、CassandraとElasticSearchを使用するようにTitanを構成します。どちらもTitanにバンドルされています。 Cassandraは、基礎となるデータを保持するデータストアとして機能しますが、フリーテキスト検索エンジンであるElasticSearchを使用して、データベースで高度な検索操作を実行できます。 また、Gremlinを使用してデータベースからデータを作成およびクエリします。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
非ルートユーザーとファイアウォールを備えた少なくとも2 GBのRAMを備えた1つのUbuntu 16.04サーバー。 これは、Initial Server Setup with Ubuntu 16.04に従って設定できます。
-
Oracle JDK 8がインストールされました。これは、this Java installation articleの「OracleJDKのインストール」セクションに従って実行できます。
[[step-1 -—- downloading-unpacking-and-starting-titan]] ==ステップ1— Titanのダウンロード、解凍、開始
Titanデータベースをダウンロードするには、their downloads pageにアクセスしてください。 ダウンロード可能な2つのTitanディストリビューションが表示されます。 このチュートリアルでは、Titan 1.0.0 with Hadoop 1が必要です。 これは安定版リリースです。 wget
を使用してサーバーにダウンロードします。
wget http://s3.thinkaurelius.com/downloads/titan/titan-1.0.0-hadoop1.zip
ダウンロードが完了したら、zipファイルを解凍します。 ファイルを解凍するプログラムは、デフォルトではインストールされません。 最初にインストールしてください:
sudo apt-get install unzip
次に、Titanを解凍します。
unzip titan-1.0.0-hadoop1.zip
これにより、titan-1.0.0-hadoop
という名前のディレクトリが作成されます。
Titanを起動して、すべてが機能することを確認しましょう。 titan-1.0.0-hadoop
ディレクトリに移動し、シェルスクリプトを呼び出してTitanを起動します。
cd titan-1.0.0-hadoop1
./bin/titan.sh start
次のような出力が表示されます。
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は、他の多くのツールに依存しています。 そのため、Titanが開始されるたびに、Cassandra、ElasticSearch、Gremlin-Serverも一緒に開始されます。
次のコマンドを実行して、Titanのステータスを確認できます。
./bin/titan.sh status
次の出力が表示されます。
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
次のステップでは、グラフのクエリ方法を確認します。
[[step-2 -—- querying-the-graph-using-gremlin]] ==ステップ2—Gremlinを使用したグラフのクエリ
Gremlinは、グラフデータベースのクエリ、分析、および操作に使用されるGraph Traversal Languageです。 Titanがセットアップおよび開始されたので、Gremlinを使用してTitanからノードとエッジを作成および照会します。
グレムリンを使用するには、次のコマンドを発行してグレムリンコンソールを開きます。
./bin/gremlin.sh
次のような応答が表示されます。
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>
Gremlinコンソールは、TitanおよびGremlin固有の機能をサポートするためのいくつかのプラグインをロードします。
まず、グラフオブジェクトをインスタンス化します。 このオブジェクトは、現在作業中のグラフを表します。 頂点の追加、ラベルの作成、トランザクションの処理など、グラフの管理に役立つメソッドがいくつかあります。 このコマンドを実行して、グラフオブジェクトをインスタンス化します。
graph = TitanFactory.open('conf/titan-cassandra-es.properties')
次の出力が表示されます。
Output==>standardtitangraph[cassandrathrift:[127.0.0.1]]
出力は、TitanFactory.open()
メソッドによって返されるオブジェクトのタイプ(standardtitangraph
)を指定します。 また、グラフが使用するストレージバックエンド(cassandrathrift
)と、ローカルホスト経由で接続されていること(127.0.0.1
)も示します。
open()
メソッドは、指定されたプロパティファイルにある構成オプションを使用して、新しいTitanグラフを作成するか、既存のグラフを開きます。 構成ファイルには、使用するストレージバックエンド、キャッシュバックエンド、その他のいくつかのオプションなどの高レベルの構成オプションが含まれています。 カスタム構成ファイルを作成して、デフォルトの代わりに使用することができます。これはステップ3で行います。
コマンドが実行されると、グラフオブジェクトがインスタンス化され、graph
変数に格納されます。 グラフオブジェクトで使用可能なすべてのプロパティとメソッドを確認するには、graph.
と入力し、続いてTAB
キーを入力します。
gremlin> graph.
addVertex( assignID( buildTransaction() close()
closeTransaction( commit( compute( compute()
configuration() containsEdgeLabel( containsPropertyKey( containsRelationType(
containsVertexLabel( edgeMultiQuery( edgeQuery( edges(
features() getEdgeLabel( getOrCreateEdgeLabel( getOrCreatePropertyKey(
...
...
グラフデータベースでは、リレーショナルデータベースのように結合とインデックスを使用してレコードを取得するのではなく、ほとんどの場合traversingでデータをクエリします。 グラフをトラバースするには、graph
参照変数からのグラフトラバーサルソースが必要です。 次のコマンドはこれを実現します。
g = graph.traversal()
このg
変数を使用してトラバーサルを実行します。 その変数を使用して、いくつかの頂点を作成しましょう。 頂点はSQLの行に似ています。 各頂点には、SQLのフィールドと同様に、頂点タイプまたはlabel
とそれに関連するプロパティがあります。 このコマンドを実行してください。
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()
この例では、ラベルfish
とcompany
を持つ2つの頂点を作成しました。 また、最初の頂点にname
とresidence
、2番目の頂点にname
とwebsite
の2つのプロパティを定義しました。 次に、変数sammy
とcompany
を使用してこれらの頂点にアクセスしましょう。
たとえば、最初の頂点のすべてのプロパティをリストするには、次のコマンドを実行します。
g.V(sammy).properties()
出力は次のようになります。
Output==>vp[name->Sammy]
==>vp[residence->The Deep Blue Sea]
新しいプロパティを頂点に追加することもできます。 色を追加しましょう:
g.V(sammy).property('color', 'blue')
次に、これら2つの頂点間の関係を定義します。 これは、それらの間にedge
を作成することによって実現されます。
company.addEdge('hasMascot', sammy, 'status', 'high')
これにより、sammy
とcompany
の間にラベルhasMascot
のエッジと、値high
のstatus
という名前のプロパティが作成されます。
それでは、会社のマスコットを入手しましょう。
g.V(company).out('hasMascot')
これにより、company
頂点からの出力頂点と、それらの間のエッジにhasMascot
というラベルが付けられます。 逆を実行して、次のようにマスコットsammy
に関連付けられた会社を取得することもできます。
g.V(sammy).in('hasMascot')
これらは、始めるためのいくつかの基本的なGremlinコマンドです。 詳細については、説明的なApache Tinkerpop3 documentationをご覧ください。
CTRL+C
を押して、Gremlinコンソールを終了します。
次に、Titanのカスタム構成オプションをいくつか追加しましょう。
[[step-3 -—- configuring-titan]] ==ステップ3—Titanの構成
Titanのすべてのカスタム構成オプションを定義するために使用できる新しい構成ファイルを作成しましょう。
Titanにはプラグ可能なストレージレイヤーがあります。データストレージ自体を処理する代わりに、Titanは別のデータベースを使用して処理します。 Titanは現在、Cassandra、HBase、およびBerkeleyDBの3つのストレージデータベースオプションを提供しています。 このチュートリアルでは、拡張性が高く可用性が高いため、ストレージエンジンとしてCassandraを使用します。
まず、構成ファイルを作成します。
nano conf/gremlin-server/custom-titan-config.properties
これらの行を追加して、ストレージバックエンドとは何か、どこで利用できるかを定義します。 ストレージバックエンドはcassandrathrift
に設定されています。これは、Cassandraのthriftインターフェースを備えたストレージにCassandraを使用していることを示しています。
conf/gremlin-server/custom-titan-config.properties
storage.backend=cassandrathrift
storage.hostname=localhost
次に、これらの3行を追加して、使用する検索バックエンドを定義します。 検索バックエンドとしてelasticsearch
を使用します。
conf/gremlin-server/custom-titan-config.properties
...
index.search.backend=elasticsearch
index.search.hostname=localhost
index.search.elasticsearch.client-only=true
3行目は、ElasticSearchがデータを格納しないシンクライアントであることを示しています。 false
に設定すると、データを保存する可能性のある通常のElasticSearchクラスターノードが作成されますが、これは今は必要ありません。
最後に、この行を追加して、Gremlin Serverが提供するグラフのタイプを指定します。
conf/gremlin-server/custom-titan-config.properties
...
gremlin.graph=com.thinkaurelius.titan.core.TitanFactory
conf
ディレクトリには、参照用に調べることができる構成ファイルの例がいくつかあります。
ファイルを保存し、エディターを終了します。
この新しい構成ファイルをGremlin Serverに追加する必要があります。 Gremlin Serverの構成ファイルを開きます。
nano conf/gremlin-server/gremlin-server.yaml
graphs
セクションに移動し、次の行を見つけます。
conf/gremlin-server/gremlin-server.yaml
..
graph: conf/gremlin-server/titan-berkeleyje-server.properties}
..
これでこれを置き換えます:
conf/gremlin-server/gremlin-server.yaml
..
graph: conf/gremlin-server/custom-titan-config.properties}
..
ファイルを保存して終了します。
ここで、Titanを停止して再起動し、Titanを再起動します。
./bin/titan.sh stop
./bin/titan.sh start
カスタム構成ができたので、Titanをサービスとして実行するように構成しましょう。
[[step-4 -—- managing-titan-with-systemd]] ==ステップ4—Systemdを使用したTitanの管理
サーバーが起動するたびにTitanが自動的に起動することを確認する必要があります。 サーバーが誤って再起動された場合、または何らかの理由で再起動する必要がある場合は、Titanも起動する必要があります。
これを設定するには、TitanのSystemdユニットファイルを作成して、管理できるようにします。
まず、.service
拡張子を持つ/etc/systemd/system
ディレクトリ内にアプリケーション用のファイルを作成します。
sudo nano /etc/systemd/system/titan.service
ユニットファイルはセクションで構成されます。 [Unit]
セクションは、サービスの説明やサービスの開始時期など、サービスのメタデータと依存関係を指定します。
この構成をファイルに追加します。
/etc/systemd/system/titan.service
[Unit]
Description=The Titan database
After=network.target
ネットワークターゲットに到達したafterでサービスを開始するように指定します。 つまり、ネットワークサービスの準備が整ってからこのサービスを開始します。
[Unit]
セクションの後に、サービスの開始方法を指定する[Service]
セクションを定義します。 これを構成ファイルに追加します。
/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
まず、サービスを実行するユーザーとグループを定義します。 次に、サービスのタイプを定義します。 タイプはデフォルトでsimple
であると想定されています。 Titanの起動に使用している起動スクリプトは他の子プログラムを起動するため、サービスタイプをforking
として指定します。
次に、PATH
環境変数、Titanの作業ディレクトリ、およびTitanを起動するために実行するコマンドを指定します。 Titanを起動するコマンドをExecStart
変数に割り当てます。
ExecStop
変数は、サービスを停止する方法を定義します。
最後に、次のような[Install]
セクションを追加します。
/etc/systemd/system/titan.service
[Install]
WantedBy=multi-user.target
Install
セクションでは、サービスを有効または無効にできます。 WantedBy
ディレクティブは、/etc/systemd/system
ディレクトリ内にmulti-user.target
というディレクトリを作成します。 Systemdは、このユニットファイルのシンボリックリンクをそこに作成します。 このサービスを無効にすると、このファイルがディレクトリから削除されます。
ファイルを保存し、エディターを閉じて、新しいサービスを開始します。
sudo systemctl start titan
次に、このサービスを有効にして、サーバーが起動するたびにTitanが起動するようにします。
sudo systemctl enable titan
次のコマンドを使用して、Titanのステータスを確認できます。
sudo systemctl status titan
ユニットファイルの詳細については、チュートリアルUnderstanding Systemd Units and Unit filesをお読みください。
結論
これで、基本的なTitanセットアップがサーバーにインストールされました。 Titanのアーキテクチャを詳しく調べたい場合は、遠慮なくofficial documentationを確認してください。
Titanを設定したので、official documentationを見て、Tinkerpop3とGremlinについて詳しく知る必要があります。