今日も微速転進

ここではないどこかへ

Wikipedia日本語版のダンプデータをMWDumperでMariaDBに投入する


スポンサーリンク

今更なネタですが、いくつか注意点があるのでメモとして。

前置き

Wikipedia 日本語版のダンプデータのうち、本文のみ投入します。APIもあるようですが、手元にあったほうが試行錯誤しやすいよねってことで。

英語版も同じ要領で行けるようですが、文字コード周りに注意が必要なようです*1

いつものごとく環境はUbuntu 15.04、メモリー2GB。

準備

用意するもの

要注意なのはtables.sql。最新のmediawiki付属のものを使うと失敗します。以前は下記のページからSubversionリポジトリへのリンクがありましたが、今はgitのリポジトリへとリダイレクトされます。2014年のものを入手する必要があるので注意。

Manual:データベースのレイアウト - MediaWiki

Wikipedia が使用しているmediawikiのバージョンは、下記のページによると1.26wmf22のようです。

Help:MediaWiki - Wikipedia

ダンプデータの入手

不定期でダンプデータが公開されているようです。

Index of /jawiki/

本文さえあればいいので、リンクをたどって、jawiki-*-pages-articles.xml.bz2 をダウンロードします。 何が何やらよくわからん、という場合はlatestではなくて、日付入りの方のリンクに概要があります。

jawiki dump progress on 20150901

他の言語も含めたダンプの進捗は下記。

Wikimedia Downloads

MariaDB

$ sudo apt install mariadb-client mariadb-server

rootのパスワード設定を促されるはずですが、他のディストリビューションの場合は下記のコマンドで設定できるはず。

$ sudo mysql_secure_installation

一旦DBサーバーを停止させておく。

$ sudo systemctl stop mysql

設定の確認

チューニングした方が断然短時間で終わるようですが、出かけるついでに放置していくなり、寝ている間に実行しておくなりすれば問題ないかと。

次の一行を[mysqld]を確認(なければ追加)。MWDumperを利用する場合、一度に1000ページずつコミットされるため、下記のパラメータが設定されていないと失敗します。

max_allowed_packet = 16M

Ubuntuの場合、設定ファイルが細分化されていますが、要は

配下の設定ファイルをいじればOK。

どうやら下記の順序で読み込まれ、後に読み込まれたファイルの設定が優先される模様。 (と、設定ファイルのコメントに説明がある。)

  1. "/etc/mysql/mariadb.cnf" (システム全体に関連するもの)
  2. "/etc/mysql/conf.d/*.cnf" (コマンドやデーモンごとにファイルを分割)
  3. "/etc/mysql/mariadb.conf.d/*.cnf" (MariaDB専用)
  4. "~/.my.cnf" (ユーザー個別の設定)
$ vi /etc/mysql/mariadb.conf.d/mysqld.cnf

なお、チューングする場合は下記を参考に。

mariadbを再起動。

$ sudo systemctl start mysql

JDKの導入

MWDumperをコンパイルするつもりがないなら、jreでも問題ないはず。

$ sudo apt install default-jdk

OpenJDK 7が入るはず。

table 作成

tables.sql 確保

page_counter というテーブルがないと失敗します。MWDumperの出力するSQLを加工して仕舞えばいいようにも思いますが、以下のリビジョンより 古いものをGithubのミラーから入手すれば大丈夫だろうと思います。

maintenance/tables.sql

「Raw」というボタンをクリックしてダウンロードできます。

私は以前入手したものを使いました。2014年の6月か7月ごろのやつだったはず。新しいsqlのほうが多少はチューニングされてたりして。

参考:

データベースの準備

事前にwikidbというデータベースを作成しておき、テーブル作成用のSQLを流し込む。

$ cat tables.sql | sudo mysql -u root -p wikidb
$ echo $?
0

Ubuntu 15系のMariaDBですが、Unix domain socket で接続する場合、-uオプションでrootを指定したときにmysqlコマンドを実行しているユーザがrootでないとダメらしい。

確認のためにmariadbにログインする。

テーブルが作成されているか確かめる。

MariaDB > use wikidb ;
MariaDB [wikidb]> show tables ;
省略

mediawiki dumperのセットアップ

公式ビルドがない?ようなので Manual:MWDumper/ja - MediaWiki

ビルドが面倒ならこの辺りGUIなしのサードパーティビルドを使う。さもないと、いかのようなエラーに見舞われることがある。

Exception in thread "main" java.awt.HeadlessException
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java
:207)
(省略)

ソースからビルドする場合は、

Githubのミラー

$ git clone https://github.com/wikimedia/mediawiki-tools-mwdumper.git

[2016/01/28 git cloneのアドレスが間違っていたので修正]

または公式リポジトリ

$ git clone https://gerrit.wikimedia.org/r/p/mediawiki/tools/mwdumper.git

maven用のビルド設定ファイルがあるので、まずはmavenというツールをインストールする。

$ sudo apt install maven

pom.xml のファイルがあるところで、

$ mvn pakcage

ビルドが成功すると、target ディレクトリの下に、mwdumper-XXX.jarみたいなのが生成される。これを適当なところにコピーする。

org.apache.commons.compress.compressors.bzip2 がないとかエラーが出るのであれば、

$ sudo apt install libcommons-compress-java

データの投入

$ java -jar mwdumper-1.16.jar --format=sql:1.5 jawiki-20150901-pages-articles.xml.bz2  | sudo mysql -u root -p wikidb  --default-character-set=utf8

最初の1,000件でDB側でエラーを吐いていると、あとはいくら画面に進捗が表示されていても無駄。 完了ステータスはきっちり確認する。

$ echo $?
0

標準出力に0と出力されればOK。あくまても直前のコマンドの終了ステータスであることに注意。 念のため、SELECT文で確認します。

$ echo "SELECT * FROM text LIMIT 1;" | sudo mysql -u root wikidb

それらしいテキストが出力されれば成功。

下記のエラーが発生する場合は、tables.sqlの問題なので適切なやつをとってきてCREATE DATABASE wikidb;からやり直す。

ERROR 1054 (42S22) at line 61: Unknown column 'page_counter' in 'field list'

mariadb の設定とI/O性能依存で3、4時間から8時間ぐらいはかかる。まじめにチューニングしないとまじ遅い。慢心、恐るべし恐るべし。

おまけ

昼から出かけて夕方に戻っても終わってなかったという。チューニングさぼったのはまずかった模様。

f:id:atuyosi:20150918203857j:plain ロードアベレージ

f:id:atuyosi:20150918203911j:plain メモリ使用量

まだまだ余裕があるように見える。

f:id:atuyosi:20150918204217j:plain CPU

薄緑の帯はiowait。まあそうですよね、さくらのVPSのHDDプランだしね。 CPUとメモリは余裕がありように見える。次回はさくらのクラウドで挑んでみるのもいいかもしれない。

今気づいたけど、mackerelのグラフ表示、全画面表示にした状態でドラッグ操作でグラフを拡大すると、ドラッグした範囲とハイライトされる部分がずれて、結果的に意図した拡大範囲とずれる。 あとカスタムメトリックのグラフは全画面表示にできない?。

参考URL

*1:utf8mb4? を設定する必要があるらしい

広告