パーティショニングを使ったjBatchのサンプルアプリケーションを作った

本記事では、先日のWebLogic Server勉強会で、デモに使用した、jBatchのサンプルアプリケーションを紹介します。

このアプリケーションでは、jBatchのパーティショニングを利用した並列処理を実装しており、ジョブの開始時に、パーティション数とスレッド数を指定することができます。

アプリケーションの概要

このアプリケーションは、テキストデータを形態素解析(単語に分割する処理)し、結果をデータベースに保存する処理をおこないます。
DBに格納された言語データは後々統計分析をかけるという想定で、その前処理に当たる、DBにデータを格納する部分をバッチジョブとして実装したという想定です。

分析対象のデータは、複数の日本語のテキストファイルです。
処理対象のテキストファイルのパスを特定するため、パスをリストしたインデックスを用意しておきます。バッチジョブは、インデックスを参照しながら、複数のテキストファイルに順次形態素解析をかけていきます。

f:id:charlier_shoe:20160229191107p:plain

このアプリケーションでは、jBatchのパーティショニングを利用した並列処理を実装しています。
インデックスを複数パーティションに分け、パーティション毎に、異なるスレッドで並列に処理を行うことができます。また、ジョブの開始時に、パーティション数とスレッド数を指定することができます。

ソースコード

本アプリケーションのソースコードは、GitHubに公開してあります。

アプリケーションの動かし方

ソースコードリポジトリ上のREADME.mdを参照下さい。

実際に動かしてみる

実際に動かしてみた結果を紹介します。

3パーティション、3スレッドでジョブを実行すると、標準出力に以下の様な内容が出力されます。 パーティション毎に別の番号を振っていますが、うまく3パーティションに分かれて処理が進んでいる事がわかります。

finished(parti tion: 0 | piece: "odazai/1047_ruby_20129_chikusei.txt")
finished(partition: 0 | piece: "odazai/1059_ruby_4748_hashiranu_meiba.txt")
finished(partition: 0 | piece: "odazai/1084_ruby_4753_nyozegamon.txt")
finished(partition: 0 | piece: "odazai/1093_ruby_20122_sakkano_techo.txt")
finished(partition: 1 | piece: "odazai/1573_ruby_4930_yukino_yono_hanashi.txt")
finished(partition: 0 | piece: "odazai/1095_ruby_20124_sange.txt")
finished(partition: 0 | piece: "odazai/1109_ruby_20131_tokyodayori.txt")
finished(partition: 0 | piece: "odazai/1562_ruby_14574_asa.txt")
finished(partition: 0 | piece: "odazai/1563_ruby_9706_gyofukuki.txt")
finished(partition: 0 | piece: "odazai/1564_ruby_14093_mangan.txt")
finished(partition: 1 | piece: "odazai/1574_ruby_15426_omoide.txt")
finished(partition: 2 | piece: "rakutagawa/109_ruby_1423_nidai.txt")
finished(partition: 2 | piece: "rakutagawa/110_ruby_1195_nikko_shohin.txt")
finished(partition: 2 | piece: "rakutagawa/111_ruby_1573_niwa.txt")
finished(partition: 1 | piece: "odazai/1575_ruby_24932_das_gemeine.txt")
finished(partition: 2 | piece: "rakutagawa/112_ruby_3165_noroma_ningyo.txt")
…

以下は、パーティション数、スレッド数を変えてジョブを実行しつつ、モニタリングダッシュボードでその様子を確認したものです。 待機スレッド数、アクティブスレッド数、CPU負荷の様子をグラフに表示しています。

f:id:charlier_shoe:20160229191139p:plain

指定されたスレッド数が増えるにしたがって、アクティブスレッド数も増えていることが分かります。
また、3パーティション/3スレッドまで上げると、CPUにきちんと負荷がかかって(CPUが利用されて)、処理時間が短くなっていることも確認できます。今回は1~1.5分で終わる程度の処理だったので、顕著な差ではありませんでしたが、もっと長時間のジョブではより意味のある効果が得られそうです。

ちなみに今回は、3コアのDockerホスト上で、DBとWebLogic Serverの2つのコンテナを稼働させています。そのためか、4パーティション/4スレッドにあげても、ほとんど性能向上はありませんでした。

以上、jBatchのサンプルアプリケーションの紹介でした。