SPARQLthon19/PubChemLoad

提供:TogoWiki

移動: 案内, 検索

ここでは、サイズの大きなRDFをVirtuosoにロードする作業手順を紹介します。
対象としたデータはPubChemの一部のRDFですが、他のデータでも作業の流れは一緒です。


目次

Virtuosoのインストール

VirtuosoのOpenSource7.1(stable版)を使用する。
※以下手順ではgitからソースを取得するため、デフォルトでその時点での最新バージョンをインストールすることになります

ダウンロード

ソースコードをダウンロードする用のディレクトリを作成してgitで取得する。

$ mkdir -p /home/bio/src/virtuoso71
$ cd /home/bio/src/virtuoso71
$ git clone git://github.com/openlink/virtuoso-opensource.git
$ cd virtuoso-opensource
$ git checkout stable/7

インストール

ビルド&インストールを行う際、ポート1111が使用されている場合にはビルドが通らないので、予めそのサービスを止める等しておく。

$ sh autogen.sh //ここで不足ライブラリがあればメッセージがでるので、それに従ってライブラリをインストールする
$ ./configure --prefix=/data/ep/virtuoso71pubchem --with-readline //prefixパラメータでインストール先を指定
$ make
$ make install //インストール先によってはsudoをつけて実行する

上記のパスでインストールした場合、以下2つのディレクトリが作業の起点となる。
Virtuosoディレクトリ:/data/ep/virtuoso71pubchem
DBディレクトリ:/data/ep/virtuoso71pubchem/var/lib/virtuoso/db

起動確認

DBディレクトリに移動し、設定ファイル(virtuoso.ini)でデフォルトの起動ポートを変更した後、バックグラウンドで起動する。
※ 同じサーバでVirtuosoを一つしかインストールしない場合にはポートはデフォルトのままでよい。2つ目をインストールする場合にはポートがバッティングしてビルドが失敗する。
※ virtuoso.iniファイルがあるディレクトリ(DBディレクトリ)で起動コマンドを実行するか、+configパラメータで指定しないとエラーになる。

$ cd /data/ep/virtuoso71pubchem/var/lib/virtuoso/db
$ vi virtuoso.ini
 47 [Parameters]
 48 ServerPort                      = 1111  →  1112

120 [HTTPServer]
121 ServerPort                      = 8890  →  8892

231 DefaultHost                     = localhost:8890  →  localhost:8892
$ /data/ep/virtuoso71pubchem/bin/virtuoso-t -f &    //バックグラウンド
・・・・
22:33:40 Checkpoint started
22:33:40 Checkpoint finished, log reused
22:33:40 HTTP/WebDAV server online at 8892
22:33:40 Server online at 1112 (pid 59652) //ポート番号とPIDが出てくれば正常起動の証。エンターを押す。
  • isqlの起動確認(SQL> と対話型コマンドモードになればOK)

設定ファイルで指定したポート番号(1112)に接続する

$ /data/ep/virtuoso71pubchem/bin/isql 1112 dba dba
SQL> 
  • conductor(GUIツール)の起動確認

設定ファイルで指定したポート番号(8892)に接続する
http://SERVER_IP:8892/

  • エンドポイントの起動確認

http://SERVER_IP:8892/sparql

  • 停止
SQL> shutdown();

尚、インストール後の初回起動時に、デフォルトのDBファイル群が生成される。

$ ls
virtuoso-temp.db virtuoso.db virtuoso.ini virtuoso.log virtuoso.pxa virtuoso.trx

RDFデータの取得

今回はPubChemRDF のcompound/generalのRDFを使用する。
サーバにRDFファイルを置く場所を作成して、ファイルをダウンロードする。

$ mkdir -p /data/RDF/pubchem/compound/general/  //任意のパス
$ cd /data/RDF/pubchem/compound/general/
$ wget -r -np ftp://ftp.ncbi.nlm.nih.gov/pubchem/RDF/compound/general/

ロードに向けての設定

$ cd /data/ep/virtuoso71pubchem/var/lib/virtuoso/db
$ vi virtuoso.ini

ロードディレクトリの追加

ロードするファイルを置いているディレクトリを追加する(カンマ区切り)

   DirsAllowed                     = ., /data/ep/virtuoso71pubchem/share/virtuoso/vad
   ↓
   DirsAllowed                     = ., /data/ep/virtuoso71pubchem/share/virtuoso/vad, /data/RDF/pubchem

バッファサイズ(使用メモリ)の設定値の見積

ロードデータが大きい場合、デフォルトではバッファサイズが小さな設定になっていて、パフォーマンスに著しく影響が出るので必ず変更する。
初めてロードするデータの場合、どの程度の値に設定すればいいのか分からないので、以下3通りのいずれかで試してみて、足りなければやり直して調整していく。

  • virtuoso.iniの変更箇所(設定値は例)
    116 NumberOfBuffers          = 10000 → 5450000  //1buffer=8.5kBとして≒実メモリ使用量
    117 MaxDirtyBuffers          = 6000 → 4000000 //NumberOfBuffersの3/4程度の値
      MaxCheckpointRemap       = 1400000 //追加。NumberOfBuffersの1/4程度の値
        UnremapQuota             = 0  //追加。

(案1)使用可能メモリの上限で設定する

サーバの搭載メモリサイズからバッファサイズを見積もる。virtuoso.iniに4G,8G,16G,32G,64Gの場合の設定値の例が記載されているので、参考にする。ドキュメント 例えば64Gのサーバ上で他にメモリを使うサービスを立ち上げていないなら、この値が推奨される。

;; Uncomment next two lines if there is 64 GB system memory free
;NumberOfBuffers          = 5450000
;MaxDirtyBuffers          = 4000000

この場合、5450000 x 8.5kB(1buffer) = 46,325,000(=46G)のメモリが消費される。
実際にはBuffer以外にもメモリ消費するので、サーバのギリギリの値では設定しないこと

(案2)ファイルの大きさから見積もる

RDFのファイルサイズからおおまかな使用バッファサイズを見積もる。正確には見積もれないが、ある程度あたりをつけられる
これまでの経験として、まずは非圧縮のTTL形式のファイルサイズ(全ファイルの合計)=使用メモリ量として見積もる。RDFの記述の仕方によって大きく差がでる場合もあるので目安。
たとえば、今回ダウンロードしたRDFのディレクトリ(/data/RDF/pubchem/compound/general/)にttl(非圧縮)形式でファイルが入っていて、
50Gの容量であれば、50Gのメモリを消費するものと考えて次のように計算する

ファイル(合計)サイズ : 50G = メモリ使用量: 50G ÷ 8.5kB(1buffer) = ≒ 6000000Buffers

NumberOfBuffers = 6000000 MaxDirtyBuffers = 4500000 MaxCheckpointRemap = 1500000 UnremapQuota = 0


(案3)小さな設定値で試す

RAIDやSSD等を使ってディスクI/Oが高速な環境であれば、バッファサイズが小さくてもロードできるケースがある。
その場合、小さな値(4G用や8G用)に設定してみてロードを試してみると、無駄に大きなバッファサイズを設定してしまう事を防げる。


デフォルト設定ファイルからの変更箇所のまとめ

ここでは、使用するバッファサイズは案1のメモリサイズの上限(64G用)で設定することにする。
それを含めて、デフォルトの設定ファイルからの変更箇所をまとめると以下のようになる。

$ vi virtuoso.ini

//(32行目付近)コメントアウト化
;MaxCheckpointRemap             = 2000

//(48行目付近)isqlポート(デフォルト=1111)の変更
ServerPort                      = 1112

//(66行目付近)ロードディレクトリの追加 
DirsAllowed                     = ., /data/ep/virtuoso71pubchem/share/virtuoso/vad

//(109行目付近)64G用の設定のコメントアウトを外す
;; Uncomment next two lines if there is 64 GB system memory free
;NumberOfBuffers          = 5450000
;MaxDirtyBuffers          = 4000000
↓
NumberOfBuffers          = 5450000
MaxDirtyBuffers          = 4000000
MaxCheckpointRemap       = 1400000 //追加
UnremapQuota             = 0 //追加

//(116行目付近)デフォルト値をコメントアウトする(忘れるとこの値が有効になる)
;NumberOfBuffers          = 10000  //デフォルト値のコメント化
;MaxDirtyBuffers          = 6000


//(121行目付近)Webサーバポート(デフォルト=8890)の変更
ServerPort                      = 8892

//(231行目付近)ホスト名(デフォルト=localhost:8890)の変更
DefaultHost                     = localhost:8892

バックグラウンドで起動し、topかpsコマンドでメモリ設定が確認する。 仮想メモリサイズがNumberOfBuffers×8.5kB付近であれば、バッファサイズの設定は有効である。

$ /data/ep/virtuoso71pubchem/bin/virtuoso-t -f &
$ ps auxw | grep virtuoso
bio      60278 45.0 30.4 46019784 22634920 pts/6 Sl 22:56   0:09 /data/ep/virtuoso71pubchem/bin/virtuoso-t -f
//上記の出力であれば 仮想メモリ 46019784 ≒ 44646400( NumberOfBuffers(5450000)*8.5)なのでOK

ロードの実行

rdf_loader_run()の実行

isqlに接続して、ロードするファイルを登録してからロードコマンドで開始する。今回はディレクトリ内の多数のファイルをロードするため、rdf_loader_run()を使う。ロードコマンドについて

$ /data/ep/virtuoso71pubchem/bin/isql 1112 dba dba
//ファイルの登録。第一引数=対象ディレクトリ、第二引数=対象ファイル、第三引数=ロードするグラフ名
SQL> ld_dir_all ('/data/RDF/pubchem/compound/general', '*.gz', 'http://pubchem.ncbi.nlm.nih.gov/compound/general');
//ロードの実行
SQL> rdf_loader_run(); 
22:58:47 PL LOG: Loader started //ロード開始のメッセージ

※ロードが長くかかって待てない場合はバックグラウンドに移してもよい(Ctrl+zでisqlを抜けた後に$bg と打つ)。

進捗の確認

rdf_loader_run()でロードを実行する場合には進捗が確認できる。

$ /data/ep/virtuoso71pubchem/bin/isql 1112 dba dba

//ロード対象ファイル数を確認
SQL> SELECT COUNT(*) FROM DB.DBA.LOAD_LIST;
count
INTEGER
_______________________________________________________________________________

735

//未実行(残数)のファイル数を確認
SQL> SELECT COUNT(*) FROM DB.DBA.LOAD_LIST WHERE ll_state = 0;
count
INTEGER
_______________________________________________________________________________

703

1 Rows. -- 1 msec.

//終わったロードの詳細を確認。1ファイル毎のロード時間も分かるため、ロード時間が見積もりやすい。
//ロードエラーがあれば、ll_errorにメッセージが出る。
SQL> SELECT * FROM DB.DBA.LOAD_LIST WHERE NOT ll_state = 0;
ll_file                                                                           ll_graph                                                                          ll_state    ll_started           ll_done              ll_host     ll_work_time  ll_error
VARCHAR NOT NULL                                                                  VARCHAR                                                                           INTEGER     TIMESTAMP            TIMESTAMP            INTEGER     INTEGER     VARCHAR
_______________________________________________________________________________

/data/RDF/pubchem/compound/general/pc_comp_00000001_00100000.ttl.gz               http://pubchem.ncbi.nlm.nih.gov/compound/general                                  2           2014.5.22 22:58.47 0  2014.5.22 22:59.1 0  0           NULL        NULL
/data/RDF/pubchem/compound/general/pc_comp_00100001_00200000.ttl.gz               http://pubchem.ncbi.nlm.nih.gov/compound/general                                  2           2014.5.22 22:59.1 0  2014.5.22 22:59.13 0  0           NULL        NULL
/data/RDF/pubchem/compound/general/pc_comp_00200001_00300000.ttl.gz               http://pubchem.ncbi.nlm.nih.gov/compound/general                                  2           2014.5.22 22:59.13 0  2014.5.22 22:59.27 0  0           NULL        NULL
/data/RDF/pubchem/compound/general/pc_comp_00300001_00400000.ttl.gz               http://pubchem.ncbi.nlm.nih.gov/compound/general                                  2           2014.5.22 22:59.27 0  2014.5.22 22:59.39 0  0           NULL        NULL
/data/RDF/pubchem/compound/general/pc_comp_00400001_00500000.ttl.gz               http://pubchem.ncbi.nlm.nih.gov/compound/general
・・・・

ロードの完了

ロードが終わると、次のメッセージがisqlに表示される。(バックグラウンドで実行した場合にはvirtuoso.logに出る)

01:26:32 PL LOG: No more files to load. Loader has finished,

エラーが出なかったか確認。virtuoso.logを見るか、DB.DBA.LOAD_LISTで検索すれば確認できる。

SQL> SELECT * FROM DB.DBA.LOAD_LIST WHERE ll_error IS NOT NULL;

ロードしたトリプル数の確認。(グラフ指定してクエリをかける)

SQL> SPARQL SELECT COUNT(*) FROM <http://pubchem.ncbi.nlm.nih.gov/compound/general> WHERE { ?s ?p ?o };
callret-0
INTEGER
_______________________________________________________________________________

423195331


うまく行かなかった場合

よくひっかかる罠(適切なエラーメッセージは出ない)と対処法を紹介。

ロードを実行するとすぐに終わるが実際にはロードされていない

rdf_loader_run()でロードを実行する前のld_dir_all()で対象ファイルが登録出来ていない可能性がある。
以下のコマンドでロードファイルのリストを出力し、ディレクトリやファイルに間違いがないか確認する。

SQL> SELECT * FROM DB.DBA.LOAD_LIST;

間違いなく対象ファイルが登録されていても、以前ロードを実行した事があるファイルはスキップされてしまうため、ロード履歴を削除する必要がある。方法

ロードが途中で進まなくなる

バッファサイズ(メモリ)不足のケース

バッファサイズが不足すると、ある時点でロードが極端に遅くなることがある。
これが原因の場合にはvirtuoso.iniでバッファサイズの設定値(NumberOfBuffers, MaxDirtyBuffers, MaxCheckpointRemap)を大きくして再度ロードを試してみる。
例えば半分程度ロードした時点で速度低下がみられるようであれば、設定値を2倍にしてみる。rdf_loader_run()でロードした場合、どの時点で速度低下したかはLOAD_LISTテーブルで確認できる。方法
尚、バッファサイズの設定値が搭載メモリ量を超えた場合にもSWAPが発生してしまって、同様の現象が起きると思われる。

ログモードが正しくない

単一ファイルのロードで用いるTTLP_MT()やRDF_LOAD_RDFXML_MT()コマンドの場合、手前でlog_enable(2,1);かlog_enable(3,1);を打たなければ最後のcommitが走らないためか、ロードがいつまでも終わらないような現象がみられる。TTLP_MP RDF_LOAD_RDFXML_MT

個人用ツール