概要
昨今、「ビッグデータ」や「BI」というワードを頻繁に耳にしますね。その影響もあってか、大規模なログデータを扱うのに最適な「カラム指向データベース」が注目を集めています。
MariaDB社が開発・提供する MariaDB ColumnStore (以下、ColumnStore)は、そんなカラム指向データベースの一つです。実際には、XtraDB や Spider のようにストレージエンジンとして実装されており、もちろんオープンソースとして利用が可能です。
この記事では、実際に MariaDB ColumnStore をインストールし、簡易的なベンチマークを実施してみた内容を記載したいと思います。
インストール
Preparing for ColumnStore Installation
上記の公式ページを参考にして、ColumnStore を CentOS 7.2 サーバにインストールします。
・今回は root ユーザでインストールを実施します(一般ユーザでインストールも可能)
・「シングルサーバ構成」「マルチサーバ構成」の2種類ありますが、今回は前者を採用します
→ そのため、上記ページのうち、一部の不要な手順はスキップしています
1. 既存のMariaDB(MySQL)をアンインストールする
既にサーバにMariaDB(MySQL)がインストールされている場合は、事前にアンインストールします。
1 |
# yum -y remove MariaDB-server |
2. ColumnStoreの関連パッケージをインストール
ColumnStoreを使用する上で必要な関連パッケージをインストールします。
1 |
# yum -y install boost expect perl perl-DBI openssl zlib file sudo libaio rsync snappy net-tools perl-DBD-MySQL |
3. RPMパッケージのダウンロード
下記URLから、RPMパッケージをダウンロードします。
1 |
# wget https://downloads.mariadb.com/ColumnStore/1.0.9/centos/x86_64/7/mariadb-columnstore-1.0.9-1-centos7.x86_64.rpm.tar.gz |
4. RPMパッケージのインストール
.tar.gz パッケージを展開して、RPMパッケージをインストールする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# tar zxvf mariadb-columnstore-1.0.9-1-centos7.x86_64.rpm.tar.gz # rpm -ivh *.rpm # rpm -qa | grep mariadb mariadb-columnstore-libs-1.0.9-1.x86_64 mariadb-columnstore-platform-1.0.9-1.x86_64 mariadb-columnstore-common-1.0.9-1.el7.centos.x86_64 mariadb-columnstore-client-1.0.9-1.el7.centos.x86_64 mariadb-columnstore-gssapi-server-1.0.9-1.el7.centos.x86_64 mariadb-columnstore-storage-engine-1.0.9-1.x86_64 mariadb-libs-5.5.52-1.el7.x86_64 mariadb-columnstore-shared-1.0.9-1.el7.centos.x86_64 mariadb-columnstore-server-1.0.9-1.el7.centos.x86_64 mariadb-columnstore-gssapi-client-1.0.9-1.el7.centos.x86_64 |
5. postConfigureを実行
ColumnStoreの初期設定は、postConfigureコマンドで行います。
設定項目が表示されるので、設定したい内容を入力していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# /usr/local/mariadb/columnstore/bin/postConfigure Select the type of System Server install [1=single, 2=multi] (2) > 1 Enter System Name (columnstore-1) > mcs-test-1 Select the type of Data Storage [1=internal, 2=external] (1) > 1 Enter the list (Nx,Ny,Nz) or range (Nx-Nz) of DBRoot IDs assigned to module 'pm1' (1) > 1 ===== Performing Configuration Setup and MariaDB ColumnStore Startup ===== ... Enter 'mcsmysql' to access the MariaDB ColumnStore SQL console Enter 'mcsadmin' to access the MariaDB ColumnStore Admin console |
6. 各コマンドへのエイリアスを作成
columnstoreAlias を実行すると、ColumnStoreで使用する各コマンドへのエイリアスが作成されます。パスを通すイメージです。
1 2 3 |
# . /usr/local/mariadb/columnstore/bin/columnstoreAlias # mcsadmin help → ヘルプが出力されれば成功 |
ベンチマーク
ColumnStoreの性能を検証するため、簡易的なベンチマークを実施します。
1. テストデータを用意する
下記サイトから、以下のファイルをダウンロードしてColumnStoreサーバに配置します。
・pagecounts-20160501-000000.gz
・pagecounts-20160502-000000.gz
・pagecounts-20160503-000000.gz
・pagecounts-20160504-000000.gz
・pagecounts-20160505-000000.gz
配置したら .gz ファイルを展開し、中身を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 |
# gunzip -r pagecounts-2016050* # ls -lh pagecounts-2016050* -rwxr-xr-x. 1 root root 353M May 17 15:58 pagecounts-20160501-000000 -rwxr-xr-x. 1 root root 308M May 17 15:58 pagecounts-20160502-000000 -rwxr-xr-x. 1 root root 318M May 17 15:58 pagecounts-20160503-000000 -rwxr-xr-x. 1 root root 291M May 17 15:58 pagecounts-20160504-000000 -rwxr-xr-x. 1 root root 346M May 17 15:58 pagecounts-20160505-000000 # head pagecounts-20160501-000000 aa Category:Language_user_templates 1 6020 aa File:Hitchhicking_on_the_road_132_-_Gasp%C3%A9sie_Canada.jpg 1 8520 → 半角スペース区切りで1行に4つの値が含まれています |
2. テストデータを加工する
後に使用する cpimport が、半角スペース区切りのファイルに対応していないため、半角スペースをタブに変換します。
1 2 3 4 5 |
# cat ./pagecounts-20160501-000000 | tr ' ' '\t' > ./pagecounts-20160501-000000_convert # cat ./pagecounts-20160502-000000 | tr ' ' '\t' > ./pagecounts-20160502-000000_convert # cat ./pagecounts-20160503-000000 | tr ' ' '\t' > ./pagecounts-20160503-000000_convert # cat ./pagecounts-20160504-000000 | tr ' ' '\t' > ./pagecounts-20160504-000000_convert # cat ./pagecounts-20160505-000000 | tr ' ' '\t' > ./pagecounts-20160505-000000_convert |
3. データベースおよびテーブルを作成する
テストデータをインポートするデータベースとテーブルを作成します。なお、ColumnStoreを利用する場合は、CREATE TABLE 実行時に「engine = columnstore」を指定する必要があります。
(デフォルトのストレージエンジンはInnoDBです)
1 2 3 4 5 6 |
# mcsmysql MariaDB [(none)]> create database wiki_test; MariaDB [(none)]> use wiki_test; MariaDB [wiki_test]> create table page_counts_1 (domain_code varchar(10), page_title varchar(500), count_views int unsigned, total_response_size int unsigned) engine=columnstore; MariaDB [wiki_test]> exit |
※ テーブル定義は下記のサイトを参考にしています
https://wikitech.wikimedia.org/wiki/Analytics/Archive/Data/Pagecounts-raw
4. 1ファイル分のインポート/SELECTにかかる時間を計測する
cpimportコマンドを使用して、ColumnStoreにデータ(1ファイル)をインポートするのにかかる時間を計測します。
1 2 3 4 5 6 7 8 9 10 |
# time cpimport wiki_test page_counts_1 ./pagecounts-20160501-000000_convert -s "\t" Locale is : C Column delimiter : \t ... 2017-05-25 10:28:47 (22197) WARN : Column wiki_test.page_counts_1.total_response_size; Number of rows inserted with saturated values: 8 2017-05-25 10:28:48 (22197) INFO : Bulk load completed, total run time : 15.3101 seconds real 0m16.529s user 0m6.575s sys 0m2.127s |
※ -s オプション : DELIMITERを指定(デフォルトは”|”), 今回はTAB区切りのため”\t”
SELECT count(*) 文を実行し、かかる時間を計測します。
1 2 3 4 5 6 7 8 9 10 |
# time mcsmysql -e "select count(*) FROM wiki_test.page_counts_1" +----------+ | count(*) | +----------+ | 6296217 | +----------+ real 0m0.313s user 0m0.006s sys 0m0.002s |
5. 全データをインポートし、SELECTにかかる時間を計測する
残っている4ファイル分のデータをインポートします。
1 2 3 4 5 6 7 8 9 10 11 12 |
# time cpimport wiki_test page_counts_1 ./pagecounts-20160502-000000_convert -s "\t" ... real 0m20.438s # time cpimport wiki_test page_counts_1 ./pagecounts-20160503-000000_convert -s "\t" ... real 0m20.447s # time cpimport wiki_test page_counts_1 ./pagecounts-20160504-000000_convert -s "\t" ... real 0m16.632s # time cpimport wiki_test page_counts_1 ./pagecounts-20160505-000000_convert -s "\t" ... real 0m16.824s |
インポートしたテストデータに対して簡単なSELECT文をいくつか実行し、かかる時間を計測します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# time mcsmysql -e "select count(*) FROM wiki_test.page_counts_1" +----------+ | count(*) | +----------+ | 30375414 | +----------+ real 0m1.247s user 0m0.008s sys 0m0.014s # time ( mcsmysql -e "SELECT domain_code FROM wiki_test.page_counts_1 ORDER BY total_response_size" > /dev/null ) real 1m42.371s user 0m1.806s sys 0m1.438s # time ( mcsmysql -e "SELECT count(*) FROM wiki_test.page_counts_1 GROUP BY domain_code" > /dev/null ) real 0m11.089s user 0m0.003s sys 0m0.007s |
※ クエリの実行結果は不要なので、/dev/null に捨てます
6. テーブルデータのサイズを確認します
今回インポートしたテストデータのサイズを確認します。
1 2 3 4 5 6 7 8 9 10 |
# mcsmysql MariaDB [(none)]> call columnstore_info.total_usage(); +-----------------+------------------+ | TOTAL_DATA_SIZE | TOTAL_DISK_USAGE | +-----------------+------------------+ | 839.35 MB | 1.98 GB | +-----------------+------------------+ 1 row in set (0.96 sec) MariaDB [(none)]> exit |
7. ColumnStoreをアンインストールし、通常のMariaDBをインストールします。
比較対象となるMariaDBをインストールするため、ColumnStoreをアンインストールします。
1 2 3 4 5 6 |
# mcsadmin stopSystem y ... Successful stop of System # rm -f ./mariadb-columnstore-* # yum remove -y mariadb-columnstore-* |
MariaDBのリポジトリを追加していない場合は、これを追加します。
1 2 3 4 5 6 7 |
# cat << EOT >> /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.1/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 EOT |
5月31日時点での最新版である MariaDB 10.1.23 をインストールして、MariaDBを起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# yum install -y MariaDB-server MariaDB-client ... Installed: MariaDB-client.x86_64 0:10.1.23-1.el7.centos MariaDB-server.x86_64 0:10.1.23-1.el7.centos MariaDB-shared.x86_64 0:10.1.23-1.el7.centos Dependency Installed: MariaDB-common.x86_64 0:10.1.23-1.el7.centos galera.x86_64 0:25.3.20-1.rhel7.el7.centos jemalloc.x86_64 0:3.6.0-1.el7 lsof.x86_64 0:4.87-4.el7 Replaced: mariadb-libs.x86_64 1:5.5.52-1.el7 Complete! # systemctl start mysql.service |
8. データベースおよびテーブルを作成する
ColumnStoreと同じデータベース・テーブルを作成します。ただし、こちらはInnoDBストレージエンジンを選択します。
1 2 3 4 5 6 |
# mysql -u root MariaDB [(none)]> create database wiki_test; MariaDB [(none)]> use wiki_test; MariaDB [wiki_test]> create table page_counts_2 (domain_code varchar(10), page_title varchar(500), count_views int unsigned, total_response_size int unsigned) engine=innodb; MariaDB [wiki_test]> exit |
9. 1ファイル分のインポート/SELECTにかかる時間を計測する
LOAD DATA文で1ファイル分のデータをインポートした時に、かかる時間を計測します。
1 2 3 4 5 |
# time mysql -u root wiki_test -e "LOAD DATA LOCAL INFILE '/root/pagecounts-20160501-000000_convert' INTO TABLE page_counts_2 FIELDS TERMINATED BY '\t';" real 0m44.754s user 0m0.046s sys 0m0.321s |
SELECT count(*) 文を実行し、かかる時間を計測します。
1 2 3 4 5 6 7 8 9 10 |
# time mysql -u root -e "select count(*) FROM wiki_test.page_counts_2" +----------+ | count(*) | +----------+ | 6296217 | +----------+ real 0m16.329s user 0m0.003s sys 0m0.020s |
10. 全データをインポートし、SELECTにかかる時間を計測する
残っている4ファイル分のデータをインポートします。
1 2 3 4 5 6 7 8 9 10 11 12 |
# time mysql -u root wiki_test -e "LOAD DATA LOCAL INFILE '/root/pagecounts-20160502-000000_convert' INTO TABLE page_counts_2 FIELDS TERMINATED BY '\t';" ... real 0m36.149s # time mysql -u root wiki_test -e "LOAD DATA LOCAL INFILE '/root/pagecounts-20160503-000000_convert' INTO TABLE page_counts_2 FIELDS TERMINATED BY '\t';" ... real 0m37.959s # time mysql -u root wiki_test -e "LOAD DATA LOCAL INFILE '/root/pagecounts-20160504-000000_convert' INTO TABLE page_counts_2 FIELDS TERMINATED BY '\t';" ... real 0m34.564s # time mysql -u root wiki_test -e "LOAD DATA LOCAL INFILE '/root/pagecounts-20160505-000000_convert' INTO TABLE page_counts_2 FIELDS TERMINATED BY '\t';" ... real 0m41.433s |
インポートしたテストデータに対して簡単なSELECT文をいくつか実行し、かかる時間を計測します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# time mysql -u root -e "select count(*) FROM wiki_test.page_counts_2" +----------+ | count(*) | +----------+ | 30375414 | +----------+ real 1m17.787s user 0m0.002s sys 0m0.018s # time ( mysql -u root -e "SELECT domain_code FROM wiki_test.page_counts_2 ORDER BY total_response_size" > /dev/null ) real 2m59.214s user 0m2.469s sys 0m10.923s # time ( mysql -u root -e "SELECT count(*) FROM wiki_test.page_counts_2 GROUP BY domain_code" > /dev/null ) real 1m39.178s user 0m0.004s sys 0m0.016s |
11. テーブルデータのサイズを確認します
今回インポートしたテストデータのサイズを確認します。
1 2 3 4 5 |
# ls -lh /var/lib/mysql/wiki_test/ total 2.5G -rw-rw----. 1 mysql mysql 65 May 25 11:09 db.opt -rw-rw----. 1 mysql mysql 1.1K May 25 11:09 page_counts_2.frm -rw-rw----. 1 mysql mysql 2.5G May 25 11:19 page_counts_2.ibd |
まとめ
上記で実施したベンチマークの結果をまとめると、以下のようになります。
この結果をみると、データのインポートおよびSELECT文の両方で、ColumnStoreの方が良いパフォーマンスを出していることが分かります。また、データサイズもColumnStoreの方が小さいため、テーブルのサイズが大きくなるにつれて、その差も顕著になってくると考えられます。
ただし、今回のベンチマークはデフォルト設定、およびインデックスのないテーブルで行っているため、それらを考慮して再度実施すると結果は変わってくる可能性があります。あくまで参考程度に捉えて頂けると幸いです。