まだまだ暑さは続いておりますが、いかがお過ごしでしょうか。 SSTDの高橋です。
先日、データサイエンティスト養成読本を個人的に購入しました。 まだ読み終わってはいませんが、せっかく購入したので、こちらの「Data Scientist Casual Talk in 白金台」に参加する予定です。 参加される方はどうぞよろしくお願い致します。 書籍自体はログ収集からログ解析まで幅広い内容をサポートしているので、非常に勉強になりそうです。また、書籍内でも紹介されているfluentdは、過去のブログ記事でも紹介したことがありましたが、リアルタイムログ収集ツールとして非常に有用です。そのため、今後の本ブログでも詳しく紹介していきたいと思います。
さて、それではブログの内容に入ります。 今回は、tdの0.10.84から実装されたtd import機能について紹介していきます。
td import機能とは
これまでTreasureDataに100MB以上のファイルをアップロードする際には、bulk_import機能を利用することが推奨されてきました。 しかし、tdのbulk_import機能は、データ圧縮などのCPUをフルに利用する場面での処理速度に課題がありました。 そのため、0.10.84以降からJavaによって新たに開発されたtd import機能が実装されました。 これによって、皆様のお手持ちのデータをよりスピーディーにTreasureDataへのアップロードが可能となります。
さて、td import機能の中でもmsgpackへのデータ圧縮を行うtd import:prepare機能に今回は焦点を当て、どの程度処理速度が向上したかを比較してみたいと思います。 比較対象として、td bulk_import:prepare_partsを利用します。 利用方法については、bulk_importとほぼ同様のため、こちらのドキュメントを参照して頂きたいと思います。
検証環境
今回は、表2で示す検証用データをAWS S3上に用意していたため、AWS EC2を用いて検証を行いたいと思います。
インスタンス | t1.small |
OS | Amazon Linux 64bit |
コア数 | 1 ECU(1 ECU × 1仮想コア) |
メモリ | 1.7 GB |
root volume | EBS 100 GB |
Ruby version | 1.9.3 |
td version | 0.10.86 |
データの内容 | wikipediaのpageviewの統計情報2011年11月1日~5日 |
データサイズ | 約 35 GB |
ファイル数 | 120ファイル(1月1日0時から1月5日23時まで) |
レコード数 | 約 5.2 億行 |
平均ファイルサイズ | 約 296 MB |
カラムヘッダー | projectcode, pagename, pageviews, bytes, time(ファイル名から時刻を抽出を行い、UnixTimeに変換した時刻を追記) |
カラム例 | “aa.b”, “Main_Page”,”54″, “874168”,1294056000 |
$ td import:prepare ./wiki/*.tsv --format tsv \ --columns projectcode,pagename,pageviews,bytes,time \ --time-column 'time' -o ./out_prepare/ $ td bulk_import:prepare_parts ./wiki/*.tsv --format tsv \ --columns projectcode,pagename,pageviews,bytes,time \ --time-column 'time' -o ./out_bulk/
検証結果
機能 | import:prepare | bulk_import:prepare_parts |
処理時間合計 | 3時間10分21秒 | 15時間15分27秒 |
処理時間平均 | 95.175 sec | 457.725 sec |
圧縮後の合計ファイルサイズ | 約 9.7 GB |
結論
今回は、AWS EC2のsmallインスタンスで比較検証を行った結果、表3に示す結果が得られました。 処理時間自体は全体的にかかってしまっていますが、import:prepareとbulk_import:prepare_partsを比較してみると、処理時間を約5分の1短縮できていることが分かります。 このように性能向上を果たすためにどのような工夫をしているのかは、Githubでチェックしてみましょう。
皆様もご自身の環境で検証して頂き、処理速度が向上したことを体験して頂ければと思います。 以上、import:prepareの紹介を終わります。