検索
連載

Hadoopの現実解「バッチ処理」の常識をAsakusaで体得ビッグデータ処理の常識をJavaで身につける(7)(3/4 ページ)

Hadoopをはじめ、Java言語を使って構築されることが多い「ビッグデータ」処理のためのフレームワーク/ライブラリを紹介しながら、大量データを活用するための技術の常識を身に付けていく連載

PC用表示 関連情報
Share
Tweet
LINE
Hatena

8ステップで行うAsakusaFWを使ったバッチの実装

 今回作る簡単なバッチ処理は、WindGateを使用して、CSV形式のファイルを入出力とします。

例題:2つのCSVファイル(商品マスタ、売上明細)を使用して、商品別販売数量を算出してみましょう
例題:2つのCSVファイル(商品マスタ、売上明細)を使用して、商品別販売数量を算出してみましょう

 こんな簡単な例なら、「SQLで集計してしまえばすぐできるじゃないか」と思われたかたも多いと思います。実は、AsakusaFWは、そう思われた方に向いています。AsakusaFWでは、このようなテーブルの結合や集計処理は、DDLのViewや、DMDLの結合モデルや集計モデルで定義できてしまいます。

 今回は、下記のフローで示すように、まず「商品マスタ」「売上明細」の結合モデルを作成して、その結合モデルを集計するバッチを作成してみます。

 下記の手順で実装していきます。

  1. 入力データモデルの定義
  2. 結合モデルの定義
  3. MasterJoin演算子を使用したOperator DSLの記述
  4. 単純集計モデルの定義
  5. Summarize演算子を使用したOperator DSLの記述■
  6. Expoerter/Importerの記述
  7. ジョブフローの記述
  8. バッチの記述

【1】入力データモデルの定義

 プロジェクトの「src/main/dmdl」の下に、任意の名称で拡張子を「.dmdl」としたファイルを作成して、「商品マスタ」と「売上明細」をDMDLで定義します。下記の例では、定義ファイルの名前を「models.dmdl」としています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

models.dmdl
項目名 説明 データ型
sales_detail_id 売上明細ID LONG
amount_total 販売数量 LONG
item_id 商品ID LONG
item_name 商品名 TEXT

 DMDLでは、定義済みのデータモデルを組み合わせて新しいモデルを作成できます。結合モデルは、下記のように定義します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

  • 2行目:joined 新しいモデル=既存のモデル1+既存のモデル2
  • 3〜6行目:売上伝票から取り出したい項目を指定
  • 4行目:プロパティマッピング右辺が新しいモデルでの呼び名
  • 8〜10行目:商品マスタから取り出したい項目を指定
  • 7・11行目:結合キーを指定

 models.dmdlに上記の結合モデルを追記して、データモデルクラスを生成してみましょう。pom.xmlを右クリックして、[Run As]→[Maven generate-source]を実行してください。

 コンソールに「BUILD SUCCESS」と表示されたら、「target/generated-sources/modelgen」の下にデータモデルクラスや入出力ドライバが生成されています。先ほど定義したJoindSalesItemのデータモデルクラスが生成されているか確認してみましょう。

【3】マスタ結合演算子を使ったOperatorの記述

 マスタ結合演算子は、抽象メソッドとして宣言し、引数と戻り値にデータモデルを指定するだけでメソッド本体の実装は不要です。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

【4】単純集計モデルの定義

 【2】で作成した結合モデル「joined_sales_item」を基に商品ごとに販売数量を集計するモデルを定義してみましょう。

集約関数 性質
any グループ化した中のいずれか1つの値を利用(注1
sum グループ化した中の値の合計を利用(注2
max グループ化した中の最大値を利用
min グループ化した中の最小値を利用
count グループ化した中の個数を利用
表2

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 models.dmdlに上記の単純集計モデルを追記して、データモデルクラスを生成してみましょう。pom.xmlを右クリックして、[Run As]→[Maven generate-source]を実行してください。

【5】単純集計演算子を使ったOperatorの記述

 結合演算子を記述する際に作成したItemSalesSummaryOperatorクラスに単純集計演算子のメソッドを追加します。単純集計演算子も結合演算子と同様、抽象メソッドとして宣言し、引数と戻り値にデータモデルを指定するだけでメソッド本体の実装は不要です。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ここまでできたら、OperatorFactoryクラス及び、OperatorImplクラスを生成するために、もう一度、[Maven generate-source]を実行してください。コンソールに「BUILD SUCCESS」と表示されたら、「target/generated-sources/annotations」の下に「〜Factory」クラスと「〜Impl」クラスが生成されていることを確認してください。

【6】Expoerter/Importerの記述

 Importerは、ジョブの入力ファイルの定義、Exporterは、ジョブの出力ファイルの定義です。Exporter/Importerは、JobFlowのパッケージに記述します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

商品マスタのImporter

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

売上明細のImporter

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

商品ごとの販売数量のExporter

 さて、ここで1つ疑問になると思いますが、入出力ファイルは、いったいどこにあるのでしょうか?

 getPath()メソッドで、どこからかの相対パスを返すようになっていますが、親のディレクトリがどこにあるのか、分かりません。getPath()に絶対パスを記載しても動作はするのですが、開発環境と本番環境でデータの格納場所が異なったりすると面倒です。

 親ディレクトリは、WindGateの設定ファイル「$ASAKUSA_HOME/windgate/profile/asakusa.propertiesのresource.local.basePath」で指定できます。デフォルト値は、「/tmp/windgate-${USER}」になっているので、開発環境の場合は、cronにテストデータを削除されてしまわないように、「/tmp」「/var」以外に変更しておいた方が無難だと思います。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

$ASAKUSA_HOME/windgate/profile/asakusa.properties

 次ページでは、いよいよジョブフローの定義を行います。ビルドしてデプロイして実行してみましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る