SPARQLthon17/DDBJ

提供:TogoWiki

移動: 案内, 検索

目次

エンドポイント構築

DDBJエントリーのRDFをトリプルストアにロードする。トリプル数は97億。
過去のページ
SPARQLthon10
SPARQLthon15
SPARQLthon16

安定的ロードの検証

前回まで検証で、最も成功率が高いのはMediumノードなので、その環境でエラーが起きないかロードを繰り返した。

設定&スクリプト

  • ディレクトリ

VirtuosoのDBディレクトリ
例:/home/w3sw/store/virtuoso_stableload/var/lib/virtuoso/db

  • virtuoso_medium.ini

デフォルト(virtuoso.ini)からの変更点(700Gメモリ設定時≒1Tサーバ程度の設定)

[Database]
;MaxCheckpointRemap             = 2000 //コメントアウトして無効化

[Parameters]
ServerPort                      = 1114 //isql用ポートを設定する
DirsAllowed                   = ., /home/w3sw/store/virtuoso_stableload/share/virtuoso/vad, /home/w3sw/okbp //ロードするファイルのディレクトリを追加
MaxMemPoolSize                  = 1500000000 //必須か不明だが、BSBMの設定ファイルに記載があったので変更

;NumberOfBuffers          = 10000 //デフォルトのメモリ量を無効化して大きな値を設定
;MaxDirtyBuffers          = 6000
NumberOfBuffers          = 80000000
MaxDirtyBuffers          = 60000000
MaxCheckpointRemap       = 24000000
UnremapQuota             = 0

[HTTPServer] //Web用(エンドポイントやconductor)用ポートを設定
ServerPort                    = 8894
[URIQA]
DefaultHost                   = localhost:8894

[SPARQL]
;MaxQueryCostEstimationTime   = 400   ; in seconds //見積もり時間数(Virtuosoが誤算することがある)を超えるクエリを実行できなくなるので、無効化
  • add_load_list.sql

ロード対象ファイルの登録スクリプト

ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjbct*.ttl' , 'http://ddbj.nig.ac.jp/graph/bct');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjcon*.ttl' , 'http://ddbj.nig.ac.jp/graph/con');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjenv*.ttl' , 'http://ddbj.nig.ac.jp/graph/env');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjest*.ttl' , 'http://ddbj.nig.ac.jp/graph/est');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjgss*.ttl' , 'http://ddbj.nig.ac.jp/graph/gss');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjhtc*.ttl' , 'http://ddbj.nig.ac.jp/graph/htc');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjhtg*.ttl' , 'http://ddbj.nig.ac.jp/graph/htg');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjhum*.ttl' , 'http://ddbj.nig.ac.jp/graph/hum');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjinv*.ttl' , 'http://ddbj.nig.ac.jp/graph/inv');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjmam*.ttl' , 'http://ddbj.nig.ac.jp/graph/mam');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjpat*.ttl' , 'http://ddbj.nig.ac.jp/graph/pat');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjphg*.ttl' , 'http://ddbj.nig.ac.jp/graph/phg');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjpln*.ttl' , 'http://ddbj.nig.ac.jp/graph/pln');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjpri*.ttl' , 'http://ddbj.nig.ac.jp/graph/pri');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjrod*.ttl' , 'http://ddbj.nig.ac.jp/graph/rod');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjsts*.ttl' , 'http://ddbj.nig.ac.jp/graph/sts');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjsyn*.ttl' , 'http://ddbj.nig.ac.jp/graph/syn');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjtsa*.ttl' , 'http://ddbj.nig.ac.jp/graph/tsa');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjuna*.ttl' , 'http://ddbj.nig.ac.jp/graph/una');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjvrl*.ttl' , 'http://ddbj.nig.ac.jp/graph/vrl');
ld_dir_all('/home/w3sw/okbp/release_94_rdf', 'ddbjvrt*.ttl' , 'http://ddbj.nig.ac.jp/graph/vrt');
  • bulk_load_medium.sh

スパコンにジョブとして投げるシェルスクリプト(ログ出力用コマンドは除去している)

#シェルの宣言。2行目はスパコン向けの宣言
#!/bin/sh
#$ -S /bin/sh

#ファイルパス等の設定
VIRTUOSO_HOME=/home/w3sw/store/virtuoso_stableload
DBBASE=/home/w3sw/store/virtuoso_stableload/var/lib/virtuoso/db
PIDFILE=$DBBASE/virtuoso.lck
PORT=1114

#echoを書いておけばジョブの標準出力としてログが吐かれる
echo  `date +'%Y/%m/%d %H:%M:%S'` "Bulkload start"

#Virtuosoの起動
$VIRTUOSO_HOME/bin/virtuoso-t +config $DBBASE/virtuoso_medium.ini +wait

if [ -f "$PIDFILE" ]; then #PID用ファイルが生成されていれば、正常起動
#チェックポイントの間隔を6000分にしてロード中に発生しないようにする
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="checkpoint;"
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="checkpoint_interval(6000);"
#ロード対象ファイルの登録スクリプトを実行
  $VIRTUOSO_HOME/bin/isql $PORT dba dba < $DBBASE/add_load_list.sql
#ロードの実行
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="rdf_loader_run();"
#チェックポイントの実行
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="checkpoint;"
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="checkpoint_interval(60);"

#Taxonomyファイルのロード
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="log_enable(3,1);"
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="DB.DBA.TTLP_MT (file_to_string_output('/home/w3sw/okbp/rdf/ontology/taxonomy/taxonomy.owl'), '', 'http://ddbj.nig.ac.jp/graph/taxonomy');"

#Virtuosoのシャットダウン
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="shutdown();"

else #起動に失敗した場合
  echo "ERROR! Virutuoso start"
fi

#テキストインデックスを生成するためにVirtuosoを再度起動する
$VIRTUOSO_HOME/bin/virtuoso-t +config $DBBASE/virtuoso_medium.ini +wait

if [ -f "$PIDFILE" ]; then

  sleep 604800 #放置すれば自動的にテキストインデックスの生成が始まる。スパコンのジョブが終了しないために、無理矢理sleepを入れている

  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="checkpoint;"
  $VIRTUOSO_HOME/bin/isql $PORT dba dba exec="shutdown();"
else
  echo "ERROR! Virutuoso start"
fi
  • ジョブ実行コマンド(Mediumノードに700Gメモリを要求)
qsub -l s_vmem=700G -l mem_req=700G -l month -l medium bulk_load_medium.sh

ロード作業内容(ケース1)

工程 所要時間 備考
ロード 25時間19分
チェックポイント 8時間45分
OWLロード 失敗 ロードの途中で進まなくなった。ロード前にlog_enable(3,1)を付けないと起きる場合がある

ロード作業内容(ケース2)

ケース1と同様にDDBJスパコンのmediumノードで実施(同条件)。
通常4~5分で起動するところを80分掛った。
その後のロードスピードもかなり遅かったため停止したが、再度起動して数日後にハングアップした。→スパコン管理者に依頼してプロセス停止

ロード作業内容(ケース3)

DBCLSのep2サーバ上でロードを試行。
メモリ64G用の環境で1週間で80億までロードできたが、徐々に速度が落ちて行き(後半の10億は2日掛っていた)、中断した。
スパコンのThinノードでは同一設定で10億トリプル以上ロードが進まなくなったことから、ハードの違いによってロード時の挙動が変わることを確認した。

ロード作業内容(ケース4)

MSSのサーバ上で、2月18日にリリースされたVirtuoso7.1でロードを試行。
I/Oハンドリングが改善されたという開発者ログがあったが、特に挙動に変化は見られなかった。
vmstatで監視したところ、設定値のメモリ上限を超えた後、I/O wait状態になりロードが進まなくなっていた。

リソースURI用Webページ構築

前回議論

各オントロジーの内容精査

一覧表(dbcls:virtuoso7udp2上で調査)

オントロジー graph名 全トリプル数 リソースタイプ タイプ別リソース数 ブランクノード有(*1)
GMO gmo/ 6956 owl:Class 712 No
owl:DatatypeProperty 7
owl:FunctionalProperty 7
owl:ObjectProperty 3
owl:Ontology 1
MCCV mccv/ 293 owl:ObjectProperty 22 No
owl:DatatypeProperty 22
owl:Class 9
owl:FunctionalProperty 3
owl:Ontology 1
MEO meo/ 4468 owl:Class 783 No
owl:AnnotationProperty 13
owl:DatatypeProperty 13
rdfs:Datatype 1
owl:Ontology 1
MPO mpo/ 734 owl:Class 142 No
owl:ObjectProperty 8
owl:DatatypeProperty 8
owl:Ontology 1
PDO pdo/ 2881 owl:Class 266 No
owl:AnnotationProperty 15
owl:ObjectProperty 10
owl:Ontology 1
CSSO csso/ 2537 owl:Class 270 No
owl:AnnotationProperty 20
owl:Ontology 1
FALDO faldo/ 151 owl:Class 15 YES
owl:Restriction 8
owl:ObjectProperty 6
owl:DatatypeProperty 1
owl:Ontology 1
GO go/ 1211571 owl:Axiom 118267 YES
owl:Class 48542
owl:Restriction 23913
owl:AnnotationProperty 44
owl:ObjectProperty 10
owl:TransitiveProperty 3
owl:Ontology 1
SO so/ 43060 owl:Axiom 4761 YES
owl:Class 2240
owl:Restriction 561
owl:ObjectProperty 48
owl:AnnotationProperty 21
owl:NamedIndividual 11
obo:IAO_synonymtypedef 8
owl:TransitiveProperty 7
owl:SymmetricProperty 4
obo:IAO_subsetdef 3
owl:Ontology 1
Taxonomy(DDBJ) taxonomy/ 10518682 ddbj:Taxon 1093316 YES
ddbj:Rank 29
owl:DatatypeProperty 26
ddbj:GeneticCode 20
owl:ObjectProperty 6
owl:FunctionalProperty 4
owl:Class 3
owl:Ontology 1

(*1) Typeを持つリソースの定義のobject部分がブランクノードになっているものがあるか。あればブランクノードを辿って入れ子構造で表現する必要がある

  • Type毎のリソース数を取得するSPARQL
SELECT ?type (COUNT(?s) AS ?cnt)
FROM <http://togogenome.org/graph/mccv/>
WHERE
{
  ?s a ?type 
} GROUP BY ?type ORDER BY DESC(?cnt)
  • ブランクノードがあるか調べるSPARQL
SELECT ?p (COUNT(?blank) AS ?blank_cnt)
FROM <http://togogenome.org/graph/mccv/>
WHERE
{
  ?s a ?type .
  ?s ?p ?blank FILTER isBlank(?blank).
} GROUP BY ?p 

定義取得用SPARQL

GMO

SELECT DISTINCT ?s ?p ?p_label ?o
FROM <http://togogenome.org/graph/gmo/>
WHERE
{
  ?s a ?type .
  ?s ?p ?o .
  OPTIONAL { ?p rdfs:label ?p_label }
} ORDER BY ?s

MCCV

SELECT DISTINCT ?s ?p ?p_label ?o
FROM <http://togogenome.org/graph/mccv/>
WHERE
{
  ?s a ?type .
  ?s ?p ?o .
  OPTIONAL { ?p rdfs:label ?p_label }
} ORDER BY ?s

課題

  • 日本語データが含まれるので、表示がうまくいくか確認する

MEO

SELECT DISTINCT ?s ?p ?p_label ?o
FROM <http://togogenome.org/graph/meo/>
WHERE
{
  ?s a ?type .
  ?s ?p ?o .
  OPTIONAL { ?p rdfs:label ?p_label }
} ORDER BY ?s

課題

個人用ツール