Wikipedia日本語版のダンプデータをMWDumperでMariaDBに投入する
スポンサーリンク
今更なネタですが、いくつか注意点があるのでメモとして。
前置き
Wikipedia 日本語版のダンプデータのうち、本文のみ投入します。APIもあるようですが、手元にあったほうが試行錯誤しやすいよねってことで。
英語版も同じ要領で行けるようですが、文字コード周りに注意が必要なようです*1。
いつものごとく環境はUbuntu 15.04、メモリー2GB。
準備
用意するもの
- jawiki-*-pages-articles.xml.bz2
- Javaのランタイム(JDK7辺りが無難)
- MWDumper バイナリ
- mariadb(mysql)
- テーブル定義ファイル(tables.sql)
要注意なのはtables.sql。最新のmediawiki付属のものを使うと失敗します。以前は下記のページからSubversionのリポジトリへのリンクがありましたが、今はgitのリポジトリへとリダイレクトされます。2014年のものを入手する必要があるので注意。
Manual:データベースのレイアウト - MediaWiki
※ Wikipedia が使用しているmediawikiのバージョンは、下記のページによると1.26wmf22のようです。
ダンプデータの入手
不定期でダンプデータが公開されているようです。
本文さえあればいいので、リンクをたどって、jawiki-*-pages-articles.xml.bz2 をダウンロードします。 何が何やらよくわからん、という場合はlatestではなくて、日付入りの方のリンクに概要があります。
jawiki dump progress on 20150901
他の言語も含めたダンプの進捗は下記。
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。
どうやら下記の順序で読み込まれ、後に読み込まれたファイルの設定が優先される模様。 (と、設定ファイルのコメントに説明がある。)
- "/etc/mysql/mariadb.cnf" (システム全体に関連するもの)
- "/etc/mysql/conf.d/*.cnf" (コマンドやデーモンごとにファイルを分割)
- "/etc/mysql/mariadb.conf.d/*.cnf" (MariaDB専用)
- "~/.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のミラーから入手すれば大丈夫だろうと思います。
「Raw」というボタンをクリックしてダウンロードできます。
私は以前入手したものを使いました。2014年の6月か7月ごろのやつだったはず。新しいsqlのほうが多少はチューニングされてたりして。
参考:
- rMW5f8edb2c0a24b88b84f66b851b63a01b36b1a12c
- History for maintenance/tables.sql - wikimedia/mediawiki · GitHub
データベースの準備
事前に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) (省略)
ソースからビルドする場合は、
$ 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時間ぐらいはかかる。まじめにチューニングしないとまじ遅い。慢心、恐るべし恐るべし。
おまけ
昼から出かけて夕方に戻っても終わってなかったという。チューニングさぼったのはまずかった模様。
メモリ使用量
まだまだ余裕があるように見える。
CPU
薄緑の帯はiowait。まあそうですよね、さくらのVPSのHDDプランだしね。 CPUとメモリは余裕がありように見える。次回はさくらのクラウドで挑んでみるのもいいかもしれない。
今気づいたけど、mackerelのグラフ表示、全画面表示にした状態でドラッグ操作でグラフを拡大すると、ドラッグした範囲とハイライトされる部分がずれて、結果的に意図した拡大範囲とずれる。 あとカスタムメトリックのグラフは全画面表示にできない?。
参考URL
- Wikipedia の本文データをデータベースに投入する手順 - 地平線に行く
- Manual:MWDumper - MediaWiki
- Manual:MWDumper/ja - MediaWiki
- beingTested. » wikipediaデータ利用でハマった件
*1:utf8mb4? を設定する必要があるらしい