1
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
AZAREA-Cluster 開発ガイド
Version 0.9.2
2
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
1 AZAREA-Clusterフレームワークとは ........................................................................................................................ 7
1.1 AZAREAとは? ...................................................................................................................................................... 7
1.2 背景 .......................................................................................................................................................................... 7
1.3 用途と特徴 .............................................................................................................................................................. 7
1.4 実行環境 .................................................................................................................................................................. 9
1.5 開発環境 ................................................................................................................................................................ 11
2 AZAREA-Clusterにおける概念.................................................................................................................................. 12
2.1 Hadoop ................................................................................................................................................................... 12
2.1.1 HDFS .............................................................................................................................................................. 12
2.1.2 MapReduce ..................................................................................................................................................... 12
2.2 エンティティ ......................................................................................................................................................... 12
2.3 処理 ........................................................................................................................................................................ 14
2.4 エンティティフロー ............................................................................................................................................. 14
2.5 アプリケーション ................................................................................................................................................. 14
3 開発環境の構築 ............................................................................................................................................................ 16
3.1 事前準備 ................................................................................................................................................................ 16
3.2 AZAREA-Clusterプラグインのインストール .................................................................................................... 16
3.3 フレームワークプロジェクトのインポート ........................................................................................................ 17
3.4 AZAREA-Clusterのバージョンの確認方法 ........................................................................................................ 17
3.4.1 AZAREA-Clusterフレームワークのバージョンの確認方法 ....................................................................... 17
3.4.2 AZAREA-Clusterプラグインのバージョンの確認方法 .............................................................................. 17
4 簡単なアプリケーションの開発 .................................................................................................................................. 18
4.1 概要 ........................................................................................................................................................................ 18
4.2 プロジェクトの作成 ............................................................................................................................................. 18
5 エンティティクラス .................................................................................................................................................... 30
5.1 概要 ........................................................................................................................................................................ 30
5.2 エンティティクラスの構成 .................................................................................................................................. 30
5.3 エンティティクラスとファイル ........................................................................................................................... 30
5.3.1 エンティティファイルの場所 ........................................................................................................................ 30
5.3.2 エンティティファイル名 ............................................................................................................................... 31
5.3.3 エンティティファイルのフォーマット ......................................................................................................... 31
5.3.4 値のフォーマット .......................................................................................................................................... 32
5.4 スキーマの定義 ..................................................................................................................................................... 33
5.4.1 Excelファイルによるスキーマの定義 .......................................................................................................... 33
5.4.2 XMLファイルによるスキーマの定義 ........................................................................................................... 35
5.5 エンティティクラスの生成 .................................................................................................................................. 36
5.5.1 スキーマ定義ファイルからの生成 ................................................................................................................ 36
5.5.2 エンティティフロー編集画面での編集 ......................................................................................................... 36
5.6 エンティティクラスのAPI仕様 .......................................................................................................................... 40
5.7 エンティティファイルのフォーマットのカスタマイズ ..................................................................................... 40
5.7.1 概要 ................................................................................................................................................................. 40
5.7.2 EntityFormatクラス ..................................................................................................................................... 40
5.7.3 EntityManagerクラス .................................................................................................................................. 43
3
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
5.7.4 EntityManagerの呼び出しタイミング ........................................................................................................ 44
5.7.5 サンプル ......................................................................................................................................................... 45
6 エンティティフロークラス ......................................................................................................................................... 46
6.1 概要 ........................................................................................................................................................................ 46
6.2 エンティティフロークラスの構成 ....................................................................................................................... 46
6.3 新規エンティティフロークラスの作成 ............................................................................................................... 47
6.4 エンティティフロークラスの編集 ....................................................................................................................... 47
6.4.1 概要 ................................................................................................................................................................. 47
6.4.2 エンティティクラスの選択 ........................................................................................................................... 48
6.4.3 エンティティファイルや処理の編集 ............................................................................................................ 49
6.4.4 エンティティファイルや処理の詳細 ............................................................................................................ 51
6.4.5 エンティティフローの編集の終了 ................................................................................................................ 77
6.4.6 その他の機能 .................................................................................................................................................. 78
6.5 処理の分散 ............................................................................................................................................................ 81
6.6 処理内容の実装 ..................................................................................................................................................... 82
6.6.1 エンティティの操作 ....................................................................................................................................... 82
6.6.2 エンティティファイルの直接アクセス ......................................................................................................... 84
6.6.3 処理クラスのインスタンス変数 .................................................................................................................... 86
6.6.4 アプリケーションコンテキスト .................................................................................................................... 88
6.7 パフォーマンスに関する考慮 .............................................................................................................................. 90
6.7.1 早目にファイルサイズを小さくする ............................................................................................................ 90
6.7.2 余計なファイルを出力しない ........................................................................................................................ 92
6.7.3 結合方式 ......................................................................................................................................................... 92
6.7.4 エンティティファイルの直接アクセス ......................................................................................................... 92
6.7.5 グループ化処理 .............................................................................................................................................. 95
6.8 テスト .................................................................................................................................................................... 95
6.9 Hadoop上での実行 ............................................................................................................................................... 95
7 アプリケーションクラス ............................................................................................................................................. 96
7.1 概要 ........................................................................................................................................................................ 96
7.2 アプリケーションクラスの構成 ........................................................................................................................... 96
7.3 新規アプリケーションクラスの作成 ................................................................................................................... 97
7.4 アプリケーションの編集 ...................................................................................................................................... 97
7.5 アプリケーション引数 ........................................................................................................................................ 100
7.6 エンティティファイルのフォーマットのカスタマイズ ................................................................................... 101
7.7 アプリケーションコンテキストの初期化 .......................................................................................................... 101
7.8 テスト .................................................................................................................................................................. 101
7.9 Hadoop上での実行 ............................................................................................................................................. 101
8 データベース連携とオンライン連携 ........................................................................................................................ 102
8.1 データベース連携の概要 .................................................................................................................................... 102
8.2 オンライン連携の概要 ........................................................................................................................................ 103
8.3 データベースからのエンティティクラスの生成 .............................................................................................. 103
8.3.1 概要 ............................................................................................................................................................... 103
8.3.2 設定ファイルの準備 ..................................................................................................................................... 104
8.3.3 データベースからのエンティティクラスの生成方法 ................................................................................ 106
4
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
8.3.4 データベースの列の型とエンティティの列の型とのマッピング ............................................................. 107
8.3.5 データベースとエンティティとの値の変換 ............................................................................................... 108
8.4 データベーステキスト変換ツール ..................................................................................................................... 109
8.5 データベースの直接参照 .................................................................................................................................... 109
8.5.1 概要 ............................................................................................................................................................... 109
8.5.2 ビルド・パスの設定 ..................................................................................................................................... 110
8.5.3 データベースとエンティティとのマッピングの定義 ................................................................................ 110
8.5.4 データベースが参照されるタイミング ....................................................................................................... 112
8.5.5 パラメータ付 SQL ....................................................................................................................................... 112
8.5.6 JARファイルの作成..................................................................................................................................... 114
8.6 オンライン連携 ................................................................................................................................................... 114
8.6.1 概要 ............................................................................................................................................................... 114
8.6.2 ビルド・パスの設定 ..................................................................................................................................... 114
8.6.3 メモリ経由でエンティティを受け渡す場合 ............................................................................................... 114
8.6.4 データベース経由でエンティティを受け渡す場合 .................................................................................... 116
8.6.5 メモリとデータベースの両方を経由してエンティティを受け渡す場合 .................................................. 117
8.6.6 Spring Frameworkの使用 .......................................................................................................................... 118
8.6.7 JARファイルの作成..................................................................................................................................... 120
9 エンティティフローやアプリケーションのテスト .................................................................................................. 121
9.1 概要 ...................................................................................................................................................................... 121
9.2 テストデータの準備 ........................................................................................................................................... 121
9.3 テストクラスの作成 ........................................................................................................................................... 122
9.3.1 エンティティフローのテストクラスの作成 ............................................................................................... 122
9.3.2 アプリケーションのテストクラスの作成 ................................................................................................... 123
9.3.3 アプリケーションコンテキストの設定 ....................................................................................................... 124
9.4 テストの実行 ....................................................................................................................................................... 124
9.5 実行結果の検証 ................................................................................................................................................... 125
10 エンティティフローやアプリケーションの実行 ................................................................................................... 127
10.1 概要 .................................................................................................................................................................... 127
10.2 JARファイルの作成 ......................................................................................................................................... 127
10.2.1 JARファイルの作成方法 ........................................................................................................................... 127
10.2.2 汎用エントリの JARファイル .................................................................................................................. 128
10.3 Hadoopコマンドでの実行 ................................................................................................................................ 129
10.3.1 Hadoopコマンドでの実行方法 ................................................................................................................. 129
10.3.2 コンソール出力の見方 ............................................................................................................................... 130
10.3.3 カウンタの見方 .......................................................................................................................................... 131
10.4 Oozieによる実行 ............................................................................................................................................... 132
10.4.1 概要 ............................................................................................................................................................. 132
10.4.2 Oozieの準備 ............................................................................................................................................... 132
10.4.3 Oozieでの実行 ............................................................................................................................................ 133
10.5 スタンドアローンな Java VM上での実行 ..................................................................................................... 135
10.5.1 概要 ............................................................................................................................................................. 135
10.5.2 起動用 JARの準備 .................................................................................................................................... 135
10.5.3 Javaコマンドでの実行 .............................................................................................................................. 135
5
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
11 プラグインの設定 .................................................................................................................................................... 137
11.1 インデント ......................................................................................................................................................... 137
11.2 ファイルヘッダ ................................................................................................................................................. 137
11.3 デフォルトパッケージ ...................................................................................................................................... 137
11.4 DBの数値型を int型に変換する桁数 .............................................................................................................. 137
11.5 javacコマンド ................................................................................................................................................... 137
12 サンプル ................................................................................................................................................................... 139
12.1 概要 .................................................................................................................................................................... 139
12.2 WordCountのサンプル .................................................................................................................................... 139
12.3 Groupのサンプル ............................................................................................................................................. 142
12.4 GroupSortのサンプル ...................................................................................................................................... 145
12.5 UniqueJoinとGroupのサンプル ................................................................................................................... 147
12.6 EntityFlowの分割のサンプル ......................................................................................................................... 150
12.7 Conversionと openOutput、getEntityCollectionのサンプル ..................................................................... 153
12.8 Sortのサンプル ................................................................................................................................................. 156
12.9 Join、UnionとApplicationContextのサンプル ........................................................................................... 157
12.10 データベース連携のサンプル(1) .................................................................................................................... 162
12.11 データベース連携のサンプル(2) .................................................................................................................... 167
13 トラブルシューティング ......................................................................................................................................... 172
13.1 Hadoopのエラー ............................................................................................................................................... 172
13.2 スタンドアローン実行時のエラー ................................................................................................................... 172
13.3 Oozieのエラー .................................................................................................................................................. 172
変更履歴 ......................................................................................................................................................................... 173
6
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
AZAREA-Cluster開発ガイド
本書の著作権は株式会社シーエーシーが保有します。
「AZAREA」は株式会社シーエーシーの登録商標です。
本書に記載されている会社名または製品名は各社の商標または登録商標です。
1 AZAREA-Cluster フレームワークとは
7
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
1 AZAREA-Cluster フレームワークとは
1.1 AZAREA とは?
AZAREAとは、「A-to-Z Answer for Reliable Enterprise Architecture」の頭文字を取ったものであり、「ア
ザレア」と読みます。
CACは、40年以上に渡り企業向けシステム開発の実績を積んできました。そのノウハウやベストプラクティ
スをソリューション化したものが「AZAREA」です。
AZAREA には、Web システム開発ソリューションや、RIA 開発ソリューションなど、幾つかのソリューシ
ョンが含まれます。そのうちの一つが、分散バッチ開発ソリューションである「AZAREA-Cluster」です。
1.2 背景
システムが扱うべきデータ量は、年々増加しています。マシンの性能も向上していますが、それを上回る速
度でデータ量が増加しています。そのため、単一のマシンで処理するのではなく、複数のマシンで分散して処
理する手法の必要性が高まってきました。
このようなときに登場したのがHadoopです。Hadoopは、Javaで書かれたオープンソースの分散処理基盤
です。Yahoo、Facebook、Twitterなど有力な IT企業で採用されたこともあり、分散処理基盤のデファクトス
タンダードとなりつつあります。
しかし、Hadoop の API は非常に低レベルなため、Hadoop 用のアプリケーションを開発するのは簡単では
ありません。特に、基幹業務システムのような複雑なアプリケーションを開発するのは非常に困難です。そこ
で、Hadoop 用のアプリケーションを容易に開発するためのアプリケーションフレームワークとして、
AZAREA-Clusterフレームワークを作成しました。
1.3 用途と特徴
(1) 概要
AZAREA-Clusterフレームワークは、Hadoop用のアプリケーションフレームワークであり、大量データ
のバッチ処理に適しています。フレームワークは、本物のHadoop無しでも開発マシン上でテストできるよ
うシミュレータを内蔵しています。また、フレームワークの他に、開発を効率化するための Eclipse プラグ
インも用意しています。
1 AZAREA-Cluster フレームワークとは
8
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) 処理時間
処理時間は、処理データ量やマシン数によります。しかし、Hadoop はオーバーヘッドが大きいため、最
短でも数十秒は掛かります。従って、オンラインアプリケーションには適さず、バッチアプリケーションと
しての利用が推奨されます。
(3) 処理データ
処理可能なデータの形式は、テキストファイルです。タブ区切りファイル、カンマ区切りファイルや固定
長区切りファイルのような構造化されたテキストファイルに加えて、ログファイルのような非構造化テキス
トファイルにも対応しています1。
テキストファイル以外のデータを処理する場合は、処理前にテキストファイルに変換したり、処理後にテ
キストファイルから変換したりする必要があります2。
(4) 処理内容
AZAREA-Clusterフレームワークによるアプリケーションは、データフローとして表現されます。すなわ
ち、入力データに対し、処理を行い、データを出力し、そのデータに対し更に処理を行い…、ということを
繰り返して、最終的な出力データを得ます。
処理の種類としては、以下のようなものが可能です。
変換(あるデータを別のデータに変換する)
結合(あるデータと別のデータを指定したキーで結合する)
グループ化(データを指定したキーでグループ化し、集計する)
ソート(データを指定したキーでソートする)
1 但し、非構造化テキストを解析して構造化するためのクラスを実装する必要があります。 2 RDBとテキストファイルを変換するためのツールは用意されています。
Java VM
Hadoop
Eclipse
アプリケーション AZAREA-Cluster
プラグイン
実行環境 開発環境
AZAREA-Clusterフレームワーク
開発支援
シミュレータ
1 AZAREA-Cluster フレームワークとは
9
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(5) 開発方法
AZAREA-Clusterフレームワークは Java言語で書かれており、アプリケーションも Java言語で開発し
ます。データや処理はクラスとして実現され、それらを組み合わせることによりデータフローを表現します。
また、開発支援ツールを用意しており、GUIでデータフロー図を作成することにより、対応するソースコ
ードを生成することができます。逆に、ソースコードをデータフロー図として表示し、それを編集すること
もできます。但し、データフローより細かいレベルのロジックについては、テキストエディタでコーディン
グする必要があります。開発支援ツールはWindows環境およびUbuntu Linux環境のEclipseに対応して
います。
AZAREA-Clusterフレームワークはアプリケーション実行シミュレータを備えており、実際のHadoop環
境が無くても、スタンドアローンな Java VM上で実行することができます3。また、Eclipse 上で実行やデ
バッグを行うこともできます。
1.4 実行環境
(1) 概要
AZAREA-Cluster フレームワークは、Hadoop 上で動作します。そして、アプリケーションは
AZAREA-Clusterフレームワーク上で動作します。Hadoopは、基本的に複数の Linuxマシン上で動作しま
す。
(2) Hadoop のバージョン
AZAREA-Clusterフレームワークは、以下のディストリビューションで動作確認済みです。
Hadoop ディストリビューション バージョン
1.0系4 EMC Greenplum MR 2.0
2.1
Cloudera's Distribution, Including Apache Hadoop (CDH) 3u4
3u5
Amazon Elastic MapReduce Hadoop 1.0.3
MapR v1.2.8
3 パフォーマンスはHadoopに劣りますが、ある程度大きなデータでも処理できます。 4 0.20.20xも 1.0系に含みます。
Linuxマシン
Hadoop
AZAREA-Cluster
フレームワーク
アプリケーション
Linuxマシン
Hadoop
AZAREA-Cluster
フレームワーク
アプリケーション
Linuxマシン
Hadoop
AZAREA-Cluster
フレームワーク
アプリケーション
1 AZAREA-Cluster フレームワークとは
10
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
2.0系 Cloudera's Distribution, Including Apache Hadoop (CDH) 4.1.1
4.1.2
但し、2.0系ではMapReduce v1のみに対応しており、MapReduce v2(YARN)には対応していません5。
(3) JAR 構成
AZAREA-Clusterフレームワークは JARファイルとして提供され、開発時にはこれを利用します。実行
時には、この JAR ファイルとアプリケーションのクラスを 1 つの JAR ファイルにまとめます。これは、
Hadoop上での実行を簡潔にするためです。
なお、フレームワークの JARファイルとアプリケーションのクラスを 1つの JARファイルにまとめるた
めのツールがEclipseプラグインとして用意されています。詳細は「10.2 JARファイルの作成」をご参照く
ださい。
(4) マシン環境
マシン環境は、基本的には複数台のLinuxマシンです。詳細は、実際に利用するバージョンのHadoopの
ドキュメントをご参照ください。なお、オンプレミス環境だけでなく、クラウドサービスであるAmazon Web
Services上での動作も検証されています6。
(5) Oozie
Oozie は、Hadoop 用のワークフローシステムです。ワークフローの要素として Hadoop アプリケーショ
ンを実行することができます。
AZAREA-Clusterフレームワークは、Oozie上での実行も可能です。
5 Cloudera社から提供されているデモVMイメージ(Cloudera's Hadoop Demo VM for CDH4)を利用する場合は、MapReduce
v2から v1に変更する必要があります。以下を実行後、再起動してください。
sudo yum remove hadoop-conf-pseudo sudo yum install hadoop-0.20-conf-pseudo
6 EC2上にHadoopクラスタを構築して検証しました。Elastic MapReduceでの動作は検証中です。
xxx.jar
AZAREA-Clusterフレームワーク
【開発時】 【実行時】
アプリケーション
クラス
クラス
クラス
クラス
クラス
クラス
AZAREA-Clusterフレームワーク
+アプリケーション azarea-cluster.jar
azarea-cluster.jar
1 AZAREA-Cluster フレームワークとは
11
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
1.5 開発環境
開発環境としては、EclipseにAZAREA-Cluster開発支援ツールをプラグインして使用します。OSは現在の
ところWindowsおよびUbuntu Linuxに対応しています。
アプリケーションからの参照ライブラリとして、AZAREA-Clusterフレームワークと、Hadooopライブラリ
の一部を利用します。
開発支援ツールの機能の中には、Excelファイルからクラスを自動生成するものがあります。但し、XMLフ
ァイルから自動生成することも可能ですので、Excelは必須ではありません。Linux環境の場合は、LibreOffice
Calcで代替することができます。
OS/ソフトウェア バージョン 備考
Windows環境
Windows Eclipseが動作するバージョン 日本語環境のみ対応
Cygwin 1.7以降 Windows環境でHadoop 2.0を利
用する場合に必要
Microsoft Excel 97以降 クラス自動生成用(オプション)
Linux環境
Ubuntu Linux Eclipseが動作するバージョン 日本語環境のみ対応
LibreOffice Calc 3以降 クラス自動生成用(オプション)
共通
Java Oracle JDK 6 Update 31以降7
Eclipse 3.6以降
AZAREA-Cluster
開発支援ツール
- Eclipseプラグイン
AZAREA-Cluster
フレームワーク8
Hadoop 1.0系用または
Hadoop 2.0系用
Jarファイル
Hadoopライブラリ 1.0系または 2.0系 Jarファイル
7 Oracle JDK 6 Update 31は、CDH4で推奨されているバージョンです。 8 Hadoop 1.0系用と2.0系用とでAZAREA-Clusterフレームワークのバイナリは異なるのでご注意ください。AZAREA-Cluster
フレームワーク上のアプリケーションは同じで構いません。
2 AZAREA-Cluster における概念
12
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
2 AZAREA-Cluster における概念
2.1 Hadoop
本章では、Hadoopをごく簡単に説明します。より詳細な説明については、インターネット上のサイトや書籍
等をご参照ください。
Hadoopは、オープンソースの分散処理基盤であり、多数のマシンで大量のデータを効率よく処理することが
できます。ファイルを管理するHDFSと、分散処理を行うMapReduceの、2つのモジュールから成ります。
2.1.1 HDFS
HDFSは、「Hadoop Distributed File System」の頭文字です。
HDFS では、ファイルを分割し、複数のマシンで分散して保持します。こうすることにより、大量のファイ
ルを効率よくアクセスできます。但し、一旦保存したファイルの更新ができないという制約があります。
2.1.2 MapReduce
MapReduceは、分散処理フレームワークです。MapとReduceの 2段階により、HDFSに保存されている9
大量のデータを処理します。
Mapでは、HDFS上のファイルからデータを読み込み、必要に応じて変換を行った後、分類します。
Reduceでは、分類されたデータを集計し、結果をHDFSに書き込みます。
なお、MapからReduceまでの一連の処理を「MapReduceジョブ」と呼びます。あるMapReduceジョブの
結果を別のMapReduceジョブに入力することにより、より複雑な処理を行うことも可能です。
2.2 エンティティ
エンティティとは、データベースにおけるレコードのような概念です。すなわち、1つ以上の列を持つ 1件分
のデータです。
エンティティファイルは、データベースにおけるテーブルのようなもので、複数のエンティティを格納するこ
とができます。エンティティファイルは、タブ区切りやカンマ区切りなどのテキストファイルです。
9 実際にはHDFS以外に保存されているデータも処理可能ですが、AZAREA-Clusterでは未対応です。
Map
Map
Map
Reduce
Reduce
Reduce
HDFS
2 AZAREA-Cluster における概念
13
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
エンティティ数が非常に多い場合など、複数のファイルに分割して格納することができます。エンティティ名
を付けたフォルダー直下に複数のファイルを格納すると、仮想的な 1 つのエンティティファイルとみなされま
す。
スキーマとは、あるエンティティがどのような列から構成されるかの定義です。エンティティの列は、プロパ
ティ名や型などから定義されます(詳細は「5.4 スキーマの定義」を参照してください)。AZAREA-Clusterで
は、以下の型に対応しています。
型 説明
String 文字列
int 32ビット整数値
long 64ビット整数値
BigDecimal 固定小数点数
double 倍精度浮動小数点数
Date 日時(ミリ秒まで保持可能)
エンティティ 他のスキーマのエンティティを入れ子にすることができる
配列 同じ型の要素から成る固定長配列
リスト 同じ型の要素から成る可変長リスト
BumonEntity.txt
TantoEntity.txt
(フォルダー)
000.txt
001.txt
002.txt
エンティティファイル
仮想的なエンティティファイル
エンティティファイル
担当者コード 担当者名 部門コード
10001 ○○ 一郎 201
10002 △△ 花子 210
… … …
10099 □□ 三郎 201
エンティティ
2 AZAREA-Cluster における概念
14
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
1つのエンティティファイルは、同じスキーマのエンティティのみから成る必要があります。また、通常は 1
つのスキーマに対して 1つのエンティティクラスが定義されます。
2.3 処理
AZAREA-Cluster フレームワークでは、入力されたエンティティを処理して出力するためのクラスを用意し
ています。処理の種類は、下表の通りです。
処理 説明
変換 あるエンティティを別のエンティティに変換して出力します。
出力するエンティティの個数は任意です。
結合 あるエンティティと別のエンティティを特定のキーで結合し、必要に応じて
変換してから出力します。
出力するエンティティの個数は任意です。
一意結合 結合の一種ですが、結合対象が 1件以下に限定される場合に利用します。
実装がやや簡潔になります。
グループ化 エンティティを特定のキーでグループ化し、集計して出力します。
ソート エンティティを特定のキーでソートし、必要に応じて変換してから出力しま
す。
出力するエンティティの個数は任意です。
グループ化ソート エンティティをグループ化した後、グループ内でソートし、必要に応じて変
換してから出力します。いわゆるキーブレイク処理を行うことができます。
出力するエンティティの個数は任意です。
2.4 エンティティフロー
ある処理から出力されたエンティティは、別の処理に入力することができます。このようなエンティティと処
理の流れを、エンティティフローと呼びます。エンティティフローにより、処理を組み合わせてより複雑な処理
を実現することができます。
2.5 アプリケーション
AZAREA-Cluster によるアプリケーションは、エンティティフローのリストから成ります。単純なアプリケ
ーションの場合は、1つのエンティティフローがそのままアプリケーションとなります。複雑なアプリケーショ
ンの場合は、複数のエンティティフローを組み合わせてアプリケーションを構成するのがよいでしょう。
アプリケーションは、AZAREA-Cluster フレームワークの実行計画エンジンにより再構成・最適化され、
MapReduceジョブに変換されます。アプリケーションがいくつのMapReduceジョブに変換されるかは、処理
の内容によります。
エンティティフロー
グループ化
エンティティ
エンティティ エンティティ エンティティ 結合
2 AZAREA-Cluster における概念
15
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
Hadoop
アプリケーション
エンティティフロー エンティティフロー
グループ
化
結合 エンテ
ィティ 変換 エンテ
ィティ
エンテ
ィティ
エンテ
ィティ
エンテ
ィティ
MapReduceジョブ1 MapReduceジョブ2
実行計画エンジン
3 開発環境の構築
16
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
3 開発環境の構築
3.1 事前準備
(1) Eclipse のインストール
Eclipse IDE for Java DevelopersまたはEclipse IDE for Java EE Developersをインストールしてくださ
い。バージョンについては、「1.5開発環境」をご確認ください。
(2) Cygwin のインストール
Cygwinは、Windows環境でHadoop 2.0系のライブラリを利用する場合に必要となります。
まず、Cygwinをデフォルトのパッケージ構成でインストールしてください。
インストール後、Cygwinの binフォルダーにパスを通してください。
3.2 AZAREA-Cluster プラグインのインストール
azarea-cluster-trial-X.X.X.zipを解凍すると、以下のようになります。
azarea-cluster-framework
hadoop2
azarea-cluster-sample
src
dropins
…
hadoop1
*.jar
*.jar
jp.co.cac.azarea.cluster.plugin_X.X.X.jar
*.java
(プラグイン)
(サンプル)
(フレームワーク)
LICENSE.txt (利用条件)
ExpiryDate.txt (評価版有効期限)
AZAREA-Cluster-DevelopmentGuide-jp.pdf (本書)
oozie (Oozie用サンプル)
tool (ツール)
db (データベース関連)
3 開発環境の構築
17
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
dropins フォルダー下に解凍された jp.co.cac.azarea.cluster.plugin_X.X.X.jar を、Eclipse の
dropinsフォルダー下にコピーしてください。古いバージョンの JARファイルがある場合は、削除してくださ
い。
3.3 フレームワークプロジェクトのインポート
Eclipseの「ファイル」メニューから「インポート」を選んでください。ダイアログで「既存プロジェクトを
ワークスペースへ」を選び、上で解凍した「azarea-cluster-framework」をインポートしてください。
3.4 AZAREA-Cluster のバージョンの確認方法
3.4.1 AZAREA-Cluster フレームワークのバージョンの確認方法
azarea-cluster.jarファイル内のMETA-INF/MANIFEST.MFファイルにバージョン番号が記載されています。
3.4.2 AZAREA-Cluster プラグインのバージョンの確認方法
Eclipseのメニューから、「ヘルプ」→「Eclipseについて」を選択します。そして、「Eclipseについて」ダイ
アログで「インストール詳細」ボタンを押下します。「Eclipseインストール詳細」ダイアログで「プラグイン」
タブを表示することにより、AZAREA-Clusterプラグインのバージョンを確認することができます。
4 簡単なアプリケーションの開発
18
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
4 簡単なアプリケーションの開発
4.1 概要
本章では、非常に簡単なアプリケーションを例に、AZAREA-Clusterによる開発方法を説明します。
アプリケーションの仕様は、「売上データを顧客ごとに集計する」というものです。売上データの形式は以下
の通りです。
売上データ( SalesEntity )
項目名 Javaプロパティ名 型
顧客コード customerCode 文字列
売上金額 amount 数値
4.2 プロジェクトの作成
(1) プロジェクトの作成
新規 Javaプロジェクトを作成してください。名前は任意でよいです。
(2) ビルド・パスの設定
プロジェクトのプロパティを開き、「Javaのビルド・パス」の「ライブラリ」タブを開いてください。そ
し て 「 Jar 追 加 」 ボ タ ン を 押 下 し 、「 azarea-cluster-framework/hadoop1 」 10 ま た は
「azarea-cluster-framework/hadoop2」11下の全ての JARファイルを追加してください。両方を追加す
ると正しく動作しませんので、ご注意ください。
(3) パッケージの用意
パッケージ「tutorial」を作成し、その下に「entity」パッケージと「flow」パッケージを作成してく
ださい。
10 Hadoop 1.0系を利用する場合です。 11 Hadoop 2.0系を利用する場合です。
4 簡単なアプリケーションの開発
19
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(4) 空のエンティティフロークラスの作成
パッケージエクスプローラで「tutorial.flow」パッケージを選択し、ツールバーのアイコン をクリ
ックしてください。ダイアログが表示されるので、クラス名に「TutorialFlow」と入力して「OK」を押し
てください。
すると、空の TutorialFlowクラスが作成され、同時にエンティティフロー編集画面が開きます。
エンティティフロー編集画面は、エンティティフロークラスを選択してアイコン をクリックすること
4 簡単なアプリケーションの開発
20
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
により開くこともできます。
(5) エンティティクラスの作成
まず、エンティティクラスを作成するパッケージを設定します。「パッケージ選択」ボタンを押下するとダ
イアログが表示されるので、「tutorial.entity」パッケージを選択してください。
追加ボタンを押すと、「エンティティクラスの追加」ダイアログが開きます。そこで、下図のように入力し
て「更新」ボタンを押してください。右側の「+」ボタンを押すことにより、新しい行を追加することがで
きます。
4 簡単なアプリケーションの開発
21
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
エンティティクラスは、Excelファイルから生成することもできます。
(6) エンティティフローの編集
リストボックスで SalesEntity が選択された状態で、「getInput」を右側にドラッグ&ドロップしてく
ださい。これは、入力となるエンティティを表します。
4 簡単なアプリケーションの開発
22
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
同様に、「Group」と「setOutput」もドラッグ&ドロップしてください。これらは、それぞれグループ化
処理とエンティティの出力処理を表します。
「input1:getInput」の「➘」アイコンをドラッグし、「group1:Group」にドロップしてください。する
4 簡単なアプリケーションの開発
23
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
と、それらが矢印でつながります。同様に、「group1:Group」の「➘」アイコンをドラッグし、「setOutput」
にドロップしてください。こうすることにより、「入力した SalesEntityをグループ化し、出力する」とい
うエンティティフローが定義されます。
グループ化キーを設定する必要があるので、「group1:Group」の「✎」アイコンをクリックしてください。
「customerCode」を選択して「>」ボタンを押すと、グループ化キーに設定されます。「OK」を押して設
定を終了します。
4 簡単なアプリケーションの開発
24
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
また、「setOutput」の「✎」アイコンをクリックし、ファイル名に「Result.txt」を入力してください。
これは、処理結果の出力ファイル名を表します。
4 簡単なアプリケーションの開発
25
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
最後に「更新」ボタンを押してください。TutorialFlow クラスのソースが生成され、エンティティフロ
ー編集画面が閉じます。
package tutorial.flow;
import jp.co.cac.azarea.cluster.Main;
import jp.co.cac.azarea.cluster.planner.job.EntityFlow;
import jp.co.cac.azarea.cluster.planner.job.SimpleEntityFlowManager;
import jp.co.cac.azarea.cluster.planner.operation.EntityFile;
import jp.co.cac.azarea.cluster.planner.operation.Group;
import jp.co.cac.azarea.cluster.util.Diagram;
import jp.co.cac.azarea.cluster.util.Generated;
import tutorial.entity.SalesEntity;
@Generated("AZAREA-Cluster 1.0")
public class TutorialFlow extends EntityFlow {
@Override
protected void initialize() {
@Diagram(x = 149, y = 36)
EntityFile<SalesEntity> input1 = getInput("input1", SalesEntity.class);
@Diagram(x = 150, y = 176, outputX = 149, outputY = 318)
Group<SalesEntity> group1 =
4 簡単なアプリケーションの開発
26
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
new Group<SalesEntity>("group1", input1, "customerCode") {
@Override
protected void doSummarize(SalesEntity summary, SalesEntity another) {
// TODO
}
};
setOutput(group1, "Result.txt");
}
...
}
(7) 処理の実装
ここまでで、「SalesEntityを customerCodeでグループ化し、集計して出力する」というエンティティ
フローができました。「どのように集計するか」については、テキストエディタで実装する必要があります。
doSummarizeメソッド中の「// TODO」部分を実装し、以下のようにしてください。
Group<SalesEntity> group1 =
new Group<SalesEntity>("group1", input1, "customerCode") {
@Override
protected void doSummarize(SalesEntity summary, SalesEntity another) {
summary.amount = summary.amount.add(another.amount);
}
};
入力エンティティは customerCode 毎にグループ化され、引数 another として渡されます。また、引数
summaryは customerCode毎の集計結果を表します。メソッド中では、引数 anotherの amountの値を引数
summaryに加えていきます。
これで、エンティティフロークラスは完成です。
より複雑な処理を実現したい場合は、複数のエンティティフローを組み合わせてアプリケーションを作成
することも可能です。
(8) テスト
エンティティフローをテストするためのクラスも、簡単に作成することができます。
まず準備として、テストデータを作成します。「tutorial」フォルダー下に「data」フォルダーを作成し、
「SalesEntity.txt」ファイルを作成してください。
4 簡単なアプリケーションの開発
27
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
#顧客コード 売上金額
C1 1000
C2 1500
C3 2000
C2 800
C1 700
区切り文字はタブとしてください。「C1<TAB>1000」のように入力します。なお、Excelファイルでテスト
データを作成することも可能です。
パッケージ・エクスプローラで「TutorialFlow.java」を右クリックし、メニューより「AZAREA-Cluster」
→「テストクラスを作成」を選んでください。ダイアログが表示されるので、以下のように入力してくださ
い。
また、「フォルダー参照」ボタンを押下し、フォルダー選択ダイアログで「data」フォルダーを選択して
「OK」を押してください。
4 簡単なアプリケーションの開発
28
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
「エンティティフローのテストクラスを作成」ダイアログに戻って「OK」を押すと、以下のようなクラ
スが生成されます。
package tutorial.flow;
import java.io.IOException;
import jp.co.cac.azarea.cluster.planner.job.SimpleEntityFlowManager;
import jp.co.cac.azarea.cluster.tester.MapReduceJobManagerTester;
import jp.co.cac.azarea.cluster.util.Generated;
@Generated("AZAREA-Cluster 1.0")
public class TutorialFlowTest {
public static void main(String[] args) throws IOException {
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new SimpleEntityFlowManager());
tester.test("../data", TutorialFlow.class.getName());
}
}
これを実行すると、AZAREA-Clusterフレームワーク内部のシミュレータにより、エンティティフローが
実行されます。デバッガによりデバッグすることも可能です。
実行結果はコンソールに出力されますが、ファイルにも出力されます。プロジェクトをリフレッシュし、
「azarea/result」フォルダーの下を確認してください。
4 簡単なアプリケーションの開発
29
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
5 エンティティクラス
30
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
5 エンティティクラス
5.1 概要
エンティティとは 1 件分のデータであり、エンティティクラスはそれを保持するためのクラスです。エンテ
ィティクラスは、列の値を保持するための publicフィールド12と、幾つかのユーティリティメソッドから成り
ます。
public class SalesEntity extends DefaultEntity {
...
public String customerCode;
public BigDecimal amount;
...
}
エンティティクラスはテキストエディタでコーディングするのではなく、ExcelまたはXMLファイルで書か
れたスキーマ定義からプラグインで自動生成します。あるいは、エンティティクラス編集画面により編集するこ
ともできます。
5.2 エンティティクラスの構成
エンティティクラスは、フレームワークの DefaultEntityクラスを継承します。DefaultEntityクラスは、
Entityインターフェイスを実装しています。この Entityインターフェイスが、エンティティクラスの基本的
なインターフェイスとなります。
5.3 エンティティクラスとファイル
5.3.1 エンティティファイルの場所
アプリケーションは、HDFS上の入力フォルダーからエンティティを入力し、HDFS上の出力フォルダーに
エンティティを出力します。
入力フォルダーおよび出力フォルダーは、アプリケーション実行時に指定します。入力フォルダーは複数指定
12 実装を簡潔にするために、アクセサメソッドを設けるのではなく publicフィールドとしています。
Entity
DefaultEntity
エンティティクラス
5 エンティティクラス
31
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
することができます。入力フォルダーと出力フォルダーが同じであったり、一方が他方のサブフォルダーである
場合は、エラーとなります。
5.3.2 エンティティファイル名
エンティティファイル名は、デフォルトでは「エンティティクラス名.txt」とします(パッケージ名は含み
ません)。例えば、エンティティクラス名が「jp.co.cac.sample.entity.SalesEntity」の場合、エンティテ
ィファイル名は「SalesEntity.txt」となります。別のファイル名にカスタマイズすることできます(カスタ
マイズ方法については「6.4.4(1) getInput」および「6.4.4(3) setOutput」6.4.4(3)を参照してください)。
エンティティファイルを分割する場合は、サブフォルダー名を「エンティティクラス名.txt」とし、その直
下に分割されたエンティティファイルを置きます。分割されたエンティティファイルの名前は任意で構いません。
なお、AZAREA-Clusterによる処理結果は必ず分割されています(分散処理されているため)。
5.3.3 エンティティファイルのフォーマット
(1) 概要
エンティティファイルはテキストファイルであり、1行が 1つのエンティティに対応します。以下は、エ
ンティティファイルの例です。
エンティティファイルのフォーマットの大部分はカスタマイズが可能です。カスタマイズ方法については
「5.7 エンティティファイルのフォーマットのカスタマイズ」を参照してください。
(2) 文字コード
デフォルトはUTF-8です。シフト JISあるいはEUCにカスタマイズすることができます。
(3) 行区切り
行の区切り文字は、改行記号(CR+LFまたはCRまたはLF)です。エスケープには対応していないため、
列の値として改行文字を使用することはできません。
(4) コメント
コメント文字で始まる行は、エンティティではなくコメントとみなされます。コメント文字のデフォルト
は「#」ですが、カスタマイズすることができます。コメントを使用しない場合は、コメント文字を指定し
ないことも可能です。
(5) 列区切り
行内での列の区切り方には幾つか種類があります。デフォルトはタブによる文字区切りですが、カスタマ
イズすることができます。
#担当者コード<TAB>担当者名< TAB>部門コード
10001< TAB>○○ 一郎<TAB>201
10002< TAB>△△ 花子<TAB>210
10099< TAB>□□ 三郎<TAB>201
SalesEntity.txt
5 エンティティクラス
32
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
a. 文字区切り
特定の区切り文字により、列を区切ります。エスケープには対応していないため、どの列の値とし
ても現れない区切り文字を使用する必要があります。
なお、「(1) 概要」での例は、タブによる文字区切りです。
b. 固定長区切り
エンティティの列毎に長さを定義して区切ります(定義方法は「5.4 スキーマの定義」を参照して
ください)。列の値がその長さに満たない場合は、半角スペースで埋めます。
以下は、2桁の int列、整数部 4桁小数部 2桁の BigDecimal列、長さ 5の String列のエンティ
ティの例です。数値に関しては、符号や小数点の分文字数が増えます。つまり、int列は 3文字分、
BigDecimal列は 8文字分となります。
int列 BigDecimal列 String列
- 9 9 - 9 9 9 9 . 9 9 A B C D E
9 9 ▢ 9 9 9 9 . 9 9 ▢ X ▢ ▢ ▢ ▢
0 ▢ ▢ 0 ▢ ▢ ▢ ▢ ▢ ▢ ▢ あ い う え お
※「▢」は半角スペースを表しています。
なお、double列を含むエンティティを固定長区切りフォーマットで表すことはできません。
c. その他
1 行分の文字列を正規表現により解析してエンティティに変換することも可能です。具体的な方法
については「5.7 エンティティファイルのフォーマットのカスタマイズ」を参照してください。
5.3.4 値のフォーマット
ここでは、個々のエンティティの列の値のフォーマットについて説明します。
(1) String 型の列の値
エスケープには対応しておらず、文字列そのままです。但し、長さ 0の文字列は null値とみなされます。
従って、空文字列を書き込むことはできますが、空文字列を読み込むことはできません。
(2) int、long、BigDecimal 型の列の値
10 進数で文字列に変換されます。3 桁毎のカンマ区切りや、指数表記(「1.2e+10」のような)はできま
せん。なお、intと longに関しては、null値はありません。
なお、前後の半角スペースはトリムされます。
(3) double 型の列の値
Doubleクラスの toStringメソッドや parseDoubleメソッドに準じます。
なお、前後の半角スペースはトリムされます。
(4) Date 型の列の値
スキーマで定義されたフォーマットに従って、文字列に変換されます。
5 エンティティクラス
33
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
なお、前後の半角スペースはトリムされます。
(5) エンティティ型の列の値
そのエンティティの各列の値が展開されます。
例えば、顧客エンティティの列が顧客名、住所エンティティ、電話番号から成り、住所エンティティが都
道府県、市区町村、番地から成る場合は、以下のようになります。
#顧客名< TAB>都道府県<TAB>市区町村<TAB>番地< TAB>電話番号
○○株式会社<TAB>東京都< TAB>中央区< TAB>日本橋 XX-XX<TAB>03-XXXX-XXXX
(6) 固定長配列型の列の値
各要素が繰り返されます。
例えば、顧客名、四半期別売り上げ(4要素の配列)、年間売り上げから成るエンティティの場合は、以下
のようになります。
#顧客名< TAB>1Q< TAB>2Q< TAB>3Q< TAB>4Q< TAB>年
○○株式会社<TAB>1500<TAB>1000<TAB>1200<TAB>800<TAB>4500
(7) 可変長リスト型の列の値
最初に要素数、次に各要素が繰り返されます。
例えば、ユーザ名とメールアドレスのリストから成るエンティティの場合は、以下のようになります。
#ユーザ名<TAB>メールアドレス
○○ 一郎<TAB>2<TAB>[email protected]<TAB>[email protected]
5.4 スキーマの定義
5.4.1 Excel ファイルによるスキーマの定義
Excelファイルでは、シート毎にスキーマを定義することができます。シート名は任意で構いません。シート
のフォーマットは以下の通りです。
A B C D E F G H
1 エンティティ定義
2 エンティティクラス XXX
3 説明 XXX
4
5 列定義 列名 プロパティ名 キー 型 繰り返し フォーマット デフォルト
6 XXX XXX XXX XXX XXX XXX XXX
7 XXX XXX XXX XXX XXX XXX XXX
8 XXX XXX XXX XXX XXX XXX XXX
各項目の意味は以下の通りです。
項目 必須 説明
エンティティ定義 A1セルに「エンティティ定義」と入力されていないシートは無視されま
す。
エンティティクラス ○ エンティティのクラス名です。完全修飾クラス名またはクラス名のみを
5 エンティティクラス
34
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
記述します。クラス名のみを記述した場合は、「11.3 デフォルトパッケー
ジ」で設定されているデフォルトパッケージに生成されます。設定され
ていない場合は、この Excel ファイルと同じ場所にエンティティクラス
が生成されます。
説明 エンティティクラスの説明を記述します。エンティティクラスのJavadoc
に反映されます。
列定義 エンティティの列を 1つ以上定義します。Excelシート 1行につき、1つ
のエンティティ列を定義します。空行までを列定義とみなします。
プロパティ名 ○ エンティティ列のプロパティ名を記述します。プロパティ名はエンティ
ティクラスの publicフィールド名となります。
他のエンティティ列と重複してはなりません。
列名 エンティティ列を表す名前を記述します。列名は Javadoc に反映されま
す。
キー エンティティを一意に特定するためのキーを指定します。キーが 1 つの
場合は「1」、複数の場合は 1 から始まる連番を記述します。このキーは
EntityCollection クラス(「6.6.2 エンティティファイルの直接アクセ
ス」参照)で使用されますが、グループ化やソート、結合処理では使用
されません。
逆に言えば、EntityCollection クラスを使用しない場合は、キーの指
定は不要です。
なお、Entity型の列や繰り返し列をキーとして使用することはできませ
ん。
型 ○ エンティティ列の型を記述します。下表のいずれかの型名を記述します。
型名 説明
String 文字列
※nullと空文字列は区別されません。
int 32ビット整数値
long 64ビット整数値
BigDecimal 固定小数点数
double 倍精度浮動小数点数
Date 日時(ミリ秒まで保持可能)
Entity 他のスキーマのエンティティ
繰り返し エンティティ列を固定長の配列型にしたい場合は、その要素数(2以上)
を記述します。その場合、エンティティのフィールドは以下のようにな
ります。
public int[] numbers;
...
protected void initialize() {
numbers = new int[4];
}
可変長のリスト型にしたい場合は、「*」と記述します。その場合、エン
ティティのフィールドは以下のようになります。
5 エンティティクラス
35
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
public List<Integer> numbers;
要素を繰り返さない場合は、空にします。
フォーマット エンティティ列のフォーマットを記述します。フォーマットの記述方法
は、型により異なります。詳細は次表を参照してください。
デフォルト エンティティ列のデフォルト値を記述します。
Date型の場合は、フォーマットに対応した文字列で記述します(例えば
フォーマットが「yyyy/MM/dd」の場合は、「2012/01/23」のように記述
します)。
型別のフォーマットの意味は下表の通りです。
型 必須 フォーマット
String 最大文字数(2バイト文字でも 1文字と数えます)を指定します。
エンティティファイルが固定長区切りフォーマットの場合は必須です。
文字区切りフォーマットの場合は不要です。
int 10進数での最大桁数を指定します。
エンティティファイルが固定長区切りフォーマットの場合は必須です。
文字区切りフォーマットの場合は、指定することにより若干パフォーマンスが向
上する可能性があります。
long 10進数での最大桁数を指定します。
エンティティファイルが固定長区切りフォーマットの場合は必須です。
文字区切りフォーマットの場合は、指定することにより若干パフォーマンスが向
上する可能性があります。
BigDecimal ○ 整数部の最大桁数と小数部の最大桁数をカンマ区切りで指定します。
例えば「4,2」と指定すると、最大値は「9,999.99」となります。
double フォーマットはありません。
Date java.text.SimpleDateFormatの形式で Date値のフォーマットを指定します。
例えば「yyyy/MM/dd HH:mm:ss」のように指定します。
エンティティ ○ エンティティのクラス名を指定します。外側のエンティティクラスと同一パッケ
ージの場合は、パッケージ名を省略することができます。そうでない場合は、完
全修飾クラス名を指定する必要があります。
5.4.2 XML ファイルによるスキーマの定義
XMLファイルでは、1ファイルに複数のスキーマを定義することができます。ファイル名は任意で構いませ
ん。ファイルのフォーマットは以下の通りです(各要素の意味はExcelファイルと同様です)。
<?xml version="1.0" encoding="UTF-8" ?>
<Document>
<entity>
<entityClass>エンティティクラス</entityClass>
<description>説明</description>
<column>
<name>列名</name>
<property>プロパティ名</property>
<key>キー</key>
5 エンティティクラス
36
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
<type>型</type>
<repeat>繰り返し</repeat>
<format>フォーマット</format>
<default>デフォルト</default>
</column>
<column>
...
</column>
</entity>
<entity>
...
</entity>
</Document>
5.5 エンティティクラスの生成
5.5.1 スキーマ定義ファイルからの生成
パッケージエクスプローラでスキーマ定義ファイルを右クリックし、「AZAREA-Cluster」→「エンティティ
クラスを生成する」を選択します。すると、そのスキーマ定義ファイルからエンティティクラスが生成されます。
あるいは、パッケージを右クリックし、「AZAREA-Cluster」→「エンティティクラスを生成する」を選択し
ます。すると、そのパッケージ下の全てのスキーマ定義ファイルからエンティティクラスが生成されます。
5.5.2 エンティティフロー編集画面での編集
(1) エンティティクラス編集画面の起動
パッケージエクスプローラでエンティティクラスを選択し、ツールバーのアイコン をクリックすると、
エンティティクラス編集画面が開きます。
また、エンティティフロー編集画面から開くこともできます。左側のパネルで「パッケージ選択ボタン」
を押すと、パッケージ選択ダイアログが開きます。そこでパッケージを選択すると、そのパッケージ直下の
エンティティクラスの一覧が表示されます。そこでエンティティクラスを選択して「編集」ボタンを押すと、
エンティティクラス編集画面が開きます。
5 エンティティクラス
37
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
「追加」ボタンを押すと、エンティティクラス編集画面が開いて新しいエンティティクラスを作成するこ
とができます。「削除」ボタンを押すと、選択されているエンティティクラスが削除されます。「エクスポー
ト」ボタンを押すと、ファイル保存ダイアログが開き、選択されているパッケージ直下の各エンティティク
ラスの定義をExcelファイルまたはXMLファイルとして保存することができます。
5 エンティティクラス
38
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) エンティティクラス編集画面の操作
項目 必須 説明
パッケージ エンティティのパッケージです。編集不可です。
クラス名 ○ エンティティのクラス名です。エンティティフロー編集画面から「追
加」ボタンで開いた場合に限り、入力可能です。
説明 エンティティクラスの説明を記述します。エンティティクラスの
Javadocに反映されます。
プロパティ名 ○ エンティティ列のプロパティ名を記述します。プロパティ名はエンテ
ィティクラスの publicフィールド名となります。
他のエンティティ列と重複してはなりません。
列名 エンティティ列を表す名前を記述します。列名は Javadoc に反映され
ます。
キー エンティティを一意に特定するためのキーを指定します。
詳細は「5.4.1 Excelファイルによるスキーマの定義」を参照してくだ
さい。
型 ○ エンティティ列の型をドロップダウンリストから選択します。
詳細は「5.4.1 Excelファイルによるスキーマの定義」を参照してくだ
さい。
繰り返し エンティティ列を固定長の配列型にしたい場合は、その要素数(2以上)
を記述します。
5 エンティティクラス
39
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
可変長のリスト型にしたい場合は、「*」と記述します。
フォーマット エンティティ列のフォーマットを記述します。「型」が Entityの場合
は、クリックするとダイアログが開くので、エンティティクラスを選
択してください。
フォーマットの記述方法の詳細は「5.4.1 Excelファイルによるスキー
マの定義」を参照してください。
デフォルト エンティティ列のデフォルト値を記述します。
詳細は「5.4.1 Excelファイルによるスキーマの定義」を参照してくだ
さい。
「✚」ボタン 新しいエンティティ列を追加します。
「↑」ボタン 選択されているエンティティ列を 1つ上に移動します。
「↓」ボタン 選択されているエンティティ列を 1つ下に移動します。
「✖」ボタン 選択されているエンティティ列を削除します。
「更新」ボタン 編集内容をエンティティクラスに反映し、エンティティ編集画面を終
了します。
「キャンセル」ボタン 編集内容をエンティティクラスに反映せずに、エンティティ編集画面
を終了します。
「インポート」ボタン 以下を参照してください。
「インポート」ボタンでは、他のエンティティクラスの列をコピーすることができます。「インポート」ボ
タンを押すとダイアログが開くので、インポートするエンティティクラスを選択します。このとき、「重複す
るプロパティ名はインポートしない」がチェックされていると、インポート先のエンティティクラスに存在
しないプロパティ名のエンティティ列のみがコピーされます。
5 エンティティクラス
40
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
5.6 エンティティクラスのAPI 仕様
(1) 各 public フィールド
エンティティの各列は、publicフィールドとしてアクセスできます。
(2) コンストラクタ
引数 説明
- -
戻り値 説明
- -
仕様
エンティティのインスタンスを生成します。
各列の値は、スキーマで定義されたデフォルト値で初期化されます。
配列型の列は、スキーマで定義された繰り返し数で初期化されます。配列の各要素はデフォルト値で初
期化されます。
リスト型の列は、空リストで初期化されます。
エンティティ型の列は、空のエンティティインスタンスで初期化されます。
(3) copyFrom
引数 説明
エンティティクラス src コピー元のエンティティ
戻り値 説明
void -
仕様
引数で渡されたエンティティから自身のエンティティに、同じプロパティ名の列の値をコピーします。
一方にしか存在しないプロパティ名は無視されます。それぞれの列の型が異なる場合は、例外が発生し
ます。
配列やリスト型の列の場合は、全ての要素がコピーされます。エンティティ型の列の場合は、再帰的に
各列の値がコピーされます。(いわゆるディープコピーになります)
(4) cloneEntity
引数 説明
- -
戻り値 説明
エンティティクラス 複製されたエンティティ
仕様
エンティティを複製して返します(いわゆるディープコピーになります)。
5.7 エンティティファイルのフォーマットのカスタマイズ
5.7.1 概要
エンティティファイルのフォーマットは、EntityManagerというクラスが管理しています。EntityManager
のメソッドを呼び出すことにより、エンティティファイルのフォーマットをカスタマイズすることができます。
5.7.2 EntityFormat クラス
EntityFormatクラスは、エンティティファイルのフォーマットを表すクラスです。文字区切りフォーマット
5 エンティティクラス
41
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
を表す DelimitedEntityFormat、固定長区切りフォーマットを表す FixedEntityFormat、正規表現フォーマ
ットを表す RegexEntityFormatの 3つのサブクラスを持ちます。
各クラスのAPI仕様を以降で説明します。
5.7.2.1 DelimitedEntityFormat クラス
(1) コンストラクタ
引数 説明
String encoding 文字のエンコーディングです。以下のいずれかを指定します。
EntityTextFormat.UTF8
EntityTextFormat.EUC
EntityTextFormat.SHIFT_JIS
String comment コメント文字です。コメント行が無い場合は nullを指定します。
String delimiter 区切り文字を指定します。
戻り値 説明
- -
仕様
文字区切りエンティティフォーマットを定義します。
(2) コンストラクタ
引数 説明
-
戻り値 説明
- -
仕様
文字区切りエンティティフォーマットを定義します。エンコーディング、コメント文字と区切り文字は
デフォルト(UTF8、”#”とタブ)となります。
(3) encoding(static メソッド)
引数 説明
String encoding 文字のエンコーディングです。以下のいずれかを指定します。
EntityTextFormat.UTF8
EntityTextFormat.EUC
EntityTextFormat.SHIFT_JIS
戻り値 説明
EntityFormat
DelimitedEntityFormat FixedEntityFormat RegexEntityFormat
5 エンティティクラス
42
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
EntityDelimitedFormat インスタンスが生成されて返されます。
仕様
エンコーディングがカスタマイズされた文字区切りエンティティフォーマットを定義します。コメント
文字と区切り文字はデフォルト(”#”とタブ)となります。
(4) comment(static メソッド)
引数 説明
String comment コメント文字です。コメント行が無い場合は nullを指定します。
戻り値 説明
EntityDelimitedFormat インスタンスが生成されて返されます。
仕様
コメント文字がカスタマイズされた文字区切りエンティティフォーマットを定義します。エンコーディ
ングと区切り文字はデフォルト(UTF8とタブ)となります。
(5) delimiter(static メソッド)
引数 説明
String delimiter 区切り文字を指定します。
戻り値 説明
EntityDelimitedFormat インスタンスが生成されて返されます。
仕様
区切り文字がカスタマイズされた文字区切りエンティティフォーマットを定義します。エンコーディン
グとコメント文字はデフォルト(UTF8と”#”)となります。
5.7.2.2 FixedEntityFormat クラス
(1) コンストラクタ
引数 説明
String encoding 文字のエンコーディングです。以下のいずれかを指定します。
EntityTextFormat.UTF8
EntityTextFormat.EUC
EntityTextFormat.SHIFT_JIS
String comment コメント文字です。コメント行が無い場合は nullを指定します。
戻り値 説明
- -
仕様
固定長区切りエンティティフォーマットを定義します。
(2) コンストラクタ
引数 説明
-
戻り値 説明
- -
仕様
固定長区切りエンティティフォーマットを定義します。エンコーディングとコメント文字はデフォルト
5 エンティティクラス
43
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(UTF8と”#”)となります。
5.7.2.3 RegexEntityFormat クラス
(1) コンストラクタ
引数 説明
String encoding 文字のエンコーディングです。以下のいずれかを指定します。
EntityTextFormat.UTF8
EntityTextFormat.EUC
EntityTextFormat.SHIFT_JIS
String comment コメント文字です。コメント行が無い場合は nullを指定します。
String pattern 正規表現のパターンです。正規表現にマッチした各グループが、各エンテ
ィティ列に対応します。
例えば、パターン「^([0-9]+)/([0-9]+)/([0-9]+)$」に対して行が
「2012/1/23」であれば、エンティティの各列の値は「2012」、「1」、「23」
となります。
戻り値 説明
- -
仕様
正規表現エンティティフォーマットを定義します。
(2) コンストラクタ
引数 説明
String pattern 「(1) コンストラクタ」と同様です。
戻り値 説明
- -
仕様
正規表現エンティティフォーマットを定義します。エンコーディングとコメント文字はデフォルト
(UTF8と”#”)となります。
5.7.3 EntityManager クラス
EntityManagerクラスは、エンティティファイルのフォーマットをカスタマイズするためのメソッドを持ち
ます。その仕様を以降で説明します。
(1) defineDefaultInputEntityFormat
引数 説明
EntityFormat format エンティティファイルのフォーマットを表すオブジェクトです。詳細
は「5.7.2 EntityFormatクラス」で説明します。
戻り値 説明
- -
仕様
入力エンティティファイルのデフォルトのフォーマットをカスタマイズします。defineEntityFormat
メソッドで指定されていない入力エンティティファイルのフォーマットは、全てこのフォーマットにな
ります。
5 エンティティクラス
44
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) defineDefaultOutputEntityFormat
引数 説明
String fileName カスタマイズ対象のエンティティファイル名を指定します。
EntityFormat format エンティティファイルのフォーマットを表すオブジェクトです。詳細は
「5.7.2 EntityFormatクラス」で説明します。
戻り値 説明
- -
仕様
出力エンティティファイルのデフォルトのフォーマットをカスタマイズします。defineEntityFormat
メソッドで指定されていない出力エンティティファイルのフォーマットは、全てこのフォーマットにな
ります。
(3) defineEntityFormat
引数 説明
Class entityClass エンティティファイル「指定されたクラス名.txt」のフォーマット
がカスタマイズ対象となります。同じエンティティクラスでも他の
エンティティファイルは対象外となることに注意してください。
EntityFormat format エンティティファイルのフォーマットを表すオブジェクトです。詳
細は「5.7.2 EntityFormatクラス」で説明します。
戻り値 説明
- -
仕様
ファイル名が「指定されたクラス名.txt」であるエンティティファイルのフォーマットをカスタマイズ
します。
(4) defineEntityFormat
引数 説明
String fileName カスタマイズ対象のエンティティファイル名を指定します。
EntityFormat format エンティティファイルのフォーマットを表すオブジェクトです。詳細は
「5.7.2 EntityFormatクラス」で説明します。
戻り値 説明
- -
仕様
指定されたファイル名のエンティティファイルのフォーマットをカスタマイズします。
5.7.4 EntityManager の呼び出しタイミング
EntityManagerのメソッドの呼び出しタイミングは、アプリケーションの初期化時とエンティティフローの
初期化時の 2通りがあります。基本的にはアプリケーションの初期化時に呼び出すことが推奨されます。但し、
エンティティフローを単独で実行する場合は、エンティティフローの初期化時に呼び出す必要があります。
(1) アプリケーションの初期化時に呼び出す場合
アプリケーションクラスは EntityFlowManagerクラスを継承しますが、その initializeContextメソ
ッドをオーバーライドします。引数 args は、アプリケーション引数です(詳細は「7.5 アプリケーション
引数」を参照してください)。EntityManagerインスタンスは getEntityManagerメソッドにより取得しま
5 エンティティクラス
45
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
す。
以下は、「TantoEntity.csv」ファイルのフォーマットをCSVとして定義する例です。
@Override
protected void initializeContext(List<String> args) throws IOException {
getEntityManager().defineEntityFormat("TantoEntity.csv",
DelimitedEntityFormat.delimiter(","));
}
(2) エンティティフローの初期化時に呼び出す場合
エンティティフローの初期化処理は、エンティティフロークラスの initialize メソッドで行われます。
その先頭で EntityManager のメソッドを呼び出します。 EntityManager インスタンスは、
getEntityManagerメソッドにより取得します。
以下は、「TantoEntity.csv」ファイルのフォーマットをCSVとして定義する例です。
@Override
protected void initialize() {
getEntityManager().defineEntityFormat("TantoEntity.csv",
DelimitedEntityFormat.delimiter(","));
...
}
なお、initialize メソッドの内容は基本的にはエンティティフロー画面で編集しますが、上記の処理は
画面からはエンティティフロー編集できません。従って、テキストエディタで記述する必要があります。そ
の後エンティティフロー編集画面で initializeメソッドの内容を編集しても、記述した処理が消えること
はありません。
5.7.5 サンプル
(1) 入力ファイルのエンコーディングをシフト JIS に設定
getEntityManager().defineDefaultInputEntityFormat(
DelimitedEntityFormat.encoding(TextEntityFormat.SHIFT_JIS));
(2) 出力ファイルにコメント行を出力しないよう設定
getEntityManager().defineDefaultOutputEntityFormat(
DelimitedEntityFormat.comment(null));
(3) 特定の入力ファイルをカンマ区切りに設定
getEntityManager().defineEntityFormat(
SalesEntity.class, DelimitedEntityFormat.delimiter(","));
6 エンティティフロークラス
46
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
6 エンティティフロークラス
6.1 概要
エンティティフロークラスは、エンティティに対する処理フローを表すクラスです。どのエンティティを入力
し、どのような処理を行い、その処理結果をどうするか(出力するか、別の処理に入力するか)を記述します。
エンティティフロークラスは、一からテキストエディタでコーディングすることもできますが、
AZAREA-Clusterプラグインが用意しているエンティティフロー編集画面を利用すると、非常に効率的です。但
し、エンティティフロー編集画面でエンティティフロークラスを完全に作成することはできず、詳細処理はテキ
ストエディタでコーディングする必要があります。
6.2 エンティティフロークラスの構成
エンティティフロークラスは、フレームワークの EntityFlow クラスを継承します。initialize メソッドを
オーバーライドし、そこにエンティティフローを記述します。
入力エンティティファイルは、EntityFileクラスのインスタンスとして定義されます。EntityFlowクラスに
用意されている getInputメソッドにより、インスタンスを取得することができます。
また、変換、結合、グループ化、ソートといった各処理に対応する処理クラスが用意されています(これらは
EntityFileクラスを継承しています)。アプリケーションでは、これらの処理クラスをサブクラス化して処理の
内容を記述します。
処理結果を出力する場合は、EntityFlowクラスに用意されている setOutputメソッドを呼び出します。
例えば、エンティティAとエンティティBを結合した後にグループ化する、というエンティティフローのオブ
ジェクトは、以下のようになります。
EntityFlow
エンティティフロー
クラス
Sort
(ソート)
Join
(結合)
Group
(グループ化)
Conversion
(変換)
EntityFile
#initialize() : void
#initialize() : void
6 エンティティフロークラス
47
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
このように、エンティティフローは EntityFile オブジェクトや処理クラスオブジェクトの関連で表わされま
す。
なお、実際には EntityFile クラスや処理クラスはジェネリッククラスとなっています。そして、入力エンテ
ィティのクラスや、処理の入出力のエンティティのクラスを特定できるようになっています。例えば、
SalesEntityと CustomerEntityを結合して ResultEntityを出力する処理の場合は、以下のようになります。
Join<SalesEntity, CustomerEntity, ResultEntity>
6.3 新規エンティティフロークラスの作成
新規エンティティフローを作成するには、パッケージエクスプローラでパッケージを選択してアイコン を
クリックします。あるいは、右クリックメニューから「AZAREA-Cluster」→「新規エンティティフローを作成」
を選択します。すると、新規エンティティフロー作成画面が開きます。
そこでクラス名を入力すると、空のエンティティフロークラスが作成されます。そして、すぐにエンティティ
フロー編集画面が開きます。
6.4 エンティティフロークラスの編集
6.4.1 概要
エンティティフロー編集画面は、下図のようになっています。
:エンティティフロークラス
結合処理
:Joinのサブクラス
エンティティA
:EntityFile
エンティティB
:EntityFile
グループ化処理
:Groupのサブクラス
6 エンティティフロークラス
48
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
左側のボタン等がある領域を「操作パネル」、右側の大きな領域を「メインパネル」と呼びます。メインパネ
ルにエンティティフロー図を作成していきます。
6.4.2 エンティティクラスの選択
まず、エンティティクラスを選択します。このエンティティクラスは、入力エンティティや処理を追加する際
に反映されます(追加後に変更することも可能です)。
操作パネルの「パッケージ選択」ボタンを押すと、パッケージ選択ダイアログが開きます。そこでパッケージ
を選択すると、そのパッケージ下のエンティティクラスが一覧表示されます。エンティティクラスを選択すると、
そのエンティティの列の一覧が表示されます。
操作パネル メインパネル
6 エンティティフロークラス
49
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
「追加」「編集」「削除」ボタンにより、エンティティクラスを編集することができます。また、「エクスポー
ト」ボタンにより、エンティティクラスの定義を出力することができます。詳細は「5.5.2 エンティティフロー
編集画面での編集」を参照してください。
6.4.3 エンティティファイルや処理の編集
本章では、エンティティファイルや処理の基本的な編集方法について説明します。個々のエンティティファイ
ルや処理の仕様については、次章で詳しく説明します。
(1) エンティティファイルや処理の追加
エンティティファイル(または処理)を追加するには、操作パネルのボタンをメインパネルにドラッグ&
ドロップします。
6 エンティティフロークラス
50
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) エンティティファイルや処理の編集
エンティティファイル(または処理)の右上の「✎」アイコンをクリックすると、詳細編集画面が開きま
す。詳細編集画面で編集可能な内容は、エンティティファイルまたは処理の種類毎に異なります。詳しくは
「6.4.4 エンティティファイルや処理の詳細」で説明します。右クリックメニューから「編集」を選択して
も、詳細編集画面が開くことができます。
メインパネル上でエンティティファイル(または処理)をドラッグすると、位置を移動することもできま
す13。選択された複数のエンティティファイル(または処理)を一編に移動することも可能です。複数選択
を行うには、Shiftキーを押しながらクリックするか、ドラッグして矩形範囲を選択します。
(3) エンティティファイルや処理間の入出力
エンティティファイル(または処理)の右上の「➘」アイコンを他のエンティティファイル(または処理)
にドラッグ&ドロップすると、それらの間に入出力関係を定義することができます。
13 位置の情報は、アノテーションとしてエンティティフロークラスのソースに保存されます。
ドラッグ&ドロップ
ドラッグ&ドロップ
6 エンティティフロークラス
51
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
矢印をクリックすると両端に□が現れます。それを別のエンティティファイル(または処理)にドラッグ
&ドロップすると、入力元または出力先を変更することができます。
矢印を右クリックしてメニューから「削除」を選択すると、入出力関係を削除することができます。
複数の入力がある場合は、先頭の入力が黒塗りの矢印、その他の入力が白抜きの矢印となります。右クリ
ックメニューから「入力順を先頭に」を選択すると、対応する入力を先頭にすることができます。入力順の
意味については、「6.4.4 エンティティファイルや処理の詳細」を参照してください。
(4) エンティティファイルや処理の削除
メインパネルでエンティティファイル(または処理)を選択して「Delete」キーを押すと、削除すること
ができます。右クリックメニューから「削除」を選択しても同様です。選択された複数のエンティティファ
イル(または処理)を一編に削除することも可能です。複数選択を行うには、Shift キーを押しながらクリ
ックするか、ドラッグして矩形範囲を選択します。
6.4.4 エンティティファイルや処理の詳細
下表にエンティティファイルと処理の一覧をまとめました。「入力」は、そのエンティティファイルや処理に
入力可能な個数を表します。
6 エンティティフロークラス
52
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
種別 入力 説明
エンティティファイル
getInput - 入力エンティティを定義します。
Union 1以上 同一エンティティクラスの複数の入力エンティティ(または処理)
を 1つに集約します。
setOutput 1 処理結果をエンティティフローの出力として定義します。
openOutput 1 処理(Group を除く)から複数のエンティティファイルを出力する
ことを表します。
処理
Conversion 1 入力エンティティファイル(または処理)を変換して出力します。
Group 1 入力エンティティファイル(または処理)を設定された列でグルー
プ化し、集計して出力します。
Sort 1 入力エンティティファイル(または処理)を設定された列でソート
して出力します。必要に応じて変換を行うこともできます。
GroupSort 1 入力エンティティファイル(または処理)を設定された列でグルー
プ化し、更にグループ内でソートして出力します。必要に応じて変
換を行うこともできます。
いわゆるキーブレーク処理を行うことができます。
Join 2 2つの入力エンティティファイル(または処理)を設定された列で結
合して出力します。必要に応じて変換を行うこともできます。
UniqueJoin 2 結合対象が 1件以下に定まる場合に利用可能な結合処理です。
上記以外にカスタムコンポーネントというものがあります。カスタムコンポーネントは、処理の中で呼び出す
ことができるクラス部品です。
エンティティフローの基本的な形は、getInput→処理1→処理2→…処理N→setOutput のようになります。
下図はその例です。なお、フローを循環させることはできません。
6 エンティティフロークラス
53
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
生成されるソースは以下のようになります。
public class TestFlow extends EntityFlow {
@Override
protected void initialize() {
@Diagram(x = 94, y = 107)
EntityFile<CustomerEntity> input1 = getInput("input1", CustomerEntity.class);
@Diagram(x = 96, y = 233)
Conversion<CustomerEntity, ResultEntity> conversion1 =
new Conversion<CustomerEntity, ResultEntity>("conversion1", input1) {
@Override
protected void convert(CustomerEntity entity) {
// TODO
ResultEntity result = new ResultEntity();
result.copyFrom(entity);
output(result);
}
};
6 エンティティフロークラス
54
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
@Diagram(x = 94, y = 359, outputX = 95, outputY = 491)
Group<ResultEntity> group1 =
new Group<ResultEntity>("group1", conversion1, "registerShopId") {
@Override
protected void doSummarize(ResultEntity summary, ResultEntity another) {
// TODO
}
};
setOutput(group1);
}
}
なお、エンティティフロー編集画面では、処理の具体的な内容(例えば、どのような計算式で集計するか)ま
では編集できません。処理の内容については、処理毎に定義されたメソッドをテキストエディタで実装する必要
があります。
以降、各エンティティファイルや処理の詳細を説明します。
(1) getInput
入力エンティティファイルを定義します。入力エンティティファイルとして使用できるのは以下のいずれ
かです。
・ 入力エンティティフォルダーに存在するエンティティファイル
・ アプリケーションが複数のエンティティフローから構成される場合、以前のエンティティフローで
setOutputにより定義されているエンティティファイル
これらに該当しない場合は、実行時にエラーとなります(エンティティフロー編集画面ではエラーになり
ません)。
「✎」アイコンにより開く詳細画面は以下のようになります。
6 エンティティフロークラス
55
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフ
ォルトでは変数名と同じになります。
変数名 ○ initializeメソッド内でのローカル変数名です。他と重複す
ることはできません。
コメント コメントです。ソースコードには Javadoc 形式で反映されま
す。エンティティフロー図上に表示することもできます。
ファイル名 入力するエンティティファイル名です。省略した場合は、「エ
ンティティクラス名.txt」となります。
ファイルサイズ(テスト用) 実際のエンティティファイルのサイズを入力します。「6.4.6(6)
MapReduceジョブ表示」で利用します。
エンティティクラス ○ 入力するエンティティファイルのエンティティクラスを指定
します。
(2) Union
同一エンティティクラスの複数の入力エンティティファイル(または処理)を 1つに集約します。入力の
6 エンティティフロークラス
56
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
順序に意味はありません。Unionは他の処理へ入力することはできますが、setOutputで出力することはで
きません。
下図は、2つのエンティティファイルと、もう 1つのエンティティファイルをグループ化した結果を集約
する例です。
「✎」アイコンにより開く詳細画面は以下のようになります。
6 エンティティフロークラス
57
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフォルト
では変数名と同じになります。
変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること
はできません。
コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ
ンティティフロー図上に表示することもできます。
エンティティクラス (○) 集約した結果のエンティティクラスです。入力元のエンティティク
ラスが自動的に設定されます。
Unionのサンプルは、「12.9 Join、UnionとApplicationContextのサンプル」を参照してください。
(3) setOutput
処理結果をエンティティフローの出力として定義します。アプリケーションが複数のエンティティフロー
から構成される場合は、以降のエンティティフローで入力エンティティファイルとして使用することができ
ます。
「中間出力」がチェックされていない場合は、最終的にエンティティファイルとして出力されることが保
証されます。逆にそうでない場合は、メモリ内で処理されファイル出力されない可能性があります。
出力エンティティファイル名が他と重複する場合や、入力エンティティフォルダーに同名のエンティティ
ファイルが存在する場合は、実行時にエラーとなります(エンティティフロー編集画面ではエラーになりま
せん)。
6 エンティティフロークラス
58
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
「✎」アイコンにより開く詳細画面は以下のようになります。
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。
コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ
ンティティフロー図上に表示することもできます。
ファイル名 出力するエンティティファイル名です。省略した場合は、「エンティ
ティクラス名.txt」となります。
中間出力 未チェックの場合は、必ずファイルが出力されます。
チェックされている場合は、フレームワークでの処理の最適化によ
りファイル出力されない可能性があります。
パフォーマンス向上のため、ファイル出力する必要が無ければチェ
ックすることを推奨します。
エンティティクラス (○) 出力されるエンティティクラスです。入力元のエンティティクラス
が自動的に設定されます。
(4) openOutput
条件に応じてエンティティを振り分けたい場合、正常な処理結果とは別にエラー結果を出力したい場合な
ど、1 つの処理から複数のエンティティファイルを出力したい場合があります。そのようなときには、
「openOutput」を使用します。これは、通常の処理結果の出力先に加え、別の出力先を定義する機能です14。
14 openOutputはあくまでも出力先を増やすだけであり、それだけではファイルにが出力されません。ファイルに出力するには、
更に setOutputを接続する必要があります。
6 エンティティフロークラス
59
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
Group以外の処理に対して使用することができます。
「✎」アイコンにより開く詳細画面は以下のようになります。
6 エンティティフロークラス
60
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフ
ォルトでは変数名と同じになります。
変数名(※) ○ 入力元の処理内でのインスタンス変数名です。同じ処理の他
の openOutput やカスタムコンポーネントと重複することは
できません。
コメント コメントです。ソースコードには Javadoc 形式で反映されま
す。エンティティフロー図上に表示することもできます。
ファイル名 入力元の処理に対して同じエンティティクラスの
openOutputを複数定義したい場合、それらを区別するために
ファイル名を指定します。
エンティティクラス ○ 出力されるエンティティファイルのエンティティクラスを指
定します。
※ 変数名を変更してソースを更新した場合、宣言部の変数名は変更されますが、処理のメソッド内で使
用している変数名は変更されませんので、ご注意ください。
openOutput は、入力元の処理のインスタンス変数として定義されます。その output メソッドを呼び出
すことにより、エンティティを出力することができます。
以下は実装例です。条件に応じて、通常の出力と openOutputによる出力に分類しています。
Conversion<SalesEntity, SalesEntity> conversion =
new Conversion<SalesEntity, SalesEntity>(sales) {
private final Outputable<SalesEntity> small = openOutput(SalesEntity.class);
6 エンティティフロークラス
61
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
@Override
protected void convert(SalesEntity entity) {
if (...) {
output(entity);
} else {
small.output(entity);
}
}
};
openOutputのサンプルは、「12.7 Conversionと openOutput、getEntityCollectionのサンプル」を参照
してください。
(5) Conversion
入力エンティティファイル(または処理)を変換して出力します。変換内容は任意ですが、例として以下
のようなものが挙げられます。
・ あるエンティティを別の型のエンティティに変換する
・ 条件に合うエンティティのみを出力する
・ 条件に合うエンティティを正常エンティティ、そうでないエンティティをエラーエンティティとし
て出力する(openOutputと組み合わせる)
「✎」アイコンにより開く詳細画面は以下のようになります。
6 エンティティフロークラス
62
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフォルト
では変数名と同じになります。
ログにもこの名称が出力されます。
種別 ○ 処理の種別を変更することができます。
変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること
はできません。
コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ
ンティティフロー図上に表示することもできます。
エンティティクラス ○ 処理結果のエンティティクラスです。
変換内容は、テキストエディタで convertメソッドに記述します。
@Override
protected void convert(TextEntity entity) {
WordCountEntity result = new WordCountEntity();
...
output(result);
}
引数 entity は、入力エンティティです。output メソッドにより、エンティティを出力します。output
メソッドは何回呼んでも(あるいは呼ばなくても)構いません。
Conversionのサンプルは、「12.7 Conversionと openOutput、getEntityCollectionのサンプル」を参照
してください。
6 エンティティフロークラス
63
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(6) Group
入力エンティティファイル(または処理)を指定された列でグループ化し、集計して出力します。集計内
容は任意ですが、以下の条件を満たす必要があります。
・ どの順序で集計しても結果が同じになる(A+B=B+A のように)
・ 1 エンティティずつ集計してもまとめて集計しても結果が同じになる(A+B+C+D=(A+B)+(C+D)
のように)
イメージ的には、下図のようになります15。
集計内容の例としては、件数、合計、最大値、最小値が挙げられます。
なお、平均値はGroupだけで集計することはできません。Groupで件数と合計を集計した後、Conversion
で平均値(=合計÷件数)を求める必要があります。詳細なサンプルは「12.3 Group」を参照してください。
15 あくまで一例であり、必ずこの順番で集計されるとは限りません。
:SalesEntity
amount = 80
:SalesEntity
amount = 40
:SalesEntity
amount = 30
:SalesEntity
amount = 50
:SalesEntity
amount = 20
:SalesEntity
amount = 100
:SalesEntity
amount = 220
:SalesEntity
amount = 150
:SalesEntity
amount = 70
6 エンティティフロークラス
64
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
「✎」アイコンにより開く詳細画面は以下のようになります。
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフォルト
では変数名と同じになります。
ログにもこの名称が出力されます。
種別 ○ 処理の種別を変更することができます。
変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること
はできません。
コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ
ンティティフロー図上に表示することもできます。
グループ化列 グループ化列を指定します。
左側でエンティティ列を選択して「>」ボタンを押すと、グループ
化列に追加されます。エンティティ型の列や配列型の列は、展開し
て個々の要素を指定することができます。
「✖」ボタンを押すと、選択されているグループ化列が削除されま
す。
グループ化列が 1 つも指定されていない場合は、全ての入力エンテ
6 エンティティフロークラス
65
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
ィティが 1つのグループとして集計されます。
エンティティクラス (○) 処理結果のエンティティクラスです。入力元のエンティティクラス
が自動的に設定されます。
集計内容は、テキストエディタで doSummarizeメソッドに記述します。
@Override
protected void doSummarize(SalesEntity summary, SalesEntity another) {
...
}
引数 summaryは集計結果、引数 anotherは集計対象のエンティティです。例えば合計値を集計する場合
は、summary に対して another を加える処理を記述します。具体的には、「summary.point +=
another.point」のように記述します。
Groupのサンプルは、「12.3 Groupのサンプル」を参照してください。
(7) Sort
入力エンティティファイル(または処理)を指定された列でソートして出力します。昇順あるいは降順の
どちらでソートすることもできます。ソートされたエンティティを変換してから出力することもできます。
例えば、「売上金額が大きい順にソートし、順位を付加して出力する」といったことが可能です。
なお、ソート処理は分散されずに単一マシン上で行われます(詳細は「6.5 処理の分散」を参照してくだ
さい)。可能であれば、GroupSortの方を使用するようにしてください。
「✎」アイコンにより開く詳細画面は以下のようになります。
6 エンティティフロークラス
66
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフォルト
では変数名と同じになります。
ログにもこの名称が出力されます。
種別 ○ 処理の種別を変更することができます。
変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること
はできません。
コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ
ンティティフロー図上に表示することもできます。
ソート列 ○ ソート列を指定します。
左側でエンティティ列を選択して「>」ボタンを押すと、ソート列
に追加されます。エンティティ型の列や配列型の列は、展開して個々
の要素を指定することができます。
「降順」をチェックすると降順、そうでない場合は昇順でソートさ
れます。
「✖」ボタンを押すと、選択されているソート列が削除されます。
エンティティクラス ○ 処理結果のエンティティクラスです。
6 エンティティフロークラス
67
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
処理内容は、テキストエディタで mergeメソッドに記述します。
@Override
protected void merge(SalesEntity entity) {
SalesOrdertEntity result = new SalesOrderEntity();
...
output(result);
}
引数 entity は、入力エンティティです。output メソッドにより、エンティティを出力します。output
メソッドは何回呼んでも(あるいは呼ばなくても)構いません。
なお、Sort ではインスタンス変数を利用してエンティティ間で情報を共有することができます。詳細は
「6.6.3 処理クラスのインスタンス変数」を参照してください。
その他、特殊なメソッドとして flushメソッドがあります。このメソッドは、全てのエンティティが merge
メソッドで処理された後に呼ばれます。インスタンス変数に残っている情報を出力する場合などに利用しま
す。
@Override
protected void flush() {
SalesOrdertEntity result = new SalesOrderEntity();
...
output(result);
}
mergeメソッドまたは flushメソッド中で getLastEntityメソッドを呼び出すと、1つ前の入力エンテ
ィティを取得することができます。
Sortのサンプルは、「12.8 Sortのサンプル」を参照してください。
6 エンティティフロークラス
68
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(8) GroupSort
まず、入力エンティティファイル(または処理)を指定された列でグループ化し、更にグループ内でソー
トして出力します。必要に応じて変換を行うこともできます。
例えば、「顧客別で売上金額が多い順に順序を付加する」ということができます。この場合は、顧客をグル
ープ化列、売上金額をソート列に指定します。
Sortにより顧客と売上金額でソートしても同様の処理を実現できますが、Sortは分散されず、GroupSort
はグループ化列で分散される、という違いがあります(詳細は「6.5 処理の分散」を参照してください)。そ
のため、GroupSortの方がパフォーマンスが高くなります。
「✎」アイコンにより開く詳細画面は以下のようになります。
6 エンティティフロークラス
69
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフォルト
では変数名と同じになります。
ログにもこの名称が出力されます。
種別 ○ 処理の種別を変更することができます。
変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること
はできません。
コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ
ンティティフロー図上に表示することもできます。
グループ化列 ○ グループ化列を指定します。
左側でエンティティ列を選択して「>グループ化」ボタンを押すと、
グループ化列に追加されます。エンティティ型の列や配列型の列は、
展開して個々の要素を指定することができます。
「✖」ボタンを押すと、選択されているグループ化列が削除されま
す。
ソート列 ソート列を指定します。
左側でエンティティ列を選択して「>ソート」ボタンを押すと、ソ
ート列に追加されます。エンティティ型の列や配列型の列は、展開
して個々の要素を指定することができます。
「降順」をチェックすると降順、そうでない場合は昇順でソートさ
れます。
「✖」ボタンを押すと、選択されているソート列が削除されます。
6 エンティティフロークラス
70
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
同一グループのエンテ
ィティをリストにまと
める
チェックすると、同一グループのエンティティがリストにまとめら
れてメソッドに渡されます。
チェックを外すと、エンティティが 1つずつメソッドに渡されます。
同一グループのエンティティ数が非常に多い場合は16、チェックを外
してください。
エンティティクラス (○) 処理結果のエンティティクラスです。
変換内容は、テキストエディタで mergeメソッドに記述します。
@Override
protected void merge(List<SalesEntity> entities) {
SalesOrderEntity result = new SalesOrderEntity();
...
output(result);
}
引数 entitiesは同一グループの入力エンティティのリストです。リスト内のエンティティは、指定され
たソート列でソートされています。outputメソッドにより、エンティティを出力します。outputメソッド
は何回呼んでも(あるいは呼ばなくても)構いません。一般的には、各入力エンティティを変換して出力す
るパターンと、入力エンティティのリストを集計して出力するパターンが多いと思います。
以下は、顧客でグループ化し、売上金額の降順でソートする場合のイメージです。
同一グループのエンティティ数が非常に多い場合は、「同一グループのエンティティをリストにまとめる」
のチェックを外し、以下のメソッドを実装してください。
@Override
protected void merge(SalesEntity entity, boolean isFirst, boolean isLast) {
SalesOrderEntity result = new SalesOrderEntity();
...
output(result);
16 10000件を超えるとエラーになります。エンティティリストのサイズが巨大になると OutOfMemoryErrorが発生する恐れが
あるため、件数を制限しています。
entities:List
:売上エンティティ
顧客 ID =C101
売上金額= 3000
:売上エンティティ
顧客 ID =C101
売上金額= 2500
:売上エンティティ
顧客 ID =C101
売上金額= 1000
entities:List
:売上エンティティ
顧客 ID =C201
売上金額= 2200
entities:List
:売上エンティティ
顧客 ID =C103
売上金額= 1200
:売上エンティティ
顧客 ID =C103
売上金額= 1000
6 エンティティフロークラス
71
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
}
引数 entityは入力エンティティです。グループ内の先頭のエンティティであれば isFirstが trueにな
ります。グループ内の最後のエンティティであれば、isLastが trueになります(グループ内にエンティテ
ィが 1つしかない場合は、両方が trueになります)。
また、merge メソッド中で getLastEntity メソッドを呼び出すと、1 つ前の入力エンティティを取得す
ることができます(但し、isFirstが trueの場合は nullが返されます)。
なお、GroupSortではインスタンス変数を利用してエンティティ間で情報を共有することができます。詳
細は「6.6.3 処理クラスのインスタンス変数」を参照してください。
GroupSortのサンプルは、「12.4 GroupSortのサンプル」を参照してください。
(9) Join
2 つのエンティティファイル(または処理)を指定された列で結合して出力します。先頭の方(上図では
SalesEntity)を単に「入力エンティティ」、2 番目の方(上図では CustomerInterestEntity)を「結合
エンティティ」と呼びます。
フレームワークは、入力エンティティを順に 1つずつ mergeメソッドに渡します。同時に、対応する結合
エンティティのリストも渡します17。このリストをソートすることも可能です。対応する結合エンティティ
が無い場合は、空のリストが渡されます。これは、SQLにおける外部結合に相当します。
17 従って、対応する結合エンティティの数が非常に多い場合は OutOfMemoryErrorが発生することに注意してください。その
ような場合は、入力エンティティと結合エンティティを Conversionにより変換した後、GroupSortでグループ化することに
より、結合と同等の処理を行うことができます。
6 エンティティフロークラス
72
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
2 つのエンティティファイル(または処理)のうち、どちらを入力エンティティ、どちらを結合エンティ
ティにするかは、基本的にはアプリケーションの仕様によって決めます。どちらでもよい場合は、件数の少
ない方を結合エンティティにすることを推奨します。フレームワークでの処理の最適化により、メモリ内で
処理されてパフォーマンスが向上する可能性があるからです(詳細は「6.7.3 結合方式」を参照してくださ
い)。
結合条件としては、以下のもののみに対応します。
・ 列の値の完全一致、プロパティ名は異なっていてもよい
(入力エンティティ.列A = 結合エンティティ 2.列B)
・ 上記をANDで結んだもの
条件の片側が定数の場合は、Conversion により処理することが可能です。条件に計算式が含まれる場合
は、Conversionで変換してから結合します。OR条件については、複数の Joinの結果を Unionします。
「✎」アイコンにより開く詳細画面は以下のようになります。
merge
:SalesEntity
顧客コード=C101
売上金額=20000
:CustomerInterestEntity
顧客コード=C101
興味分野=音楽
:CustomerInterestEntity
顧客コード=C101
興味分野=スポーツ
merge
:SalesEntity
顧客コード=C104
売上金額=12000
(該当 CustomerInterestEntity無し)
merge
:SalesEntity
顧客コード=C102
売上金額=25000
:CustomerInterestEntity
顧客コード=C102
興味分野=スポーツ
merge
:SalesEntity
顧客コード=C101
売上金額=8000
:CustomerInterestEntity
顧客コード=C101
興味分野=音楽
:CustomerInterestEntity
顧客コード=C101
興味分野=スポーツ
6 エンティティフロークラス
73
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフォルト
では変数名と同じになります。
ログにもこの名称が出力されます。
種別 ○ 処理の種別を変更することができます。
変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること
はできません。
コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ
ンティティフロー図上に表示することもできます。
結合列 ○ 結合列を指定します。
左側で入力エンティティの列と結合エンティティの列をそれぞれ選
択して「>」ボタンを押すと、結合列に追加されます。エンティテ
ィ型の列や配列型の列は、展開して個々の要素を指定することがで
きます。
「✖」ボタンを押すと、選択されている結合列が削除されます。
エンティティクラス ○ 処理結果のエンティティクラスです。
処理内容は、テキストエディタで mergeメソッドに記述します。
@Override
protected void merge(SalesEntity main, List<CustomerInterestEntity> subs) {
InterestSummaryEntity result = new InterestSummaryEntity();
6 エンティティフロークラス
74
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
...
output(result);
}
引数 mainは入力エンティティ、引数 subsは結合エンティティのリストです。outputメソッドにより、
エンティティを出力します。output メソッドは何回呼んでも(あるいは呼ばなくても)構いません。一般
的には、各結合エンティティに入力エンティティを付加して出力するパターンと、結合エンティティのリス
トを集計して入力エンティティに付加して出力するパターンが多いと思います。
結合エンティティのリストをソートする場合は、Join クラスの setSubSortColumns(String...
sortColumns)メソッドを呼び出します。具体的には、以下のように実装します。
Join<CustomerEntity, MailAddressEntity, ResultEntity> join =
new Join<CustomerEntity, MailAddressEntity, ResultEntity>(customer,
mailAdress,
"customerId") {
{
// 結合エンティティのリストを関心分野でソートする
setSubSortColumns("interest ASC");
}
@Override
protected void merge(CustomerEntity main, List<InterestSummaryEntity> subs) {
...
}
};
Joinのサンプルは、「12.9 Join、UnionとApplicationContextのサンプル」を参照してください。
(10) UniqueJoin
入力エンティティに対して結合エンティティが 1 件以下に限定される場合は、Join よりも UniqueJoin
を利用した方が、処理の内容を簡潔に記述できます。
詳細画面の仕様は、Joinと同じです。
処理内容は、テキストエディタで mergeメソッドに記述します。
@Override
protected void merge(SalesEntity main) {
AreaSummaryEntity result = new AreaSummaryEntity();
...
output(result);
}
@Override
protected void merge(SalesEntity main, CustomerEntity sub) {
AreaSummaryEntity result = new AreaSummaryEntity();
...
6 エンティティフロークラス
75
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
output(result);
}
引数 mainは入力エンティティです。対応する結合エンティティが無い場合は引数 mainのみの mergeメ
ソッド、ある場合は引数 mainと引数 subの mergeメソッドが呼ばれます。outputメソッドにより、エン
ティティを出力します。outputメソッドは何回呼んでも(あるいは呼ばなくても)構いません。
UnionJoinのサンプルは、「12.5 UniqueJoinとGroupのサンプル」を参照してください。
(11) カスタムコンポーネント
カスタムコンポーネントは、アプリケーションで任意に定義することができるクラス部品です。処理の中
でインスタンス化して利用します。
実際には、カスタムコンポーネントでなくても処理からは任意の Java クラスを利用可能です。ただ、カ
スタムコンポーネント化することにより、エンティティフロー図上で利用クラスを明示することができます。
① カスタムコンポーネントの定義
@CustomComponentアノテーション(jp.co.cac.azarea.cluster.util.CustomComponent)を付加
したクラスがカスタムコンポーネントとして認識されます。
カスタムコンポーネントは、それを利用する処理と共にインスタンス化されます。コンストラクタに引
数を渡すことも可能です。
以下は、カスタムコンポーネントクラスの例です。
@CustomComponent
public class Calculator {
private final BigDecimal rate;
public Calculator(String rate) {
this.rate = new BigDecimal(rate);
}
public BigDecimal calculate(BigDecimal n) {
return n.multiply(rate).setScale(0, RoundingMode.FLOOR);
}
}
② カスタムコンポーネントの配置
エンティティフロー編集画面において、操作パネルの「Custom」ボタンをドラッグ&ドロップします。
そして、カスタムコンポーネントを利用する処理から矢印を引きます。
6 エンティティフロークラス
76
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
③ カスタムコンポーネントの詳細設定
「✎」アイコンにより詳細画面を開き、詳細設定を行います。
項目 必須 説明
表示名 エンティティフロー編集画面上に表示される名称です。デフォルト
では変数名と同じになります。
変数名(※) ○ 入力元の処理内でのインスタンス変数名です。同じ処理の他のカス
タムコンポーネントや openOutputと重複することはできません。
コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ
ンティティフロー図上に表示することもできます。
クラス名 ○ カスタムコンポーネントのクラス名です。
「参照」ボタンを押すと、クラス選択ダイアログが表示され、カス
タムコンポーネントとして利用可能なクラスを選択することができ
ます。
6 エンティティフロークラス
77
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
コンストラクタ引数 カスタムコンポーネントのコンストラクタに渡す引数を指定しま
す。入力された文字列はそのままソースに反映されます。引数が複
数の場合は、カンマも含めて入力してください。
※ 変数名を変更してソースを更新した場合、宣言部の変数名は変更されますが、処理のメソッド内で
使用している変数名は変更されませんので、ご注意ください。
④ 処理のコーディング
エンティティフロー編集画面を終了し、テキストエディタで処理をコーディングします。カスタムコン
ポーネントのインスタンスが変数として宣言されているので、それに対してメソッドを呼び出す形になり
ます。
以下は、コーディング例です。
Conversion<SalesEntity, SalesEntity> conversion1 =
new Conversion<SalesEntity, SalesEntity>("conversion1", input1) {
private final Calculator calculator = new Calculator("1.05");
@Override
protected void convert(SalesEntity entity) {
SalesEntity result = new SalesEntity();
result.customerId = entity.customerId;
result.itemCode = entity.itemCode;
result.amount = calculator.calculate(entity.amount);
output(result);
}
};
⑤ カスタムコンポーネントの制約
・ エンティティフロー図で表されているのは、処理とカスタムコンポーネントのインスタンスの関連
です。クラスの関連やメソッド呼び出しではないことに注意してください。
・ 複数の処理でカスタムコンポーネントを共有することはできません。カスタムコンポーネントは処
理のインスタンス変数として利用されるからです。
・ カスタムコンポーネントから他への矢印は引けません。
・ クラスでインスタンス変数を利用する場合は注意が必要です。「6.6.3 処理クラスのインスタンス変
数」を参考にしてください。
6.4.5 エンティティフローの編集の終了
操作パネルの「更新」ボタンを押すと、編集内容をエンティティフロークラスのソースコードに反映してエン
ティティフロー編集画面を閉じます。「キャンセル」ボタンを押すと、ソースコードに反映せずにエンティティ
フロー編集画面を閉じます。
また、エンティティファイル(または処理)をダブルクリックした場合もエンティティフロークラスが更新さ
れます。エンティティフロー編集画面が閉じた後、ソースコードの該当箇所にカーソルが移動します。
6 エンティティフロークラス
78
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
6.4.6 その他の機能
(1) アンドゥ
操作パネルの「編集▼」ボタンを押し、表示されるメニューから「アンドゥ」を選択すると、エンティテ
ィフローの編集操作を取り消すことができます。
例えば、Conversion処理を削除した後にアンドゥを行うと、Conversionが元に戻ります。Ctrl+Zキー
を押してもアンドゥを行うことができます。
(2) リドゥ
操作パネルの「編集▼」ボタンを押し、表示されるメニューから「リドゥ」を選択すると、アンドゥを取
り消すことができます。
例えば、アンドゥでの例の後にリドゥを行うと、再び Conversion処理が削除されます。Ctrl+Yキーを
押してもリドゥを行うことができます。
(3) 全選択
操作パネルの「編集▼」ボタンを押し、表示されるメニューから「全選択」を選択すると、全てのエンテ
ィティファイル(または処理)が選択されます。
Ctrl+Aキーを押しても全選択を行うことができます。
(4) 縮小表示/通常表示
操作パネルの「表示▼」ボタンを押し、表示されるメニューから「縮小表示」を選択すると、エンティテ
ィフロー図が縮小表示されます。
縮小表示後に操作パネルの「表示▼」ボタンを押し、表示されるメニューから「通常表示」を選択すると、
元の表示に戻ります。
(5) エンティティファイルや処理の整列
操作パネルの「表示▼」ボタンを押し、表示されるメニューから「整列」を選択すると、エンティティフ
ァイルや処理が適切な位置に配置し直されます。
エンティティフローの編集操作により、フロー図が見にくくなってしまった場合に使用すると便利です。
6 エンティティフロークラス
79
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(6) MapReduce ジョブ表示
操作パネルの「表示▼」ボタンを押し、表示されるメニューから「MapReduce ジョブを表示」を選択す
ると、エンティティフロー中の処理とMapReduceジョブとの関係を確認することができます。
処理からMapReduceジョブへの変換はフレームワーク内部で行われるため、エンティティフロー図を見
ただけでは分かりません。この機能を利用すると、処理がMapReduceジョブ毎にグループ化されて表示さ
れます。それにより処理とMapReduceジョブとの関係が分かり、パフォーマンスチューニングに役立てる
ことが可能です。
なお、この機能には幾つか注意点があります。
・ フレームワークにエンティティフローを渡すために、エンティティフロークラスのコンパイルが行
われます18。コンパイルのためのコマンドは、「11.5 javacコマンド」で設定します19。
・ 変換されるMapReduceジョブは、エンティティファイルのサイズにより変わる可能性があります
(詳細は「6.7.3 結合方式」を参照してください)。実際のエンティティファイルのサイズに基づい
た MapReduce ジョブを確認するには、getInput にそのサイズを入力しておく必要があります
18 エンティティフロークラスのソースは専用の一時フォルダーに保存され、更新はされません。 19 デフォルトでは「javac」です。
6 エンティティフロークラス
80
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(「6.4.4(1) getInput」を参照してください)。入力されていない場合は、非常に巨大なサイズとし
て処理されます。
・ 処理の追加・編集・削除や入出力の変更を行うと、MapReduceジョブ表示は終了し、MapReduce
ジョブ毎のグループ化枠は消去されます。
(7) SVG 出力
操作パネルの「表示▼」ボタンを押し、表示されるメニューから「SVG出力」を選択すると、表示されて
いるエンティティフロー図を SVG ファイルとして出力することができます。ファイル保存ダイアログが表
示されるので、SVGファイル名を入力してください。
(8) ソースの表示
処理を右クリックし、メニューから「ソースの表示」を選択すると、処理に対応するソースコードが表示
されます。
(9) コメントの表示/非表示
コメントが設定されているエンティティファイルや処理、カスタムコンポーネントを右クリックし、メニ
ューから「コメントを表示」を選択すると、コメント文字列がエンティティフロー図上に表示されます。
6 エンティティフロークラス
81
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
コメントはマウスでドラッグすることにより移動することができます。右クリックメニューから「コメン
トを非表示」を選択すると、コメントは非表示となります(設定されているコメント文字列はそのままです)
20。
6.5 処理の分散
本章では、処理がどのように分散されるかを説明します。エンティティフローの設計・実装時に参考にしてく
ださい。
(1) 概要
Conversionや Groupなどの各処理は、複数のマシン上で分散して実行されます。しかし、ランダムに分
散してしまうと、正しい結果が得られません。そのため、AZAREA-Clusterフレームワークは、正しい結果
が得られつつ最大限分散するように適切なルールで制御しています。
(2) Conversion の分散
Conversion 処理はランダムに分散されます。Conversion 処理では、エンティティ間に関連が無いこと
を前提にしています。
(3) Group の分散
Group処理は 2段階で行われます。
1段階目は、ランダムに分散されます。
2 段階目は、グループ化列により分散されます。すなわち、グループ化列の値が同じエンティティは、必
ず同じマシン上で処理されます。
(4) Sort の分散
Sort処理は分散されません。すなわち、全てのエンティティは単一マシン上で処理されます。
(5) GroupSort の分散
GroupSort処理は、グループ化列により分散されます。すなわち、グループ化列の値が同じエンティティ
20 なお、一旦非表示にした後に再び表示した場合、座標は復元されません。
6 エンティティフロークラス
82
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
は、必ず同じマシン上で処理されます。
(6) Join の分散
Join処理は、エンティティファイルのサイズに応じて、メモリ内で行われる場合とファイルを使用しなが
ら行われる場合とがあります。
前者の場合は、ランダムに分散されます。
後者の場合は、結合列により分散されます。すなわち、結合列の値が同じエンティティは、必ず同じマシ
ン上で処理されます。
(7) UniqueJoin の分散
Joinと同様です。
6.6 処理内容の実装
本章では、処理クラスのメソッド(Conversionクラスの convertメソッドや Groupクラスの doSummarize
メソッドなど)を実装する際に役立つ情報を説明します。
6.6.1 エンティティの操作
(1) 出力エンティティのインスタンス
Group 以外の処理では、入力エンティティを引数に取り、output メソッドにより出力エンティティを出
力します。通常は、出力エンティティを newし、そこに必要なプロパティを設定します。
@Override
protected void convert(CustomerEntity entity) {
ResultEntity result = new ResultEntity();
// 各プロパティを設定する
result.customerCount = xxx;
result.point = xxx;
...
output(result);
}
入力エンティティと出力エンティティのクラスが同じ場合は、引数のインスタンスをそのまま outputに
渡しても構いません。
@Override
protected void convert(CustomerEntity entity) {
// 各プロパティを設定する
entity.customerId = xxx;
entity.registerShopId = xxx;
...
output(entity);
}
outputメソッドでは出力エンティティのインスタンスが複製されます。従って、複数回 outputメソッド
を呼び出す場合、インスタンスを使い回すことができます。
@Override
6 エンティティフロークラス
83
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
protected void convert(CustomerEntity entity) {
ResultEntity result = new ResultEntity();
// 1番目の出力の各プロパティを設定する
result.customerCount = xxx;
result.point = xxx
...
output(result);
// 2番目の出力の各プロパティを設定する
result.customerCount = yyy;
result.point = yyy;
...
output(result);
}
(2) エンティティのプロパティの設定
エンティティクラスのプロパティは publicフィールドとなっているので、そのまま値を設定することが
できます。
result.customerCount = 1;
result.point = entity.point;
copyFrom メソッドでは、同じプロパティ名の列の値をコピーすることができます。列同士で型が異なる
場合は例外が発生します。同じプロパティ名が存在しない列は無視されます。
@Override
protected void convert(CustomerEntity entity) {
CustomerView view = new CustomerView();
view.copyFrom(entity);
/* 以下と同じ
view.customerId = entity.customerId;
view.registerShopId = entity.registerShopId;
view.memo = entity.memo;
*/
view.customerName = xxx;
output(view);
}
cloneEntityメソッドを使用すると、エンティティのインスタンスを複製することができます。
@Override
protected void convert(CustomerEntity entity) {
CustomerEntity another = entity.cloneEntity();
/* 以下と同じ
CustomerEntity another = new CustomerEntity();
another.customerId = entity.customerId;
another.registerShopId = entity.registerShopId;
6 エンティティフロークラス
84
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
another.memo = entity.memo;
*/
...
}
(3) null 値に関する考慮
エンティティファイルのフォーマットでは、空文字列と nullの区別がありません。従って、String型の
プロパティに空文字列を設定しても、次の処理ではnullに変わっている可能性があるので注意が必要です。
そのため、空文字列は使用せず null値のみを使用することを推奨します。
BigDecimal型のプロパティにおいて、null値を考慮して計算すると、以下のようになります。
@Override
protected void doSummarize(SalesEntity summary, SalesEntity another) {
...
if (another.amount != null) {
if (summary.amount != null) {
summary.amount = summary.amount.add(another.amount);
} else {
summary.amount = another.amount;
}
}
}
デフォルト値を 0に定義しておけば、以下のように簡潔になります。
@Override
protected void doSummarize(SalesEntity summary, SalesEntity another) {
summary.amount = summary.amount.add(another.amount);
}
6.6.2 エンティティファイルの直接アクセス
基本的には、エンティティファイルは getInputメソッドにより定義された入力エンティティとして読み込み
ます。しかし、処理内から直接エンティティファイルを読み込みたい場合もあると思います。
そのような場合に利用できるのが、EntityCollection クラスです。EntityCollection は、エンティティ
ファイルに含まれる全てのエンティティをメモリ内に保持21し、いろいろな方法でアクセスすることができます。
EntityCollectionのインスタンスは、以下のようにして取得することができます。
@Override
protected void convert(CustomerEntity customer) {
// TantoEntity型のエンティティファイル TantoEntity.txtを読み込む
EntityCollection<TantoEntity> tantos =
getEntityManager().getEntityCollection(TantoEntity.class);
21 従って、巨大なエンティティファイルを読み込むと OutOfMemoryErrorが発生することに注意してください。
6 エンティティフロークラス
85
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
// BumonEntity型のエンティティファイル BumonMaster.txtを読み込む
EntityCollection<BumonEntity> bumons =
getEntityManager().getEntityCollection(BumonEntity.class,
"BumonMaster.txt");
...
}
なお、getEntityCollectionメソッドで読み込まれたエンティティファイルはフレームワーク内でキャッシ
ュされます。従って、処理の度に getEntityCollectionメソッドを呼び出しても問題ありません。パフォーマ
ンスに関しては、「6.7.4 エンティティファイルの直接アクセス」も参照してください。
EntityCollectionクラスは、以下のメソッドを持ちます。
(1) getAllEntities
引数 説明
-
戻り値 説明
List<エンティティクラス> エンティティファイルに含まれる全てのエンティティ
仕様
エンティティファイルに含まれる全てのエンティティをリストとして取得します。エンティティの順序
は、エンティティファイル内に現れる順序です。
(2) getEntityAt
引数 説明
int index エンティティファイル内のエンティティのインデックス(0始まり)
戻り値 説明
エンティティクラス 指定されたインデックスのエンティティ
仕様
エンティティファイル内から指定されたインデックスのエンティティを取得します。
getAllEntities().get(index)と同じです。
(3) getFirstEntity
引数 説明
-
戻り値 説明
エンティティクラス エンティティファイル内の先頭のエンティティ
仕様
エンティティファイル内の先頭のエンティティを取得します。エンティティが 1つも無い場合は nullを
返します。基本的には、エンティティファイル内に 1つしかエンティティが無い場合に利用します。
(4) getEntity
引数 説明
Object... keyValue
s
各キーの値を配列で指定
6 エンティティフロークラス
86
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
戻り値 説明
エンティティクラス 指定されたキーの値のエンティティ。存在しない場合は null。
仕様
指定されたキーの値を持つエンティティを取得します。そのようなエンティティが存在しない場合は
nullが返されます。キー列は、エンティティのスキーマで定義されます(「5.4 スキーマの定義」を参照
してください)。
キーの値の数や型が、スキーマ定義と合わない場合は例外が発生します。
同じキーの値を持つエンティティが複数存在する場合は、getEntityCollectionメソッドの時点で例外
が発生します。
(5) getEntities(Object[])
引数 説明
Object... keyValues キーの一部の値を配列で指定
戻り値 説明
List<エンティティクラス> 指定されたキーの値のエンティティのリスト。
仕様
キーの値を先頭から部分的に指定し(例えばキーが支社コードと部門コードと担当者コードであれば、
支社コードと部門コードを指定)、該当するエンティティのリストを取得します。エンティティの順序は、
残りのキーの順序になります(先ほどの例では、担当者コード順)。
キー列は、エンティティのスキーマで定義されます(「5.4 スキーマの定義」を参照してください)。
(6) getEntities(String[], Object[])
引数 説明
String[] columnNames 列名の配列
Object[] columnValues 列の値の配列
戻り値 説明
List<エンティティクラス> 指定された値を持つエンティティのリスト。
仕様
列名と列の値を指定し、該当するエンティティのリストを取得します。エンティティの順序は、エンテ
ィティファイル内に現れる順序です。
列名と列の値の数が異なる場合や、列の値の型がスキーマ定義と合わない場合は、例外が発生します。
EntityCollectionのサンプルは、「12.7 Conversionと openOutput、getEntityCollectionのサンプル」を
参照してください。
6.6.3 処理クラスのインスタンス変数
基本的に、処理クラスには finalでないインスタンス変数を持つことを許容していません22。処理のインスタ
ンスはソースコード上では 1 つに見えますが、実際には分散されて複数のインスタンスになる可能性がありま
す(詳細は「6.5 処理の分散」を参照してください)。そのような場合、インスタンス変数は予想外の値になっ
てしまいます。
しかし、例外的に Sortクラスと GroupSortクラスはインスタンス変数を持つことを許容しています。それ
22 フレームワークによりチェックされて例外が投げられます。
6 エンティティフロークラス
87
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
は、処理とマシンとの関係が明確になっているからです。
Sort処理は必ず単一マシン上で行われます。従って、インスタンス変数は先頭のエンティティから最後のエ
ンティティまで共有されます。
GroupSort 処理では、同一グループ内のエンティティは必ず同一マシン上で処理されます。従って、インス
タンス変数は少なくとも同一グループ内で共有されます。基本的な使い方としては、グループの先頭で初期化し、
グループ内で必要に応じて更新します。以下は、顧客毎に売上金額の多い順に順位を付ける処理の例です。
GroupSort<SalesEntity, SalesOrderEntity> sort =
new GroupSort<SalesEntity, SalesOrderEntity>(sales,
"customerCode",
GroupSort.DELIMITER,
"amount DESC") {
// 順位をインスタンス変数として宣言する
private int order;
@Override
protected void merge(SalesEntity entity, boolean isFirst, boolean isLast) {
if (isFirst) {
// 顧客毎に順位を初期化する
order = 1;
}
SalesOrderEntity output = new SalesOrderEntity();
output.copyFrom(entity);
// 順位を付加する
output.order = order++;
output(output);
}
};
GroupSortインスタンスとそこで処理されるエンティティの関係は、以下のようなイメージになります。
6 エンティティフロークラス
88
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
6.6.4 アプリケーションコンテキスト
6.6.4.1 概要
アプリケーション起動時の日時や、アプリケーションに渡された引数など、アプリケーション全体で情報を
共有したい場合があると思います。そのための仕組みとして、「アプリケーションコンテキスト」というものの
を用意しています。アプリケーションコンテキストは、アプリケーションの起動時に初期化され、エンティテ
ィフローや各処理から参照することができます(処理から更新することはできません)。
アプリケーションコンテキストのサンプルは、「12.9 Join、UnionとApplicationContextのサンプル」を参
照してください。
6.6.4.2 アプリケーションコンテキストの初期化
アプリケーションコンテキストの初期化は、アプリケーションクラスで行います。具体的には、以下のメソ
ッドをオーバーライドします。
protected void initializeContext(List<String> args) throws IOException
GroupSortインスタンス GroupSortインスタンス GroupSortインスタンス
顧客コード=C1
売上金額=5000
顧客コード=C1
売上金額=4000
顧客コード=C4
売上金額=6000
顧客コード=C2
売上金額=3000
顧客コード=C2
売上金額=2000
顧客コード=C2
売上金額=1500
顧客コード=C3
売上金額=4000
顧客コード=C3
売上金額=2500
顧客コード=C5
売上金額=3500
顧客コード=C4
売上金額=2000
マシン1 マシン2 マシン3
アプリケーション
アプリケーションコンテキスト
エンティティフロー
処理
初期化 参照
6 エンティティフロークラス
89
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
引数 args は、アプリケーション引数です(詳細は「7.5 アプリケーション引数」を参照してください)。
getApplicationContextメソッドにより ApplicationContextクラスのインスタンスを取得して、アプリケ
ーションコンテキストを初期化することができます。ApplicationContextクラスのメソッド仕様は以下の通
りです。
(1) setStartDate
引数 説明
Date startDate アプリケーションの開始日時を指定します。
戻り値 説明
- -
仕様
アプリケーションの開始日時を指定します。デフォルトでは、アプリケーション起動時のマシン日時が
設定されています。テスト時など、実際のマシン日時と異なる日時を指定したい場合に使用します。
設定した値は「6.6.4.3(1) getStartDate」で取得することができます。
(2) setXXX
キーを指定して値を設定することができます。設定した値は「6.6.4.3(3) getXXX」で取得することができ
ます。値の型毎に以下のメソッドが用意されています。
public void setString(String key, String value)
public void setInt(String key, int value)
public void setLong(String key, long value)
public void setBigDecimal(String key, BigDecimal value)
public void setDate(String key, Date value)
public void setBoolean(String key, boolean value)
public void setObject(String key, Object value)
6.6.4.3 アプリケーションコンテキストの参照
エンティティフローや処理から、アプリケーションコンテキストを参照することができます。エンティティ
フローや処理クラスの getApplicationContextメソッドを呼び出すことにより、ApplicationContextイン
スタンスを取得することができます。アプリケーションコンテキストを参照するためのメソッドの仕様は以下
の通りです。
(1) getStartDate
引数 説明
-
戻り値 説明
Date アプリケーションの開始日時が返されます。
仕様
「6.6.4.2(1) setStartDate」で設定されたアプリケーションの開始日時を取得します。
(2) getApplicationArgs
引数 説明
-
6 エンティティフロークラス
90
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
戻り値 説明
List<String> アプリケーション引数が返されます。
仕様
アプリケーション引数を取得します。アプリケーション引数については「7.5 アプリケーション引数」を
参照してください。
なお、このメソッドにより返される値は initializeContextメソッド(「6.6.4.2 アプリケーションコン
テキストの初期化」参照)の引数と同じです。
(3) getXXX
「6.6.4.2(2) setXXX」で設定された値を取得することができます。値の型毎に以下のメソッドが用意され
ています。
public String getString(String key)
public int getInt(String key)
public lonog getLong(String key)
public BigDecimal getBigDecimal(String key)
public Date getDate(String key)
public boolean getBoolean(String key)
public Object getObject(String key)
値が設定されていなかった場合は、その型におけるデフォルト値(例えば intであれば 0)が返されます。
(4) getKeys
引数 説明
-
戻り値 説明
Set<String> setXXXメソッドにより指定されたキーの集合が返されます。
仕様
「6.6.4.2(2) setXXX」で指定されたキーの集合が返されます。
6.7 パフォーマンスに関する考慮
6.7.1 早目にファイルサイズを小さくする
ファイルのサイズが大きいほど処理に時間が掛かります。従って、なるべく早いうちにファイルサイズが小さ
くなる処理を行うとパフォーマンスが向上します。
例えば、「売上を金額順に並べる処理(Sort)」と「今月の売上を抽出する処理(Conversion)」があるとし
ます。先に Sortを行う場合は、全売上が Sortへの入力となります23。しかし、先に Conversionを行えば、
今月の売上だけが Sortへの入力となり、高速化します24。
23 この場合は、Mapperは処理なし、Reducerでは Sortと Conversionを行います。MapperからReducerに全売上が渡され
ることになります。 24 この場合は、Mapperでは Conversion、Reducerでは Sortを行います。MapperからReducerに渡されるのは今月の売上
だけになります。
6 エンティティフロークラス
91
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
不要な列を早めに除去してしまう方法も有効です。エンティティA(列A1, A2, …A10)とエンティティB(列
B1, B2)を結合し、エンティティC(列A1(=B1), A2, B2)を出力する例を考えます。そのまま結合すると、結
合処理への入力は 10 列のエンティティ A と 2 列のエンティティ B です25。しかし、先にエンティティ A’(列
A1, A2)に変換処理してから結合すれば、結合処理への入力は 2列のエンティティA’と 2列のエンティティB
となり、高速化します26。
25 この場合は、Mapperは処理なし、Reducerでは Joinを行います。MapperからReducerにエンティティA(10列)とエンテ
ィティB(2列)が渡されることになります。 26 この場合は、Mapperでは Conversion、Reducerでは Joinを行います。MapperからReducerにエンティティA’(2列)とエ
ンティティB(2列)が渡されることになります。Conversion処理に掛かる時間は、MapperとReducer間のエンティティの転
送時間に比べれば、十分に小さいです。
Join
Conversion
Join
A(10列)
A(10列)
B(2列) B(2列)
A’(2列)
C(3列)
C(3列)
Sort
Conversion
Conversion
Sort
全売上
全売上
全売上
今月の売上
今月の売上
今月の売上
6 エンティティフロークラス
92
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
6.7.2 余計なファイルを出力しない
AZAREA-Cluster フレームワークは、なるべくファイルを出力しないで済むように最適化を行います。しか
し、setOutput で定義されている場合は、必ずファイルを出力しなければなりません。従って、必要の無い
setOutputは避けるようにしてください。
必ずしもファイルを出力する必要は無く、エンティティフロー間で引き継ぎたいだけの場合は、「中間出力」
を使用してください(「6.4.4(3) setOutput」を参照してください)。
6.7.3 結合方式
結合方式には、メモリ内で行う方式と、中間ファイルを使用して行う方式の 2 つがあります。当然、前者の
方が高速です。入力エンティティファイルと結合エンティティファイルのうち、結合エンティティファイルが十
分に小さい場合のみ、メモリ内で結合される可能性があります(その閾値は 1MBですが、「10.3 Hadoopコマ
ンドでの実行」に記述されている方法により変更することも可能です)。
但し、フレームワークはアプリケーション開始時にファイルサイズを推測して27最適化を行うため、不適切な
方式で処理を行ってしまう可能性があります。そのような場合のために、強制的にメモリ内で結合する、あるい
は中間ファイルを使用して結合することを指示するメソッドがあります。それぞれ forceInMemoryJoin と
forceFileJoinで、Joinクラスの初期化時に呼び出します。
Join<SalesEntity, CustomerEntity, ResultEntity> join
= new Join<SalesEntity, CustomerEntity, SalesEntity>(sales,
customer,
"customerId") {
{
forceInMemoryJoin();
}
@Override
protected void merge(SalesEntity main, List<CustomerInterestEntity> subs) {
...
}
};
6.7.4 エンティティファイルの直接アクセス
エンティティファイルのサイズが小さい場合は、getInputで入力するのではなく、「6.6.2 エンティティファ
イルの直接アクセス」で示した方法で直接アクセスした方が効率的です。但し、この方法には以下のような問題
があります。
・ ファイルサイズが大きいと OutOfMemoryErrorが発生するため、小さい場合にしか使えません。目
安としては数MB以下です28。
・ 従って、将来データ量が増えた場合、アプリケーションを修正する必要があります。
・ getInput によるエンティティファイルの入力と、エンティティファイルの直接アクセスが混在す
ることにより、アプリケーションが分かりにくくなる恐れがあります。
27 エンティティファイルをそのまま結合する場合は正確にサイズが分かりますが、処理結果を結合する場合は推測する必要があ
ります。 28 Javaのヒープサイズやアプリケーションの処理内容等によって変わります。
6 エンティティフロークラス
93
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
また、エンティティファイルに直接アクセスするタイミングについても、注意が必要です。エンティティフロ
ークラスは、以下のような構造になっています。
@Override
protected void initialize() {
① ...
...
Conversion<EntityA, EntityB> conversion
= new Conversion<EntityA, EntityB>(...) {
② private final XXX xxx = xxx;
...
③
@Override
protected void doPrepare() {
...
}
④
@Override
protected void convert(EntityA entity) {
...
}
};
① ...
...
}
エンティティファイルに直接アクセス可能な場所は、上記の①~④です。分かり易い方から説明すると、③は
実際に処理が開始される前に 1度だけ呼ばれます。④はエンティティ毎に呼ばれます。
①と②は注意が必要です。フレームワークは、アプリケーションの初期化時に initialize メソッドを呼び
出します(そこで①と②が実行されます)。また、initializeメソッドは「6.4.6(6) MapReduceジョブ表示」
でも呼ばれます。このときは、エンティティファイルの場所が指定されないため、必ず EntityCollectionが
空になります。従って、EntityCollectionが空でも例外が発生しないようにしないと、MapReduceジョブ表
示機能が動作しません。
まとめると、下表のようになります。
No. 説明 実行されるタイミング
① initializeメソッドの本体 アプリケーションの初期化時に数回、処理の開始前にも呼
ばれる
「6.4.6(6) MapReduceジョブ表示」でも呼ばれる
② 処理のインスタンス変数の初期化部
③ 処理の doPrepareメソッド 処理の開始前に 1度だけ呼ばれる
④ 処理メソッド エンティティ毎に呼ばれる
EntityCollection はフレームワーク内でキャッシュされていますが、それでもアプリケーション側でキャ
ッシュしたい場合もあると思います。
そのような場合、小さなエンティティファイルであれば、①あるいは②でキャッシュしてよいでしょう。キャ
ッシュを複数の処理で使用するのであれば①、特定の処理だけで使用するのであれば②が妥当です。
比較的大きなエンティティファイルであれば、③でキャッシュすべきです。
6 エンティティフロークラス
94
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
@Override
protected void initialize() {
// コード定義
CodeEntity code =
getEntityManager().getEntityCollection(CodeEntity.class).getFirstEntity();
...
Conversion<XEntity, YEntity> conversion = new Conversion<XEntity, YEntity>(...) {
// 閾値
private final ThresholdEntity threshold = getEntityManager()
.getEntityCollection(ThresholdEntity.class).getFirstEntity();
@Override
protected void convert(XEntity entity) {
if (entity.amount.compareTo(threshold.amount) < 0) {
YEntity result = new YEntity();
result.code = code.yyyCode;
...
}
}
};
Sort<YEntity, ZEntity> sort = new Sort<YEntity, ZEntity>(conversion, ...) {
// 優良顧客の ID
private final Set<String> preferredCustomerIds = new HashSet<String>();
@Override
protected void doPrepare() {
// 顧客エンティティから優良顧客のリストを作成する
for (CustomerEntity customer
: getEntityManager().getEntityCollection(CustomerEntity.class) {
if (customer.preferred.equals("1")) {
preferredCustomerIds.add(customer.customerId);
}
}
}
@Override
protected void merge(YEntity entity) {
ZEntity result = new ZEntity();
if (preferredCustomerIds.contains(entity.customerId) {
result.code = code.zzzCode1;
} else {
result.code = code.zzzCode2;
}
6 エンティティフロークラス
95
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
...
}
};
...
}
6.7.5 グループ化処理
グループ化して集計する処理を行いたいとき、Group でも GroupSort でも実現できる場合があります29。そ
のような場合は、Groupを利用した方が GroupSortよりも高速になります。
Groupでは、Mapper側で一次集計してからReducer側で集計します。それに対し GroupSortでは、Reducer
側だけで集計します。従って、Groupの方がMapperからReducerへのデータ転送量が小さくなるため、高速
になります。
6.8 テスト
「9 エンティティフローやアプリケーションのテスト」を参照してください。
6.9 Hadoop 上での実行
「10 エンティティフローやアプリケーションの実行」を参照してください。
29 例えば、日付毎に売上の最大値を求める場合です。Groupを使う場合は、日付でグループ化して売上の最大値を求めます。
GroupSortを使う場合は、日付でグループ化した上で売上でソートすることにより求められます。
Reducer
Mapper
Group
Group
Mapper
Reducer
GroupSort
7 アプリケーションクラス
96
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
7 アプリケーションクラス
7.1 概要
アプリケーションクラスとは、その名の通り、Hadoop 上で実行されるアプリケーションとなるクラスです。
アプリケーションクラスは、複数のエンティティフローを連結して実行することができます。その際、あるエン
ティティフローからの出力エンティティファイルは、それ以降のエンティティフローで入力エンティティファイ
ルとして使用することができます。
複雑なアプリケーションを開発する際は、適切にエンティティフローを分割することにより、効率よく開発す
ることができます。
その他にも、アプリケーションクラスは以下のような役割を持ちます。
・ コマンドラインから渡されたアプリケーション引数の処理
・ エンティティファイルのフォーマットのカスタマイズ
・ アプリケーションコンテキストの初期化
7.2 アプリケーションクラスの構成
アプリケーションクラスは、フレームワークの EntityFlowManager クラスを継承します。
initializeEntityFlowメソッドをオーバーライドし、その中で EntityFlowクラスのインスタンスを生成しま
す。
また、アプリケーションクラスは EntityFlowインスタンスをHadoopの Jobクラスのインスタンスに変換し
ます(Jobインスタンスは、HadoopのMapReduceジョブの単位となります)。そして、それをHadoop上で実
行します。
なお、EntityFlow インスタンスと Job インスタンスは必ずしも(というより多くの場合)一対一では対応し
ません。
アプリケーションクラス
エンティティ
ファイル
エンティティ
ファイル
エンティティ
ファイル
エンティティ
フロー
エンティティ
フロー
エンティティ
ファイル
7 アプリケーションクラス
97
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
7.3 新規アプリケーションクラスの作成
新規アプリケーションを作成するには、パッケージエクスプローラでパッケージを右クリックし、メニューか
ら「AZAREA-Cluster」→「新規アプリケーションを作成」を選択します。すると、新規アプリケーション作成
画面が開きます。
そこでクラス名を入力すると、空のアプリケーションクラスが作成されます。そして、すぐにアプリケーショ
ン編集画面が開きます。
7.4 アプリケーションの編集
パッケージエクスプローラでアプリケーションクラスを選択し、ツールバーのアイコン をクリックするか、
右クリックメニューから「AZAREA-Cluster」→「クラスを編集」を選択します。すると、アプリケーション編
集画面が開きます。
EntityFlowManager
アプリケーションクラス
EntityFlow
#initializeEntityFlow() : void
#initializeEntityFlow() : void
<<hadoop>>
Job
7 アプリケーションクラス
98
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 説明
「更新」ボタン 編集内容をアプリケーションクラスに反映し、アプリケーション編集画
面を終了します。
「キャンセル」ボタン 編集内容をアプリケーションクラスに反映せずに、アプリケーション編
集画面を終了します。
「フロー図を表示」ボタン アプリケーション全体のエンティティフロー図を表示します。
「✚」ボタン エンティティフロー選択画面が開きます。そこで選択したエンティティ
フローが追加されます。
「↑」ボタン 選択されているエンティティフローを 1つ上に移動します。
「↓」ボタン 選択されているエンティティフローを 1つ下に移動します。
「✖」ボタン 選択されているエンティティフローを削除します。
エンティティフロー選択画面は以下の通りです。パッケージを選択すると、そのパッケージ直下のエンティテ
ィフロークラスが一覧表示されるので、そこから追加したいものを選択します。
7 アプリケーションクラス
99
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
「フロー図を表示」ボタンで表示される画面は以下のようになります。この画面では、3 種類の図を表示する
ことができます。
「概要フロー」では、エンティティフロークラス単位での入出力をフロー図として表示します。個別の処理や、
エンティティフロークラス内での入出力は、フロー図には現れません。
「詳細フロー」では、各エンティティフロークラスのエンティティフロー図を連結して表示します。エンティ
ティファイルや処理はエンティティフロークラス毎にグループ化されます。
「MapReduceジョブを表示」を選択すると、MapReduceジョブ毎にグループ化されて表示されます(「6.4.6(6)
MapReduceジョブ表示」と同様です)。その際、必要に応じてアプリケーション引数を入力することもできます。
「通常表示」または「縮小表示」を選択することにより、通常表示と縮小表示を切り替えることができます
(「6.4.6(4) 縮小表示/通常表示」と同様です)。「SVG出力」ボタンを押すと、エンティティフロー図を SVGフ
ァイルとして出力することができます(「6.4.6(7) SVG出力」と同様です)。
7 アプリケーションクラス
100
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
アプリケーションクラスは比較的単純なため、アプリケーション編集画面を使用せずにテキストエディタで編
集してもよいでしょう。その場合は、initializeEntityFlowメソッドを以下のように実装します。
@Override
protected void initilizeEntityFlow() {
addEntityFlow(new FirstEntityFlow());
addEntityFlow(new SecondEntityFlow());
...
}
addEntityFlowメソッドは、アプリケーションクラスにエンティティフローを追加するメソッドです。エンテ
ィティフロークラスのインスタンスを生成して渡してください。
7.5 アプリケーション引数
Hadoop コマンド実行時にアプリケーション引数を指定し、それをアプリケーションクラスで受け取ることが
できます(Hadoopコマンドについては「10.3 Hadoopコマンドでの実行」を参照してください)。
7 アプリケーションクラス
101
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
アプリケーション引数は以下のメソッドに渡されます。
protected void initializeContext(List<String> args) throws IOException
アプリケーションクラスではこのメソッドをオーバーライドし、まずアプリケーション引数のチェックを行っ
てください。アプリケーション引数が誤っている場合は、IllegalArgumentExceptionを投げてください。
チェック済みのアプリケーション引数は、「7.6 エンティティファイルのフォーマットのカスタマイズ」の処理
や「7.7 アプリケーションコンテキストの初期化」の処理で利用することができます。また、「6.6.4.3 アプリケ
ーションコンテキストの参照」で説明されているように、アプリケーションコンテキストから取得することも可
能です。
アプリケーション引数のサンプルは、「12.9 Join、UnionとApplicationContextのサンプル」を参照してくだ
さい。
7.6 エンティティファイルのフォーマットのカスタマイズ
initializeContextメソッドをオーバーライドし、エンティティファイルのフォーマットをカスタマイズする
ことができます。詳細は「5.7 エンティティファイルのフォーマットのカスタマイズ」を参照してください。
7.7 アプリケーションコンテキストの初期化
initializeContextメソッドをオーバーライドし、アプリケーションコンテキストを初期化することができま
す。詳細は「6.6.4.2 アプリケーションコンテキストの初期化」を参照してください。
7.8 テスト
「9 エンティティフローやアプリケーションのテスト」を参照してください。
7.9 Hadoop 上での実行
「10 エンティティフローやアプリケーションの実行」を参照してください。
8 データベース連携とオンライン連携
102
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
8 データベース連携とオンライン連携
8.1 データベース連携の概要
AZAREA-Clusterで処理するデータは、基本的にはテキストファイルです。しかし、データベース上のデータ
を処理したい場合も多々あると思います。そのような場合には 2通りの方法があります。
(1) テキストファイルに変換して処理する
AZAREA-Clusterが提供する変換ツールなどを利用し、データベースからテキストファイルにエクスポー
トします。AZAREA-Clusterで処理後、テキストファイルをデータベースにインポートします。
(2) データベースを直接参照する
テキストファイルに加えて、データベース中のレコードも入力として使用します。AZAREA-Cluster内か
ら SQL を発行し、取得したレコードを入力エンティティに変換します。エンティティフロー側からは、入
力元がテキストファイルかデータベースかの区別はありません。
データ量が大きい場合は、(1)の方法を使用してください。データ量が小さい場合は、(2)の方法を使用すると高
速になることがあります。特に、多数のレコード中から少数のレコードのみを処理するような場合は、(2)の方が
高速になる可能性が高いです。
テキスト
ファイル
DB
テキスト
ファイル AZAREA-Cluster
Hadoop
テキスト
ファイル
DB
テキスト
ファイル AZAREA-Cluster
Hadoop
変換ツール 変換ツール
8 データベース連携とオンライン連携
103
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
なお、対応しているデータベース製品は以下の通りです。
データベース製品 確認済みのバージョン 備考
Oracle 11g Release 2 Thinドライバのみ対応
SQL Server 2008 R2
MySQL 5.5
8.2 オンライン連携の概要
同一のビジネスロジックをデータ量に応じてオンラインで同期実行したりバッチで非同期実行したりしたい、
という場合があると思います。そのような場合には、AZAREA-Cluster アプリケーションを Web アプリケーシ
ョンなどから直接的に呼び出すことができます。
オンライン連携では、呼び出し元アプリケーションと同じ Java VM上でAZAREA-Clusterアプリケーション
を実行します。従って、呼び出しのオーバーヘッドが小さく、高速です。
呼び出し元アプリケーションは、AZAREA-Clusterアプリケーションに入力エンティティを渡し、実行後に出
力エンティティを受け取ります。エンティティの受け渡しは、メモリ経由でもデータベース経由でも行うことが
できます。データベースを使用する場合は、Spring Frameworkによりデータベース接続やトランザクションを
共有することができます。
8.3 データベースからのエンティティクラスの生成
8.3.1 概要
データベース上のデータをAZAREA-Clusterで処理するには、データに対応するエンティティクラスを用意
する必要があります。
「5.5 エンティティクラスの生成」に記述されているようにExcelファイルや画面によりエンティティクラス
DB
AZAREA-Cluster
Java VM
Webアプリケーションサーバ
Webアプリケーション
エンティティ
エンティティ
8 データベース連携とオンライン連携
104
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
を生成することもできますが、データベースから直接エンティティクラスを生成することもできます。本章では、
その方法について説明します。
8.3.2 設定ファイルの準備
データベースからエンティティクラスを生成するには、「データベーステキスト変換ツール」に準拠したプロ
パティファイルを準備します。プロパティファイルの完全な仕様は「データベーステキスト変換ツール」の説明
書に記載されていますが、ここではAZAREA-Clusterで必要な部分のみを説明します。
(1) プロパティファイルの構成
プロパティファイルは 3種類のものから成ります。データベースの接続情報などを記述する環境設定ファ
イル、テーブルとエンティティとの関係を記述するタスク設定ファイル、そしてこれらをまとめるジョブ設
定ファイルです。
(2) 環境設定ファイルの仕様
環境設定ファイルには、データベースの接続情報を複数記述することができます。データベースの接続情
報は、タスク設定ファイルから参照します。
プロパティのキー 必須 説明
common.type ○ 「env」固定です。大文字/小文字は区別しません。
dbconfig.<接続名>.dbms ○ データベースの製品名です。
「MySQL」または「Oracle」または「SQLServer」に
対応しています。大文字/小文字は区別しません。
dbconfig.<接続名>.hostName ○ データベースのサーバ名または IPアドレスです。
dbconfig.<接続名>.port データベースのポート番号です。
省略した場合は、データベース製品におけるデフォル
トのポート番号が使用されます。
dbconfig.<接続名>.dbName ○ データベース名です。
dbconfig.<接続名>.schema スキーマ名です。
dbconfig.<接続名>.userId データベースに接続するユーザ IDです。
dbconfig.<接続名>.password データベースに接続するパスワードです。
接続名は任意の文字列です。複数の接続名を使用することにより、複数のデータベース接続情報を定義す
ジョブ設定
ファイル
環境設定
ファイル
タスク設定
ファイル
データベース接続情報
を参照
8 データベース連携とオンライン連携
105
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
ることができます。接続名はタスク設定ファイルから参照します。
以下は、プロパティファイルの記述例です。
common.type=env
dbconfig.db1.dbms=MySQL
dbconfig.db1.hostName=AZSERVER
dbconfig.db1.dbName=AZAREA
dbconfig.db1.userId=azuser
dbconfig.db1.password=xxxxxx
(3) タスク設定ファイルの仕様
タスク設定ファイルには、テーブルあるいは SQLとエンティティファイルとの関係を記述します。
プロパティのキー 必須 説明
common.type ○ 「task」固定です。大文字/小文字は区別しません。
flow.direction ○ データベースからエンティティへの変換を定義する場
合は「export」、エンティティからデータベースへの変
換を定義する場合は「import」を指定します。大文字
/小文字は区別しません。
common.dbconfig ○ 環境設定ファイルで定義した接続名を指定します。
common.textFileName ○ エンティティファイル名を指定します。
common.tableName データベースのテーブル名を指定します。
「export」の場合は、テーブル名の代りに SQLを指定
することもできます。「import」の場合は、テーブル名
は必須です。
export.sql データベースからレコードを取得するためのSQLを指
定します。パラメータ付 SQL「8.5.5 パラメータ付
SQL」を使用することもできます。
「export」の場合のみ有効です。
import.writeMode データベースにレコードを挿入する際の方式です。
「import」の場合に限り、以下のいずれかを指定して
ください。大文字/小文字は区別しません。
値 説明
drop 事前にテーブルの全レコードを削
除します。
overWrite 同一キーのレコードがある場合は、
上書きします。
ignore 同一キーのレコードがある場合は、
スキップします。
以下は、プロパティファイルの記述例です。
common.type=task
flow.direction=export
common.dbconfig=db1
8 データベース連携とオンライン連携
106
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
common.textFileName=TantoEntity.txt
export.sql=SELECT * FROM TANTO WHERE DELETED=’0’
common.type=task
flow.direction=import
common.dbconfig=db1
common.textFileName=TantoView.txt
common.tableName=TANTO_VIEW
import.writeMode=drop
(4) ジョブ設定ファイルの仕様
ジョブ設定ファイルは、環境設定ファイルとタスク設定ファイルを実行単位でまとめたものです。通常は、
アプリケーション毎に、開始時のエクスポート(データベース→エンティティ)用ファイルと終了時のイン
ポート(データベース←エンティティ)用ファイルの 2ファイルを作成します。
プロパティのキー 必須 説明
common.type ○ 「job」固定です。大文字/小文字は区別しません。
file.env ○ 環境設定ファイル名を指定します。
ジョブ設定ファイルからの相対パスで指定することも
可能です。
file.task.<番号> ○ タスク設定ファイル名を指定します。
番号は任意の数字です。異なる番号により複数のタス
ク設定ファイルを指定することができます(連番で無
くても構いません)。
ジョブ設定ファイルからの相対パスで指定することも
可能です。
以下は、プロパティファイルの記述例です。
common.type=job
file.env=mysql.properties
file.task.1=tanto.properties
file.task.2=bumon.properties
8.3.3 データベースからのエンティティクラスの生成方法
まず、データベースに対応する JDBC ドライバをビルド・パスに追加しておきます。そして、パッケージエ
クスプローラ上で環境設定ファイルまたはジョブ設定ファイルを右クリックし、メニューから
「AZAREA-Cluster」→「エンティティクラスを生成する」を選択します。
環境設定ファイルの場合は、テーブル選択ダイアログが表示されるので、そこでテーブルを選択します。する
と、選択されたテーブルがエンティティクラスに変換されます。エンティティクラス名はテーブル名から、エン
ティティの列名はデータベースの列名から変換されます30。エンティティクラスのパッケージは、「11.3 デフォ
ルトパッケージ」で設定されているデフォルトパッケージとなります。設定されていない場合は、プロパティフ
ァイルの場所に対応するパッケージとなります。
30 先頭は大文字、2文字目以降は小文字に変換されます。アンダーバーがある場合は取り除かれ、その次の文字が大文字に変換
されます。
8 データベース連携とオンライン連携
107
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
ジョブ設定ファイルの場合は、関連するタスク設定ファイルに記述されている各テーブルが変換されます(テ
ーブルではなく SQL が記述されている場合は無視されます)。エンティティクラス名は、テキストファイル名
から拡張子を除いたものになります。
8.3.4 データベースの列の型とエンティティの列の型とのマッピング
ここでは、データベースの列の型とエンティティの列の型のマッピングを説明します。表に無い型について
は、結果は保証されませんので、ご注意ください31。
DECIMAL型や NUMBER型などの数値型については、桁数に応じて BigDecimal型に変換されるか int型に変
換するかが決まります。具体的には、小数部桁数が 0かつ整数部桁数が「11.4 DBの数値型を int型に変換する
桁数」で設定された桁数以下であれば int型、そうでなければ BigDecimal型に変換されます。なお、デフォ
ルトでは 0が設定されているので全て BigDecimal型に変換されます。
(1) MySQL における型マッピング
データベースの型 説明 エンティティの列の型
CHAR 固定長文字列 String
VARCHAR 可変長文字列
TEXT 大容量の可変長文字列
BOOL 真偽値 int
BOOLEAN
TINYINT 8ビット整数
SMALLINT 16ビット整数
INT 32ビット整数
INTEGER
BIGINT 64ビット整数 long
FLOAT 32ビット浮動小数点数 double
DOUBLE 64ビット浮動小数点数
DECIMAL 数値 BigDecimalまたは int
DATE 日付 Date
TIME 時刻
DATETIME 日時
TIMESTAMP 日時
YEAR 年
なお、YEAR型についてはデータベースからエンティティに変換することはできますが、エンティティから
データベースに正しく変換することはできません。従って、参照専用として使用するようにしてください。
(2) Oracle における型マッピング
データベースの型 説明 エンティティの列の型
CHAR 固定長文字列 String
NCHAR 固定長Unicode文字列
VARCHAR2 可変長文字列
31 何らかの型のエンティティ列が生成される場合もありますが、エンティティ列が生成されない場合もあります。
8 データベース連携とオンライン連携
108
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
NVARCHAR2 可変長Unicode文字列
NUMBER 数値 BigDecimalまたは int
DATE 日付 Date
TIMESTAMP 日時
(3) SQL Server における型マッピング
データベースの型 説明 エンティティの列の型
CHAR 固定長文字列 String
NCHAR 固定長Unicode文字列
VARCHAR 可変長文字列
NVARCHAR 可変長Unicode文字列
TEXT 大容量の可変長文字列
NTEXT 大容量の可変長Unicode文字列
XML XMLデータ
BIT 1または 0または NULL int
TINYINT 8ビット整数
SMALLINT 16ビット整数
INT 32ビット整数
BIGINT 64ビット整数 long
REAL 32ビット浮動小数点数 double
FLOAT 32~64ビット浮動小数点数
DECIMAL 数値 BigDecimalまたは int
NUMERIC
SMALLMONEY 金銭や通貨の値(32ビット)
MONEY 金銭や通貨の値(64ビット)
DATE 日付 Date
TIME 時刻
DATETIME 日時
DATETIME2 日時
SMALLDATETIME 日時
なお SQL Serverでは、テーブルの列にデフォルト値を設定してもエンティティの列のデフォルト値には
反映されません。SQL Serverの JDBCドライバがデフォルト値を返さないためです。
8.3.5 データベースとエンティティとの値の変換
データベースとエンティティとの間の値の変換には、不可逆なものがあります。ここではそれについて説明し
ます。
(1) 空文字列の変換
データベースの空文字列をエンティティに変換すると nullになります。逆にエンティティの nullをデー
タベースに変換しても空文字列には戻らず、nullとなります。
(2) 数値型のNULL 値の変換
nullが無い数値型(int、long、double)については、データベースの NULL値をエンティティに変換す
8 データベース連携とオンライン連携
109
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
ると 0になります。逆にエンティティの 0をデータベースに変換しても NULL値には戻らず、0となります。
(3) Date 型の値の変換
エンティティの Date型の精度はミリ秒単位のため、ミリ秒未満の値は失われます。
8.4 データベーステキスト変換ツール
AZAREA-Clusterでは、データベースとテキストファイルとの変換を行うために「データベーステキスト変換
ツール」を提供しています32。詳細は「データベーステキスト変換ツール」の説明書に記載されていますので、こ
こでは概要のみ説明します。
(1) エクスポート機能(データベース→テキストファイル)
指定されたテーブルの全レコードをタブ区切りテキストファイルに変換することができます。
SELECT文を指定し、その結果をタブ区切りテキストファイルに変換することもできます。
(2) インポート機能(データベース←テキストファイル)
タブ区切りテキストファイルの内容を指定されたテーブルに反映します。レコードの挿入方法は以下の 3
通りから選択できます。
・ テーブルを空にした後、各レコードを INSERTする
・ PKが同じレコードが既に存在する場合はUPDATEし、そうでない場合は INSERTする33
・ PKが同じレコードが既に存在する場合はスキップし、そうでない場合のみ INSERTする
8.5 データベースの直接参照
8.5.1 概要
AZAREA-Clusterでは、データベースをエンティティとして参照するための機構を提供しています。
アプリケーションでは、データベースとエンティティとのマッピングを定義します。フレームワークは、その
定義に応じてデータベースからレコードを取得し、エンティティに変換します。
エンティティフロー側からは、エンティティがテキストファイルから読み込まれたのかデータベースから読み
込まれたのかの区別はありません。
32 「データベーステキスト変換ツール」は評価版には含まれていません。ご了承ください。 33 DELETEには対応していませんので、削除するには削除フラグなどを用意して論理削除する必要があります。
8 データベース連携とオンライン連携
110
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
8.5.2 ビルド・パスの設定
デ ー タ ベ ー ス 連 携 を 行 う に は 、 azarea-cluster の zip フ ァ イ ル を 解 凍 し て で き た
azarea-cluster-framework/db フォルダー内の各 JAR ファイルをビルド・パスに追加してください。また、
使用するデータベースの JDBCライブラリもビルド・パスに追加してください。
8.5.3 データベースとエンティティとのマッピングの定義
データベースとエンティティとのマッピングを定義する方法には、プログラム中で記述する方法と、設定ファ
イルに記述する方法とがあります。
(1) プログラムによるマッピングの定義
アプリケーションクラスの checkArgumentsメソッドをオーバーライドし、その中でマッピングを定義し
ます。メソッドは以下のような形になります。
テキスト
ファイル
DB
テキスト
ファイル
エンティ
ティ
エンティ
ティ
エンティ
ティ
エンティ
ティ
エンティティフロー
テーブル
テーブル
AZ
AR
EA
-Clu
ster
フレームワーク
マッピング
定義
8 データベース連携とオンライン連携
111
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
@Override
protected void checkArguments(List<String> args) {
JdbcFileSystem fs = JdbcFileSystem.register(getConfiguration());
EntityDbMapping mapping = new EntityDbMapping(
new PoolingConnectionFactory(),
"jdbc:mysql://AZSERVER:3306/AZAREA",
"azuser",
"xxxxxx",
null);
mapping.addExportMapping("TantoEntity.txt", "TANTO");
mapping.addExportMapping("BumonEntity.txt",
"SELECT * FROM BUMON WHERE SUPER_BUMON_CODE IS NULL");
getOptions().addInputPath(fs.addMapping(mapping));
}
①
②
③
④
⑤
⑥
⑦
⑧
① AZAREA-Clusterフレームワークの JdbcFileSystemインスタンスを取得します。
② EntityDbMapping インスタンスを生成します。これは、データベースとエンティティとのマッピン
グを定義するためのクラスです。
③ データベースに接続するための JDBC URLを指定します。
④ データベースに接続するためのユーザ名を指定します。
⑤ データベースに接続するためのパスワードを指定します。
⑥ データベースのスキーマ名を指定します。
⑦ データベースとエンティティとのマッピングを定義します。第 1引数はエンティティファイル名、第
2引数はテーブル名または SELECT文です。1つの EntityDbMappingインスタンスで複数のマッピ
ングを定義することができます。
⑧ JdbcFileSystemにマッピングを登録します。そして、返される接続先情報を入力パスに追加します。
(2) 設定ファイルによるマッピングの定義
設定ファイルによりデータベースとエンティティとのマッピングを定義することも可能です。設定ファイ
ルの仕様は「データベーステキスト変換ツール」に準じます(詳細は「8.3.2 設定ファイルの準備」を参照
してください)。
アプリケーションクラスでは、ジョブ設定ファイルを読み込むコードを記述する必要があります。
checkArgumentsメソッドをオーバーライドし、以下のように実装します。
@Override
protected void checkArguments(List<String> args) {
EntityDbMappingLoader loader = new EntityDbMappingLoader();
loader.load(getOptions(),
"/jp/co/cac/azarea/sample/config/job.properties");
}
①
②
8 データベース連携とオンライン連携
112
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
① 設定ファイルをロードする EntityDbMappingLoaderクラスのインスタンスを生成します。
② EntityDbMappingLoader クラスの load メソッドにより設定ファイルを読み込みます。引数にはク
ラスパス上のリソース名を指定します。複数の設定ファイルを読み込む場合は、第 2 引数に String
の配列またはリストを渡すか、loadメソッドを複数回呼び出します。以下のように Pathオブジェク
トを渡すことにより、HDFS等にある設定ファイルを読み込むことも可能です34。
loader.load(getConfiguration(),
getOptions(),
new Path("hdfs:/sample/config/job1.properties"),
new Path("hdfs:/sample/config/job2.properties"));
8.5.4 データベースが参照されるタイミング
データベースの参照はフレームワークにより隠ぺいされているため、アプリケーションから直接は見えません。
しかし、データベースがどのようにフレームワークから参照されるかを理解すれば、より効率的なアプリケーシ
ョンを設計することができます。そこで、本章ではフレームワークがどのようにデータベースを参照するかを説
明します。
(1) 入力エンティティ
入力エンティティがデータベースにマッピングされている場合は、ジョブの開始時に SQL が発行され、
レコードが順に取得されます。但し、入力の分散には対応していないので注意してください。すなわち、1
台のマシンのみから SQL が発行され、そこで全レコードで処理されます。入力レコード数が多い場合は、
一旦テキストファイルに変換してから入力するようにしてください。
(2) getEntityCollection メソッド
「6.6.2 エンティティファイルの直接アクセス」に記述されているように、getEntityCollectionメソッ
ドによりエンティティを取得することができます。エンティティがデータベースにマッピングされている場
合は、getEntityCollectionメソッド呼び出し時に SQLが発行され、全レコードが取得されます。
パラメータ付 SQL(「8.5.5 パラメータ付 SQL」参照)を使用している場合は、EntityCollectionクラ
スの getEntityメソッドまたは getEntitiesメソッドを呼ぶ度に SQLが発行されます。
(3) 結合
パラメータ付 SQL(「8.5.5 パラメータ付 SQL」参照)を使用することにより、結合対象のエンティティ
をデータベースから参照するようにすることができます。この場合は、入力エンティティ 1 件毎に SQL が
発行されます。
8.5.5 パラメータ付SQL
(1) 概要
大量のレコードの中から、条件を満たす少数のレコードのみを参照したい場合があると思います。条件が
固定であれば、SQLとエンティティをマッピングすることができます。条件がアプリケーション引数や入力
エンティティに依存するような場合は、パラメータ付 SQLを利用することができます。
34 設定ファイルは処理を分散実行する各マシンから参照できる必要があります。従って、ローカルファイルを指定するとエラー
が発生します(スタンドアローンで実行する場合は問題ありません)。
8 データベース連携とオンライン連携
113
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) パラメータ付SQL の記法
データベースとエンティティをマッピングする際には SQL を指定することができますが、そこでパラメ
ータ付 SQLを使用することができます。パラメータ付 SQL では、パラメータ名を「#」で囲みます。同一
のパラメータ名を複数回使うことも可能です。
例)
SELECT * FROM SALES WHERE CUSTOMER_ID=#customerId# AND ITEM_CODE=#itemCode#
(3) 入力エンティティでの利用
入力エンティティにパラメータ付 SQL がマッピングされている場合は、マッピングの定義時に
setParameter メソッドによりパラメータを指定することができます。setParameter メソッドは、
EntityDbMappingクラスや、そのリストである EntityDbMappingListクラスで定義されています。
setParameter(String entityName, String parameterName, Object parameterValue)
プログラムによりマッピングを定義している場合は、以下のようになります。
@Override
protected void checkArguments(List<String> args) {
...
JdbcFileSystem fs = JdbcFileSystem.register(getConfiguration());
EntityDbMapping mapping = new EntityDbMapping(
new PoolingConnectionFactory(),
"jdbc:mysql://AZSERVER:3306/AZAREA",
"azuser",
"xxxxxx",
null);
mapping.addExportMapping("TantoEntity.txt", "TANTO");
mapping.addExportMapping("BumonEntity.txt",
"SELECT * FROM BUMON WHERE BUMON_CODE=#bumonCode#");
mapping.setParameter("BumonEntity.txt", "bumonCode", args.get(0));
getOptions().addInputPath(fs.addMapping(mapping));
}
設定ファイルによりマッピングを定義している場合は、以下のようになります。
@Override
protected void checkArguments(List<String> args) {
EntityDbMappingLoader loader = new EntityDbMappingLoader();
EntityDbMappingList mappings = loader.load(getOptions(),
"/jp/co/cac/azarea/sample/config/job.properties");
mappings.setParameter("BumonEntity.txt", "bumonCode", args.get(0));
}
(4) EntityCollection クラスでの利用
「6.6.2 エンティティファイルの直接アクセス」に記述されているように、EntityCollection クラスに
よりエンティティを取得することができます。
8 データベース連携とオンライン連携
114
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
getEntities(String[], Object[])メソッドでは、パラメータ名とパラメータの値を指定して、パラメ
ータ付 SQLによりエンティティを取得することができます。
例)
List<SalesEntity> salesList = entityCollection.getEntities(
new String[]{"customerId", "itemCode"},
new Object[]{input.customerId, input.itemCode});
getEntity(Object...)メソッドおよび getEntities(Object...) メソッドでは、パラメータ名=キー
名としてパラメータ付 SQLが発行されます。
(5) 結合時の使用
Joinや UniqueJoinでは、パラメータ付 SQLにマッピングされたエンティティを結合対象とすることが
できます。すると、パラメータ名=結合列名としてパラメータ付 SQLが発行されます。
結合時にパラメータ付 SQLを使用すると、入力エンティティ 1件毎に SQLが発行されます。従って、入
力エンティティ数が多い場合は、大量の SQL発行のために遅くなる場合もありますので、ご注意ください。
8.5.6 JAR ファイルの作成
「10.2 JARファイルの作成」の機能により JARファイルを作成する際には、以下のライブラリを JARファ
イルに含めるようにしてください。
・ commons-pool-X.X.jar
・ commons-dbcp-X.X.jar
・ JDBCドライバのライブラリ
8.6 オンライン連携
8.6.1 概要
オンライン連携は、以下の手順で行います。
① 入力エンティティを設定する。
② AZAREA-Clusterアプリケーションを呼び出す。
③ 出エンティティを取得する。
エンティティの受け渡しやAZAREA-Clusterアプリケーションの呼び出しには、フレームワークが提供して
いる起動クラスを利用します。起動クラスは、エンティティの受け渡し方法(メモリ経由/データベース経由/
双方)により異なります。
8.6.2 ビルド・パスの設定
ビルド・パスの設定はデータベース連携の場合と同様です(「8.5.2 ビルド・パスの設定」を参照してくださ
い)。
Spring Frameworkを使用する場合は、それもビルド・パスに追加してください。
8.6.3 メモリ経由でエンティティを受け渡す場合
メモリ経由でエンティティを受け渡す場合は、MemoryApplicationExecuter クラスを使用します。そのメ
8 データベース連携とオンライン連携
115
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
ソッドは以下の通りです。
(1) setEntities(List)
引数 説明
List<エンティティクラス> entities 入力エンティティのリスト
戻り値 説明
- -
仕様
入力エンティティを設定します。エンティティ名はデフォルト(エンティティクラス名.txt)となりま
す。
(2) setEntities(List, String)
引数 説明
List<エンティティクラス> entities 入力エンティティのリスト
String entityName 入力エンティティ名
戻り値 説明
- -
仕様
エンティティ名を指定して入力エンティティを設定します。
(3) executeEntityFlow
引数 説明
Class entityFlowClass エンティティフロークラス
String... args アプリケーション引数
戻り値 説明
- -
仕様
エンティティフローを実行します。
(4) execute
引数 説明
Class applicationClass アプリケーションクラス
String... args アプリケーション引数
戻り値 説明
- -
仕様
アプリケーションを実行します。
(5) getEntities(Class)
引数 説明
Class entityClass エンティティクラス
戻り値 説明
List<エンティティクラス> 出力エンティティのリスト。存在しない場合は空リストが返される。
8 データベース連携とオンライン連携
116
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
仕様
出力エンティティを取得します。エンティティ名はデフォルト(エンティティクラス名.txt)となりま
す。
(6) getEntities(Class, String)
引数 説明
Class entityClass エンティティクラス
String entityName エンティティ名
戻り値 説明
List<エンティティクラス> 出力エンティティのリスト。存在しない場合は空リストが返される。
仕様
出力エンティティを取得します。
以下は使用例です。
MemoryApplicationExecuter executer = new MemoryApplicationExecuter();
// 担当エンティティを設定する
List<TantoEntity> tantos = ...
executer.setEntities(tantos);
// 部門エンティティを設定する
List<BumonEntity> bumons = ...
executer.setEntities(bumons);
// 担当と部門を結合するエンティティフローを実行する
executer.executeEntityFlow(TantoJoinFlow.class);
// 結合結果を取得する
List<TantoView> tantoViews = executer.getEntities(TantoView.class));
...
8.6.4 データベース経由でエンティティを受け渡す場合
データベース経由でエンティティを受け渡す場合は、StandaloneJdbcApplicationExecuterクラスを使用
します。そのメソッドは以下の通りです。
(1) addMapping
引数 説明
EntityDbMapping maping データベースとエンティティとのマッピング
戻り値 説明
- -
仕様
データベースとエンティティとのマッピングを追加します。マッピングの定義方法については「8.5.3 デ
ータベースとエンティティとのマッピングの定義」と同様です。
プログラムによりインポート時のマッピングを定義するには、EntityDbMapping クラスの
addImportMapping(String エンティティ名, String テーブル名, ImportMode インポート方式)メソ
ッドを使用します。
8 データベース連携とオンライン連携
117
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) addMappings
引数 説明
List<EntityDbMapping> mapings データベースとエンティティとのマッピングのリスト
戻り値 説明
- -
仕様
データベースとエンティティとのマッピングを追加します。
(3) setMappings
引数 説明
List<EntityDbMapping> mapings データベースとエンティティとのマッピングのリスト
戻り値 説明
- -
仕様
データベースとエンティティとのマッピングを設定します。追加済みのマッピングは破棄されます。
(4) executeEntityFlow
引数 説明
Class entityFlowClass エンティティフロークラス
String... args アプリケーション引数
戻り値 説明
- -
仕様
エンティティフローを実行します。
(5) execute
引数 説明
Class applicationClass アプリケーションクラス
String... args アプリケーション引数
戻り値 説明
- -
仕様
アプリケーションを実行します。
出力エンティティは、定義されているマッピングに従って、データベースに格納されます。
8.6.5 メモリとデータベースの両方を経由してエンティティを受け渡す場合
MemoryAndJdbcApplicationExecuterクラスでは、エンティティをメモリとデータベースの両方から入力す
ることができます。エンティティの出力先はメモリのみです。
MemoryApplicationExecuterクラスの各メソッドに加えて、StandaloneJdbcApplicationExecuterクラ
スの addMapping、addMappings、setMappingsと同等のメソッドが利用可能です。
8 データベース連携とオンライン連携
118
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
8.6.6 Spring Framework の使用
オンライン連携により AZAREA-Cluster アプリケーションを呼び出した場合、デフォルトでは Apache
Commons DBCPを利用してデータベースに接続します。しかし、呼び出し側とAZAREA-Clusterアプリケー
ション側とでデータベース接続やトランザクションを共有したい場合もあると思います。そのような場合は、
Spring Frameworkを利用します。
(1) 概要
オンライン連携により AZAREA-Cluster アプリケーションを呼び出した場合、デフォルトでは Apache
Commons DBCPを利用してデータベースに接続します。しかし、呼び出し側とAZAREA-Clusterアプリ
ケーション側とでデータベース接続やトランザクションを共有したい場合もあると思います。そのような場
合は、Spring Frameworkを利用します。
(2) プログラムによりマッピングを定義する場合
「8.5.3(1) プログラムによるマッピングの定義」に対応します。
まず、SpringConnectionFactoryクラスのインスタンスを Spring Frameworkから取得します。それを
EntityDbMappingクラスのコンストラクタに渡します。
例)
import jp.co.cac.azarea.cluster.io.fs.jdbc.connection.SpringConnectionFactory;
import jp.co.cac.azarea.cluster.io.fs.jdbc.mapping.EntityDbMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class XXXService {
@Autowired
private SpringConnectionFactory connectionFactory;
public void execute() throws Exception {
StandaloneJdbcApplicationExecuter executer =
new StandaloneJdbcApplicationExecuter();
// エンティティとデータベースとのマッピングを定義する
// ※実際にこの情報によりデータベースに接続するのではなく、Springで管理している
// DataSourceを特定するためのものなので、パスワードは不要
EntityDbMapping mapping = new EntityDbMapping(
connectionFactory,
"jdbc:mysql://AZSERVER:3306/AZAREA",
"azuser",
null,
null);
8 データベース連携とオンライン連携
119
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
mapping.addExportMapping("TantoEntity.txt", "TANTO");
mapping.addExportMapping("BumonEntity.txt", "BUMON");
mapping.addImportMapping("TantoView.txt", "TANTO_VIEW", ImportMode.Drop);
executer.addMapping(mapping);
// 担当と部門を結合するエンティティフローを実行する
executer.executeEntityFlow(TantoJoinFlow.class);
...
(3) 設定ファイルによりマッピングを定義する場合
「8.5.3(2) 設定ファイルによるマッピングの定義」に対応しますが、EntityDbMappingLoader クラスの
代りに EntityDbMappingLoaderWithSpringクラスを使用します。
まず、EntityDbMappingLoaderWithSpringクラスのインスタンスを Spring Frameworkから取得しま
す。それを使用して設定ファイルを読み込みます。
例)
import jp.co.cac.azarea.cluster.io.fs.jdbc.mapping.EntityDbMapping;
import jp.co.cac.azarea.cluster.io.fs.jdbc.mapping.EntityDbMappingLoaderWithSpring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class XXXService {
@Autowired
private EntityDbMappingLoaderWithSpring loader;
public void execute() throws Exception {
StandaloneJdbcApplicationExecuter executer =
new StandaloneJdbcApplicationExecuter();
// エンティティとデータベースとのマッピングを読み込む
EntityDbMappingList mappings = loader.load(
"/jp/co/cac/azarea/sample/config/job.properties"));
executer.addMappings(mappings);
// 担当と部門を結合するエンティティフローを実行する
executer.executeEntityFlow(TantoJoinFlow.class);
...
(4) データベース接続の照合について
AZAREA-Clusterフレームワークは、Spring Frameworkで管理されているデータベース接続の中から、
エンティティにマッピングされているものを探し出して使用します。その際、データベース接続の JDBC
8 データベース連携とオンライン連携
120
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
URL を解析し、マッピング定義と照合します。そのため、Spring Framework におけるデータベース接続
の定義と、マッピングにおけるデータベース接続の定義は同じように記述する必要があります.。例えば、一
方ではサーバ名で記述して他方では IPアドレスで記述すると、照合できずにエラーとなります。
8.6.7 JAR ファイルの作成
「10.2 JARファイルの作成」の機能により JARファイルを作成する際には、以下のライブラリを JARファ
イルに含めるようにしてください。
・ commons-pool-X.X.jar
・ commons-dbcp-X.X.jar
・ JDBCドライバのライブラリ(データベースを使用する場合)
・ Spring Frameworkのライブラリ(Spring Frameworkを使用する場合)
9 エンティティフローやアプリケーションのテスト
121
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
9 エンティティフローやアプリケーションのテスト
9.1 概要
AZAREA-Clusterフレームワークは、エンティティフローやアプリケーションを単独の Java VM上で実行す
るためのシミュレータを備えています。それを利用することにより、Eclipse上でエンティティフローやアプリケ
ーションを実行およびデバッグすることができます。
シミュレータを利用するには、テストクラスを作成します。テストクラスは、エンティティフロークラスまた
はアプリケーションクラスをシミュレータに渡して起動します。すると、シミュレータがエンティティフローま
たはアプリケーションを実行します。
9.2 テストデータの準備
テストクラスを作成する前に、エンティティフローまたはアプリケーションへの入力となるテストデータを準
備します。テストデータは、テキストファイルまたはExcelファイルで作成することができます。
テキストファイルの場合は、実際のエンティティファイルのフォーマットに従って作成します。
Excelファイルの場合は、1シートを 1エンティティファイルとみなしてテストデータを作成します。シート名
はエンティティファイル名とします。Excelの 1行が 1エンティティ、Excelの 1列が 1エンティティ列に相当
します。A列の 1文字目にコメント文字を記述すると、その行全体がコメントとみなされます。
A
#tantoCode tantoName bumonCode
B C …
…
10010 ○○ 一郎 110 …
10011 △△ 花子 230 …
10012 □□ 次郎 110 …
… … … …
1
2
3
4
…
TantoEntity.txt BumonEntity.txt
AZAREA-Clusterフレームワーク
テストクラス
エンティティフロークラス
または
アプリケーションクラス
シミュレータ
起動
参照
実行
9 エンティティフローやアプリケーションのテスト
122
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
テストデータの置き場所は任意で構いません。テストクラスの作成時に、テストデータの場所を指定すること
ができます。
9.3 テストクラスの作成
9.3.1 エンティティフローのテストクラスの作成
パッケージ・エクスプローラでエンティティフロークラスを右クリックし、メニューより「テストクラスを作
成」を選択すると、以下のようなダイアログが表示されます。
項目 説明
ソース・フォルダー テストクラスを保存するソースフォルダーを指定します。
パッケージ テストクラスのパッケージを指定します。
クラス名 テストクラスのクラス名(パッケージ名は含みません)を指
定します。
テスト対象のエンティティフロークラス テスト対象のエンティティフロークラスを指定します。
テストデータのパス テストデータのパスを指定します。
テストデータがテキストファイルの場合は、それらが格納さ
れているフォルダーを指定します。
テストデータが Excel ファイルの場合は、そのファイルを指
定します。
「OK」ボタン テストクラスを作成してダイアログを閉じます。
「キャンセル」ボタン テストクラスを作成せずにダイアログを閉じます。
テストクラスのクラス名を入力し、「OK」を押すと、以下のようなクラスが生成されます。
package tutorial.flow;
import java.io.IOException;
import jp.co.cac.azarea.cluster.planner.job.SimpleEntityFlowManager;
import jp.co.cac.azarea.cluster.tester.MapReduceJobManagerTester;
import jp.co.cac.azarea.cluster.util.Generated;
@Generated("AZAREA-Cluster 1.0")
public class TutorialFlowTest {
public static void main(String[] args) throws IOException {
9 エンティティフローやアプリケーションのテスト
123
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new SimpleEntityFlowManager());
tester.test("../data", TutorialFlow.class.getName());
}
}
MapRecuceJobManagerTesterクラスは、アプリケーションを単独の Java VM上で実行するためのクラスで
す。testメソッドの第 1引数は、テストデータのテストクラスからの相対パスです。
9.3.2 アプリケーションのテストクラスの作成
パッケージ・エクスプローラでアプリケーションクラスを右クリックし、メニューより「テストクラスを作成」
を選択すると、以下のようなダイアログが表示されます。
項目 説明
ソース・フォルダー テストクラスを保存するソースフォルダーを指定します。
パッケージ テストクラスのパッケージを指定します。
クラス名 テストクラスのクラス名(パッケージ名は含みません)を指
定します。
テスト対象のアプリケーションクラス テスト対象のアプリケーションクラスを指定します。
テストデータのパス テストデータのパスを指定します。
テストデータがテキストファイルの場合は、それらが格納さ
れているフォルダーを指定します。
テストデータが Excel ファイルの場合は、そのファイルを指
定します。
「OK」ボタン テストクラスを作成してダイアログを閉じます。
「キャンセル」ボタン テストクラスを作成せずにダイアログを閉じます。
テストクラスのクラス名を入力し、「OK」を押すと、以下のようなクラスが生成されます。
package tutorial.flow;
import java.io.IOException;
import jp.co.cac.azarea.cluster.tester.MapReduceJobManagerTester;
import jp.co.cac.azarea.cluster.util.Generated;
9 エンティティフローやアプリケーションのテスト
124
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
@Generated("AZAREA-Cluster 1.0")
public class TutorialApplicationTest {
public static void main(String[] args) throws IOException {
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new TutorialApplication());
tester.test("../data");
}
}
MapRecuceJobManagerTesterクラスは、アプリケーションを単独の Java VM上で実行するためのクラスで
す。testメソッドの第 1引数は、テストデータのテストクラスからの相対パスです。
アプリケーション引数を渡す場合は、testメソッドの第 2引数以降で指定します。
public static void main(String[] args) throws IOException {
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new TutorialApplication());
tester.test("../data", "AAA", 999);
}
9.3.3 アプリケーションコンテキストの設定
通常、アプリケーションコンテキストはアプリケーションクラス内で設定します(「6.6.4.2 アプリケーショ
ンコンテキストの初期化」を参照してください)。
それ以外にも、テストクラスからアプリケーションコンテキストを設定することができます。
MapReduceJobManagerTesterクラスの getApplicationContextメソッドで ApplicationContextインスタ
ンスを取得できるので、それを使用します。
public static void main(String[] args) throws IOException {
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new SimpleEntityFlowManager());
tester.getApplicationContext().setInt("min", 999);
tester.test("../data", TutorialFlow.class.getName());
}
アプリケーションクラスをテストする場合は若干注意が必要です。アプリケーションクラスの
initializeApplicationContext メソッドに渡される ApplicationContext インスタンスと、
MapReduceJobManagerTester から取得できるインスタンスとは別のものです。アプリケーションクラス側で
ApplicationContextが初期化された後、MapReduceJobManagerTester側で設定された値がマージされます。
同じキーの値は上書きされます。
9.4 テストの実行
テストクラスは mainメソッドを持っているので、そのまま Javaアプリケーションとして実行することができ
ます。
9 エンティティフローやアプリケーションのテスト
125
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
実行結果は、プロジェクト直下の「azarea/result/yyyyMMdd_HHmmss_NNN」フォルダー下に出力されます。
同時に、前日までの実行結果は削除されます。出力フォルダーを自分で指定したい場合は、setOutputPathメソ
ッドを使用します。
public static void main(String[] args) throws IOException {
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new SimpleEntityFlowManager());
// Windowsの場合
tester.setOutputPath(new Path("file:///C:/dev/result")));
// Linuxの場合
//tester.setOutputPath(new Path("file:///dev/result")));
tester.test("../data", TutorialFlow.class.getName());
}
また、実行結果はEclipseのコンソールにも出力されます。エンティティ数が多く出力に時間が掛かる場合は、
setPrintEntitesメソッドによりコンソールへの出力を抑制することができます。
public static void main(String[] args) throws IOException {
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new SimpleEntityFlowManager());
tester.setPrintEntities(false);
tester.test("../data", TutorialFlow.class.getName());
}
なお、シミュレータではエンティティフローを擬似的に分散して実行します。プロセスやスレッドは 1 つです
が、エンティティフロークラスのインスタンスを複数生成して実行します。但し、実行結果は 1 つのエンティテ
ィファイルにマージされます(実際の Hadoop では、サブフォルダー下に別々のファイルとして出力されます)。
デフォルトの擬似分散数は 2ですが、setDistributionCountメソッドにより変更することも可能です。
9.5 実行結果の検証
テストクラスでは、実行結果を検証することも可能です。すなわち、予め実行結果を想定したファイルを用意
しておき、実際の実行結果と比較することができます。また、ある時点での実行結果を保存しておいて想定実行
結果とすれば、回帰テストを行うことができます。
実行結果を検証するには、testAndAssertメソッドを使用します。第 1引数はテストデータのパス、第 2引数
は想定結果データのパスです。実際の実行結果と想定結果が等しければ true、そうでなければ falseを返します。
以下は、JUnitのテストケースとして検証する例です。
public class TutorialFlowTest {
@Test
public void testTutorialFlow() throws IOException {
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new SimpleEntityFlowManager());
assertTrue(tester.testAndAssert("../data",
"../expected",
TutorialFlow.class.getName()));
}
9 エンティティフローやアプリケーションのテスト
126
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
}
デフォルトでは、エンティティファイル中のエンティティの順序は検証されません。言わば、List ではなく
Setとして検証されます。これは、Sort以外の処理では出力順序が保証されないからです。順序も検証したい場
合は、setIgnoreRowOrderメソッドを使用します。
public class TutorialFlowTest {
@Test
public void testTutorialFlow() throws IOException {
MapReduceJobManagerTester tester =
new MapReduceJobManagerTester(new SimpleEntityFlowManager());
tester.setIgnoreRowOrder(false);
assertTrue(tester.testAndAssert("../data",
"../expected",
TutorialFlow.class.getName()));
}
}
10 エンティティフローやアプリケーションの実行
127
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
10 エンティティフローやアプリケーションの実行
10.1 概要
AZAREA-Cluster のアプリケーションは、フレームワークも含めて 1 つの JAR ファイルにまとめられます。
一般的なHadoopアプリケーションと同じく、Hadoop上で実行することができます。また、Hadoop用のワーク
フローシステムであるOozie上で実行することができます。但しその場合は、AZAREA-Cluster用に予めOozie
を拡張しておく必要があります。
また、スタンドアローンな Java VM上で実行することもできます。
10.2 JAR ファイルの作成
10.2.1 JAR ファイルの作成方法
パッケージエクスプローラでエンティティフロークラスまたはアプリケーションクラスを選択し、 アイコ
ンをクリックします。すると以下のようなダイアログが開きます。
10 エンティティフローやアプリケーションの実行
128
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
項目 説明
JARファイル名 作成する JARファイル名を指定してください。
相対パスで入力した場合は、プロジェクトのルートフォルダーから
の相対となります。
メインクラス 実行対象のエンティティフロークラスまたはアプリケーションク
ラスを指定してください。
あるいは、jp.co.cac.azarea.cluster.Mainクラスを指定するこ
とにより、複数のクラスを起動可能な JAR ファイルを作成するこ
とができます(詳細は「10.2.2 汎用エントリの JARファイル」を
参照してください)。
JAR対象フォルダー プロジェクトの出力フォルダーが表示されます。
JARファイルに含めるフォルダーをチェックしてください。
JAR対象ライブラリ プロジェクトの参照ライブラリが表示されます(但し、Hadoopに
元々含まれているライブラリは、JARファイルに含める必要が無い
ため表示されません)。
JARファイルに含めるライブラリをチェックしてください。
AZAREA-Clusterライブラリ AZAREA-Clusterフレームワークは必須ですので、チェックを外す
ことはできません。
Excelライブラリ Excel ファイルを読み込む際に使用するライブラリで、基本的には
テスト時のみ使用します。
デフォルトではチェックされていませんが、アプリケーションで使
用しているものがあればチェックしてください。
その他ライブラリ 上記以外のライブラリが表示されます。
「作成」ボタン 入力内容に従って JARファイルが作成されます。
「キャンセル」ボタン JARファイルを作成せずにダイアログを閉じます。
なお、JAR ファイルを作成した際の入力内容は履歴として保存されます35。 アイコンの右側の▼をクリッ
クすると、履歴を実行するためのメニューが現れます。但し、そこから実行した場合はファイルを上書きする旨
の確認ダイアログが出ませんのでご注意ください。
10.2.2 汎用エントリの JAR ファイル
1つのシステムで複数のエンティティフロークラスやアプリケーションクラスを使用する場合、それぞれ毎に
JAR ファイルを作成すると煩雑になってしまいます。そのような場合は、jp.co.cac.azarea.cluster.Main
をメインクラスに指定することにより、任意のクラスを起動可能な JARファイルを作成することができます。
35 JAR対象のフォルダーやライブラリは絶対パスで保存されています。ビルド・パスを変更しても反映されませんので、ご注意
ください。
10 エンティティフローやアプリケーションの実行
129
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
Hadoopでエンティティフロークラスを実行する場合は、以下のようにします。
hadoop jar <Jarファイル名> [Hadoopオプション] [AZAREA-Clusterオプション] jp.co.cac.azarea.
cluster.planner.job.SimpleEntityFlowManager エンティティフロークラス名 [アプリケーション引数
1 アプリケーション引数 2 …]
Hadoopでアプリケーションクラスを実行する場合は、以下のようにします。
hadoop jar <Jarファイル名> [Hadoopオプション] [AZAREA-Clusterオプション] アプリケーションク
ラス名 [アプリケーション引数 1 アプリケーション引数 2 …]
クラス名には完全修飾クラス名を指定してください。他の引数の意味については、「10.3.1 Hadoopコマンド
での実行方法」を参照してください。
10.3 Hadoop コマンドでの実行
10.3.1 Hadoop コマンドでの実行方法
以下のコマンドにより、作成した JARファイルをHadoopで実行することができます。
hadoop jar <Jar ファイル名> [Hadoop オプション] [AZAREA-Cluster オプション] [アプリケーション
引数 1 アプリケーション引数 2 …]
各引数の意味は以下の通りです。
引数 説明
JARファイル名 実行する JARファイル名を指定します。
Hadoopオプション Hadoopに渡すオプションを「-Dname=value」形式で指定します。例えば、
以下のように指定します。
-Dmapred.child.java.opts=-Xmx512m
AZAREA-Clusterオプション AZAREA-Clusterフレームワークに渡すオプションを「-オプション名=値」
指定します。詳細は次表で説明します。
アプリケーション引数 アプリケーション固有の引数をスペースで区切って渡します。詳細は「7.5
アプリケーション引数」を参照してください。
下表は、AZAREA-Clusterオプションの説明です。
引数 必須 説明
-i=入力パス ○ エンティティの入力フォルダーのパスを指定します。入力フォル
ダーが複数ある場合は、オプションを複数回指定します。
Amazon S3 を指定することも可能です。その場合は、スキーム
(s3n)から指定してください。
10 エンティティフローやアプリケーションの実行
130
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
-o=出力パス ○ エンティティの出力フォルダーのパスを指定します。
Amazon S3 を指定することも可能です。その場合は、スキーム
(s3n)から指定してください。
-j=[開始ジョブ]-[終了ジョブ] 一部のMapReduceジョブだけを実行したい場合に指定します。
開始ジョブと終了ジョブには、ジョブの番号(1始まり)を指定し
てください。一方だけ指定することも可能です。
-d=分散数 1 つの処理を幾つの Reducer で処理するかを指定します。デフォ
ルトでは最大 Reducerタスク数となります。パフォーマンスをチ
ューニングする際に使用します。
-binary ジョブ間の中間エンティティファイルをバイナリ形式で出力しま
す。デフォルトではテキスト形式です。数値列が多い場合は、バ
イナリ形式の方が高速になる可能性があります。
-inMemoryJoin=サイズ メモリ内結合を行う最大のファイルサイズを指定します。詳細は
「6.7.3 結合方式」を参照してください。
-awsAccessKeyId=AWS のア
クセスキー
Amazon S3を入出力として使用する場合に指定します。
-awsSecretAccessKey=AWS
の秘密キー
以下はコマンドの例です。
hadoop jar test.jar -Dmapred.child.java.opts=-Xmx512m –i=/test/in1 –i=/test/in2 –o=/test
/out –j=1-3
以下はAmazon S3を入出力として使用する場合のコマンドの例です。
hadoop jar test.jar –i=s3n://xxx/test/in –o=s3n://xxx/test/out –awsAccessKeyId=xxxxxxxxx
xxxxxxx –awsSecretAccessKey=xxxxxxxxxxxxxxxx
10.3.2 コンソール出力の見方
hadoop jar コマンドによりアプリケーションを実行すると、コンソールに様々な情報が出力されます。ここ
では、特に有益な情報について説明します。
...
① 12/12/28 11:41:43 INFO distributed.DistributedMapReduceExecuter: Job No.1
② 12/12/28 11:41:43 INFO job.MapReduceJob: Create job "SimpleEntityFlowManager<jp.c
o.cac.azarea.cluster.sample.simple.flow.AreaSummaryFlow>#1/2".
12/12/28 11:41:43 INFO job.MapReduceJob: Combiner = null
12/12/28 11:41:43 INFO job.MapReduceJob: Summarizers = 1
③ 12/12/28 11:41:43 INFO job.MapReduceJob: Distribution count = 2
④ 12/12/28 11:41:43 INFO job.MapReduceJob: Reducer count = 2
⑤ 12/12/28 11:41:43 INFO job.MapReduceJob: Input paths=[hdfs://xxxxx:8020/sample/in/
SalesEntity.txt]
12/12/28 11:41:43 INFO job.MapReduceJob: Max input split size = 9223372036854775807
⑥ 12/12/28 11:41:43 INFO job.MapReduceJob: Output path = hdfs://xxxxx:8020/sample/ou
t
⑦ 12/12/28 11:41:43 INFO job.MapReduceJob: Output entities = [tempSalesEntity.txt]
10 エンティティフローやアプリケーションの実行
131
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
12/12/28 11:41:43 INFO job.MapReduceJob: Output format class = class jp.co.cac.azar
ea.cluster.reduce.EntityOutputFormat
⑧ 12/12/28 11:41:43 INFO job.MapReduceJob: Operations in this job:
12/12/28 11:41:43 INFO job.MapReduceJob: AreaSummaryFlow-"group1"
...
① アプリケーション内のジョブの番号です。
② アプリケーションを実装しているクラスです。末尾には、現在のジョブの番号とアプリケーションの全ジ
ョブ数が表示されます。
③ 分散数です。
④ Reducer数(=分散数×同時に並列で実行される処理数)です。
⑤ ジョブの入力ファイルのパスです。
⑥ ジョブの出力フォルダーのパスです。
⑦ ジョブの出力エンティティファイル名です。
⑧ ジョブ内で実行する処理です。エンティティフロークラス名と処理の表示名が表示されます。例えば、
AreaSummaryFlowクラスに group2という表示名の処理がある場合は、「#AreaSummaryFlow-"group2"」
と表されます。
10.3.3 カウンタの見方
JobTrackerのWeb画面等に表示されるカウンタの見方を説明します。AZAREA-Cluster では、以下のよう
なカウンタを表示します。
Counter Map Reduce Total
AZAREA Input: tempSalesEntity.txt 3 0 3
Operation output: #AreaSummaryFlow-"group2" 0 2 2
Operation output: #AreaSummaryFlow-"join" 3 0 3
Operation input: #AreaSummaryFlow-"group2" 1 2 3
Operation input: #AreaSummaryFlow-"join" 6 0 6
Output: AreaSummaryEntity.txt 0 2 2
「Input」では、入力エンティティファイル名と、入力されたエンティティ数が表示されます。
「Output」では、出力エンティティファイル名と、出力されたエンティティ数が表示されます。
「Operation Input」では、処理毎の入力エンティティ数が表示されます。結合処理の場合は、入力エンテ
ィティと結合エンティティの合計となります。カウンタ名にはエンティティフロークラス名と処理の表示名が表
示されます。例えば、 AreaSummaryFlow-クラスに group2 という表示名の処理がある場合は、
「#AreaSummaryFlow-"group2"」と表されます。
「Operation Output」では、処理毎の出力エンティティ数が表示されます。
なお、ジョブ内の処理数が多い場合は、表示が省略されます36。
36 Hadoopのカウンタ数には制限があるためです。
10 エンティティフローやアプリケーションの実行
132
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
10.4 Oozie による実行
10.4.1 概要
AZAREA-Clusterアプリケーションは、単一のHadoopコマンドで実行することができます。しかし、この
実行の仕方だと以下のような問題があります。
・ コンソールが占有されてしまい、アプリケーションが終了するまで他のことができなくなる
・ コンソールが落ちると、アプリケーションも終了してしまう(その時点で開始されている
MapReduceジョブまでは終了する)
Oozie を利用することにより、この問題を解決することができます。Oozie は Web サーバ上で動作し、そこ
からHadoopアプリケーションの実行を制御するからです。
10.4.2 Oozie の準備
AZAREA-Clusterフレームワークは少々特殊な処理を行っているため、そのままOozie上で実行することは
できません。予めOozieにAZAREA-Clusterフレームワークのクラスを組み込んでおく必要があります。具体
的な手順は、以下の通りです。
まず、OozieのWebアプリケーションの中にAZAREA-Clusterフレームワークを入れてください。具体的に
は、以下の手順で行います。
(1) Oozie の停止
Oozieを停止します。
(2) Oozie の設定ファイルの変更
「oozie-site.xml」に以下を追加してください。
<property>
<name>oozie.service.ActionService.executor.classes</name>
<value>
org.apache.oozie.action.decision.DecisionActionExecutor,
org.apache.oozie.action.hadoop.JavaActionExecutor,
org.apache.oozie.action.hadoop.FsActionExecutor,
jp.co.cac.azarea.cluster.oozie.AzareaMapReduceActionExecutor,
org.apache.oozie.action.hadoop.PigActionExecutor,
org.apache.oozie.action.ssh.SshActionExecutor,
org.apache.oozie.action.oozie.SubWorkflowActionExecutor
</value>
</property>
これにより、Oozieの MapReduceActionExecutorクラスがAZAREA-ClusterフレームワークのAzarea
MapReduceActionExecutorクラスに置き換わります37。
oozie.service.ActionService.executor.ext.classes とは別のプロパティですので、ご注意くださ
い。
(3) AZAREA-Cluster フレームワークの組み込み
OozieのWebアプリケーションにAZAREA-Clusterフレームワークを組み込みます。具体的な手順は、
Webアプリケーションの配備形式により異なります。
37 共存することはできないため、拡張Actionクラスとして追加することはできません。
10 エンティティフローやアプリケーションの実行
133
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
WARファイルで配備されている場合は、以下のようにしてください。
① WARファイル(oozie.war)を適当な作業フォルダーに展開します。
jar xvf /xxx/xxx/webapps/oozie.war
② 展開されたWARファイルの WEB-INF/libフォルダー下に azarea-cluster.jarをコピーします。
③ WARファイル(oozie.war)を再作成し、配置します。
jar cvf /xxx/xxx/webapps/oozie.war .
④ Web アプリケーションサーバにより WAR ファイルが展開されたフォルダー
(/xxx/xxx/webapps/oozie)がある場合は、削除してください。
フォルダーが展開されて配備されている場合38は、以下のようにしてください。
① 展開された WAR ファイルの WEB-INF/lib フォルダー下(無い場合は作成してください)に
azarea-cluster.jarをコピーします。
(4) Oozie の起動
Oozieを起動します。
10.4.3 Oozie での実行
AZAREA-Clusterアプリケーションは、複数のMapReduce ジョブに変換されます。その 1つ1つを Oozie
のワークフロー要素として実行します。
AZAREA-ClusterフレームワークにはOozie用のワークフロー定義ファイルを出力する機能があります。そ
れを利用することにより、Oozie上でAZAREA-Clusterアプリケーションを実行することができます。
まずは、以下のような「job.properties」ファイルを用意します39。
nameNode=${nameNode}
jobTracker=${jobTracker}
oozie.wf.application.path=${nameNode}${oozieDir}
そして、以下のようなシェルスクリプトをOozieクライアント上で実行します40。エラー処理は省略していま
すので、適宜追加してください。
#!/bin/sh
oozieServer=http://xxx:11000/oozie
nameNode=hdfs://xxx:8020
jobTracker=xxx:8021
jar=/xxx/xxx.jar
applicationArgs=""
inputDir=/xxx/xxx
outputDir=/xxx/xxx
oozieDir=/xxx/xxx
# create workflow.xml
38 例えば、CDH 4.1ではそのようになるようです。 39 azarea-cluster-sampleプロジェクトの oozieフォルダーに入っています。 40 azarea-cluster-sampleプロジェクトの oozieフォルダーに入っています。
10 エンティティフローやアプリケーションの実行
134
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
hadoop jar ${jar} -i=${nameNode}${inputDir} -o=${nameNode}${outputDir} \
-describe=oozieWorkflow ${applicationArgs} > workflow.xml
# upload to HDFS
hadoop fs -rmr ${oozieDir}/workflow.xml
hadoop fs -put workflow.xml ${oozieDir}/workflow.xml
hadoop fs -rmr ${oozieDir}/lib
hadoop fs -mkdir ${oozieDir}/lib
hadoop fs -put ${jar} ${oozieDir}/lib/
# extract lib/*jar in jar
mkdir azarea-temp
cd azarea-temp
innerJars=`jar tvf ${jar} | grep " lib/.*\.jar" | sed -e "s/.* //g"`
for innerJar in ${innerJars}
do
jar xvf ${jar} ${innerJar}
done
hadoop fs -put lib/* ${oozieDir}/lib/
cd ..
rm -fr azarea-temp
# run by oozie
oozie job -config job.properties -oozie ${oozieServer} -run -D nameNode=${nameNode} \
-D jobTracker=${jobTracker} -D oozieDir=${oozieDir}
各変数の意味は以下の通りです。環境に応じて書き換えて下さい。
変数 意味
oozieServer OozieのWebサービスのアドレスです。
nameNode NameNodeのアドレスです。core-site.xmlの fs.default.nameプロパティと
同じ値を指定してください。
jobTracker JobTrackerのアドレスです。mapred-site.xmlの mapred.job.trackerプロパ
ティを同じ値を指定してください。
jar AZAREA-Clusterアプリケーションの JARファイル名です。Oozieクライアント
上の絶対パスで指定してください。
applicationArgs アプリケーション引数。ダブルクォーテーションで囲んでください。アプリケー
ション引数が複数の場合は、スペースで区切ってください。
例)applicationArgs="100 AAA 9"
inputDir 入力エンティティフォルダーです。HDFS上の絶対パスで指定してください。
outputDir 出力エンティティフォルダーです。HDFS上の絶対パスで指定してください。
Oozieにより作成されます。
10 エンティティフローやアプリケーションの実行
135
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
oozieDir Oozie用の作業フォルダーです。HDFS上の絶対パスで指定してください。
予め空のフォルダーを作成しておいてください。
なお、シェルスクリプト中で JAR ファイルを展開している箇所があります。これは、hadoop jarで実行す
る場合は自動的に展開されますが、Oozieにより実行する場合は自動的には展開されないからです。
10.5 スタンドアローンな Java VM 上での実行
10.5.1 概要
Hadoop は大量データを効率よく処理することができますが、小量データに関しては非効率です。そこで
AZAREA-Clusterでは、アプリケーションをスタンドアローンな Java VM上で効率よく処理する機構を提供し
ています。Hadoopのスケーラビリティには敵いませんが、マルチスレッドで並列処理することも可能です。
10.5.2 起動用 JAR の準備
基本的には、必要なライブラリを全てクラスパスで指定して javaコマンドで実行することができます。しか
し、その方法では煩雑なので、簡単に実行できるよう起動用 JARを提供しています。
起動用 JARは、azarea-clusterの zipファイルを解凍してできた azarea-cluster-framework/toolフォ
ルダー内にあります。azarea-cluster-launcher.jarと log4j.propertiesを適当なフォルダーにコピーし
てください。なお、デフォルトではカレントディレクトリの azarea-cluster.logファイルにログが出力され
るよう設定されています。
10.5.3 Java コマンドでの実行
以下のコマンドにより、作成した JARファイルをスタンドアローンな Java VM上で実行することができま
す。
java -jar azarea-cluster-launcher.jar <Jarファイル名> -standalone [AZAREA-Clusterオプショ
ン] [アプリケーション引数 1 アプリケーション引数 2 …]
各引数の意味は以下の通りです。
引数 説明
JARファイル名 実行する JARファイル名を指定します。
AZAREA-Clusterオプション AZAREA-Clusterフレームワークに渡すオプションを「-オプション名=値」
指定します。詳細は次表で説明します。
アプリケーション引数 アプリケーション固有の引数をスペースで区切って渡します。詳細は「7.5
アプリケーション引数」を参照してください。
下表は、AZAREA-Clusterオプションの説明です。
引数 必須 説明
-i=入力パス ○ 「10.3.1 Hadoopコマンドでの実行方法」と同様です。
-o=出力パス ○
-j=[開始ジョブ]-[終了ジョブ]
-inMemoryJoin=サイズ
-awsAccessKeyId=AWS のア
クセスキー
-awsSecretAccessKey=AWS
10 エンティティフローやアプリケーションの実行
136
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
の秘密キー
-d=分散数 アプリケーションを幾つのスレッドで分散して実行するかを指定
します。デフォルトは 1です。
-merge 分散数が 2 以上の場合、出力エンティティは複数ファイルに分割
されて出力されます。mergeオプションを指定すると、1ファイル
にまとめて出力されます。
-binary ジョブ間の中間エンティティファイルをバイナリ形式で出力しま
す。デフォルトではテキスト形式です。
こちらの方が高速なので、指定することを推奨します。
-storage=作業用フォルダー
のパス
フレームワークが使用する作業用フォルダーを指定します
(「file://」の指定は不要です)。デフォルトでは、カレントディ
レクトリ下の azarea/storageとなります。
大量データを処理する場合は、大量のディスクアクセスが行われ
るので、高性能なディスクを作業用フォルダーとして使用すると
処理時間が短縮されます。
オプションを複数回指定すると、複数の作業用フォルダーが使用
され、パフォーマンスが向上する場合があります。1つのスレッド
は 1 つの作業用フォルダーしか使用しないため、分散数以上の作
業用フォルダーを指定しても効果はありません。
以下はコマンドの例です。
java –jar azarea-cluster-launchar.jar test.jar -standalone –i=file:///test/in1 –i=file:/
//test/in2 –o=file:///test/out –storage=/storage1 –storage=/storage2 –j=1-3 –binary –d=4
11 プラグインの設定
137
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
11 プラグインの設定
プロジェクトのプロパティで「AZAREA-Clusterプラグイン」を選択すると、プラグインの設定を行うことが
できます。
11.1 インデント
生成されるソースのインデント文字を指定します。タブまたはスペース(2 文字または 4 文字または 8 文字)
が指定可能です。デフォルトではタブです。
11.2 ファイルヘッダ
エンティティクラスやエンティティフロークラスのソースが生成される際、ソースの先頭に付加されるファイ
ルヘッダを指定します。
11.3 デフォルトパッケージ
エンティティクラスを生成する際にパッケージが指定されていない場合は、ここで設定されたデフォルトパッ
ケージに生成されます。
11.4 DB の数値型を int 型に変換する桁数
DB上のテーブルをエンティティクラスに変換する際の設定です。詳細は「8.3.4データベースの列の型とエン
ティティの列の型とのマッピング」を参照してください。なお、デフォルトは 0です。
11.5 javac コマンド
MapReduceジョブ表示機能(「6.4.6(6) MapReduceジョブ表示」参照)では、エンティティフロークラスのコ
11 プラグインの設定
138
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
ンパイルを行います。そのためのコマンドを指定します。デフォルトでは「javac」です。
特定のバージョンの Javaコンパイラを利用したい場合や、コンパイラオプションを指定したい場合に利用しま
す。
12 サンプル
139
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
12 サンプル
12.1 概要
本章では、AZAREA-Clusterのサンプルアプリケーションを幾つか紹介します。
サンプルアプリケーションのソースの場所については「3.2 AZAREA-Clusterプラグインのインストール」を
参照してください。
12.2 WordCount のサンプル
Hadoopで一般的なWordCountのサンプルです。テキストファイルに各単語が何回ずつ現れるかを数えます。
(1) エンティティ定義
TextEntity
プロパティ キー 型 フォーマット デフォルト
text String
WordCountEntity
プロパティ キー 型 フォーマット デフォルト
word 1 String
count int 1
12 サンプル
140
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) エンティティフロー図
(3) ソースコード
public class WordCounterFlow extends EntityFlow {
@Override
protected void initialize() {
@Diagram(x = 40, y = 40)
EntityFile<TextEntity> text = getInput(TextEntity.class, "text.txt");
@Diagram(x = 40, y = 160)
Conversion<TextEntity, WordCountEntity> conversion =
new Conversion<TextEntity, WordCountEntity>(text) {
@Override
protected void convert(TextEntity entity) {
StringTokenizer tokenizer = new StringTokenizer(entity.text);
while (tokenizer.hasMoreTokens()) {
WordCountEntity word = new WordCountEntity();
word.word = tokenizer.nextToken();
output(word);
}
}
12 サンプル
141
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
};
@Diagram(x = 40, y = 280, outputX = 40, outputY = 400)
Group<WordCountEntity> group =
new Group<WordCountEntity>(conversion, "word") {
@Override
protected void doSummarize(WordCountEntity summary,
WordCountEntity another) {
summary.count += another.count;
}
};
setOutput(group);
}
}
(4) 説明
TextEntityは、テキストファイルの行全体を 1列とみなすエンティティです。まずテキストファイルを
TextEntityとして入力し、Conversionで単語に分割します。そして、Groupにより単語数を集計します。
WordCountEntityでは countの初期値を 1と定義しているので、エンティティフロー中では初期化をして
いません。
(5) 実行結果
入力( text.txt )41
NASA's Curiosity rover is three months into its two-year mission on Mars as it investigates
whether conditions there ever could have supported microbial life. Researchers are interested not
only in ancient Mars but present-day Mars so they can plan future travel to the Red Planet.
"It's a pretty dynamic environment. If you were standing next to Curiosity, you'd realize you're on
a planet with an atmosphere -- an atmosphere that is thick enough that when the sun heats the
ground every day, gusty winds rush up and down the slopes of Gale Crater and Mount Sharp and
spawn whirlwinds that sweep across the landscape. But the atmosphere isn't thick enough to
shield you from the harsh ultraviolet light and the natural high-energy radiation coming in from
space," Vasavada said.
…
WordCountEntity ※順不同
#word count
... ...
is 13
its 1
learn 2
41 http://www.voanews.com/content/curiosity-rover-mars-human/1547165.html
12 サンプル
142
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
learning 1
... ...
12.3 Group のサンプル
顧客別に売上金額の平均値を算出します。Groupだけでは実現できないため、前後で Conversionを利用しま
す。
(1) エンティティ定義
SalesEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
itemCode 2 String
amount BigDecimal 15,0 0
SalesAverageEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
count int 1
amount BigDecimal 15,2 0
12 サンプル
143
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) エンティティフロー図
(3) ソースコード
public class SalesAverageFlow extends EntityFlow {
@Override
protected void initialize() {
@Diagram(x = 40, y = 40)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 40, y = 160)
Conversion<SalesEntity, SalesAverageEntity> conversion1 =
new Conversion<SalesEntity, SalesAverageEntity>(sales) {
@Override
protected void convert(SalesEntity entity) {
SalesAverageEntity result = new SalesAverageEntity();
12 サンプル
144
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
result.customerId = entity.customerId;
result.amount = entity.amount;
output(result);
}
};
@Diagram(x = 39, y = 279)
Group<SalesAverageEntity> group =
new Group<SalesAverageEntity>("group", conversion1, "customerId") {
@Override
protected void doSummarize(SalesAverageEntity summary,
SalesAverageEntity another) {
summary.count += another.count;
summary.amount = summary.amount.add(another.amount);
}
};
@Diagram(x = 40, y = 400, outputX = 40, outputY = 520)
Conversion<SalesAverageEntity, SalesAverageEntity> conversion2 =
new Conversion<SalesAverageEntity, SalesAverageEntity>(group) {
@Override
protected void convert(SalesAverageEntity entity) {
entity.amount = entity.amount.divide(new BigDecimal(entity.count),
2,
RoundingMode.HALF_UP);
output(entity);
}
};
setOutput(conversion2);
}
}
(4) 説明
まず、Conversion により売上エンティティを集計用のエンティティに変換します。次に、Group で売上
金額の合計と件数を集計します。最後に、Conversionで平均値を求めます。
なお、処理は 3つですが、1つのMapReduceジョブで実行されます。
(5) 実行結果
入力( SalesEntity )
#customerId itemCode amount
C101 I1 1000
C101 I2 2200
12 サンプル
145
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
C102 I1 2500
C102 I2 3000
C102 I3 4200
C103 I2 1700
出力( SalesAverageEntity ) ※順不同
#customerId count amount
C101 2 1600.00
C102 3 3233.33
C103 1 1700.00
12.4 GroupSort のサンプル
GroupSortを利用し、商品別に売上金額の順位を算出します。
(1) エンティティ定義
SalesEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
itemCode 2 String
amount BigDecimal 15,0 0
SalesOrderEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
itemCode 2 String
order int
amount BigDecimal 15,0 0
12 サンプル
146
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) エンティティフロー図
(3) ソースコード
public class SalesOrderFlow extends EntityFlow {
@Override
protected void initialize() {
@Diagram(x = 40, y = 40)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 40, y = 160, outputX = 40, outputY = 280)
GroupSort<SalesEntity, SalesOrderEntity> groupSort =
new GroupSort<SalesEntity, SalesOrderEntity>(sales,
"itemCode",
GroupSort.DELIMITER,
"amount DESC") {
@Override
protected void merge(List<SalesEntity> entities) {
int order = 1;
for (SalesEntity entity : entities) {
SalesOrderEntity result = new SalesOrderEntity();
result.customerId = entity.customerId;
result.itemCode = entity.itemCode;
result.amount = entity.amount;
result.order = order++;
output(result);
}
}
12 サンプル
147
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
};
setOutput(groupSort);
}
}
(4) 説明
GroupSortを利用して売上エンティティを商品コードでグループ化し、更に売上金額の降順でソートしま
す。そして、同一商品コード内で 1から順に連番を振ります。
なお、本サンプルでは売上金額が同一の場合を考慮していません。仮に同一商品で同一売上金額のエンテ
ィティが複数ある場合、それらの順序は不定になります。
(5) 実行結果
入力( SalesEntity )
#customerId itemCode amount
C101 I1 1000
C101 I2 2200
C102 I1 2500
C102 I2 3000
C102 I3 4200
C103 I2 1700
出力( SalesOrderEntity ) ※順不同
#customerId itemCode order amount
C102 I1 1 2500
C101 I1 2 1000
C102 I2 1 3000
C101 I2 2 2200
C103 I2 3 1700
C102 I3 1 4200
12.5 UniqueJoin とGroup のサンプル
UniqueJoinと Groupを利用し、売上金額を顧客の居住地域毎に集計します。
(1) エンティティ定義
SalesEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
itemCode 2 String
amount BigDecimal 15,0 0
CustomerEntity
プロパティ キー 型 フォーマット デフォルト
12 サンプル
148
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
customerId 1 String
area String
AreaSummaryEntity
プロパティ キー 型 フォーマット デフォルト
area 1 String
customerCount long 1
amount BigDecimal 15,0 0
(2) エンティティフロー図
(3) ソースコード
public class AreaSummaryFlow extends EntityFlow {
@Override
protected void initialize() {
12 サンプル
149
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
@Diagram(x = 40, y = 40)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 324, y = 160)
EntityFile<CustomerEntity> customer = getInput(CustomerEntity.class);
@Diagram(x = 40, y = 160)
Group<SalesEntity> group1 = new Group<SalesEntity>(sales, "customerId") {
@Override
protected void doSummarize(SalesEntity summary, SalesEntity another) {
summary.amount = summary.amount.add(another.amount);
}
};
@Diagram(x = 160, y = 280)
UniqueJoin<SalesEntity, CustomerEntity, AreaSummaryEntity> join =
new UniqueJoin<SalesEntity, CustomerEntity, AreaSummaryEntity>(
"join", group1, customer, "customerId") {
@Override
protected void merge(SalesEntity main, CustomerEntity sub) {
AreaSummaryEntity result = new AreaSummaryEntity();
result.area = sub.area;
result.amount = main.amount;
output(result);
}
@Override
protected void merge(SalesEntity main) {
// NOP
}
};
@Diagram(x = 160, y = 400, outputX = 160, outputY = 520)
Group<AreaSummaryEntity> group2 =
new Group<AreaSummaryEntity>(join, "area") {
@Override
protected void doSummarize(AreaSummaryEntity summary,
AreaSummaryEntity another) {
summary.customerCount += another.customerCount;
summary.amount = summary.amount.add(another.amount);
}
};
setOutput(group2);
}
12 サンプル
150
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
}
(4) 説明
まず、Groupにより売上エンティティを顧客毎に集計します。実際にはこれが無くても同じ結果が得られ
ますが、予め集計してエンティティ数を減らしておくことにより、パフォーマンスが向上します。
次に、売上エンティティと顧客エンティティを結合します。顧客 ID に対して顧客エンティティは一意に
定まるので、UniqueJoinを利用します。
最後に、結合結果のエンティティを地域毎に集計します。
(5) 実行結果
入力( SalesEntity )
#customerId itemCode amount
C101 I1 1000
C101 I2 2200
C102 I1 2500
C102 I2 3000
C102 I3 4200
C103 I2 1700
入力( CustomerEntity )
#customerId area
C101 東京
C102 神奈川
C103 東京
出力( AreaSummaryEntity ) ※順不同
#area customerCount amount
東京 2 4900
神奈川 1 9700
12.6 EntityFlow の分割のサンプル
「12.5 UniqueJoinとGroup」の EntityFlowクラスを 2つに分割する例です。
(1) エンティティ定義
「12.5 UniqueJoinとGroup」と同じです。
12 サンプル
151
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) エンティティフロー図
(3) ソースコード
public class AreaSummaryFlow1 extends EntityFlow {
@Override
12 サンプル
152
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
protected void initialize() {
@Diagram(x = 40, y = 40)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 40, y = 160, outputX = 40, outputY = 280)
Group<SalesEntity> group1 = new Group<SalesEntity>(sales, "customerId") {
@Override
protected void doSummarize(SalesEntity summary, SalesEntity another) {
summary.amount = summary.amount.add(another.amount);
}
};
setIntermediateOutput(group1, "CustomerSalesEntity.txt");
}
}
public class AreaSummaryFlow2 extends EntityFlow {
@Override
protected void initialize() {
@Diagram(x = 40, y = 40)
EntityFile<SalesEntity> sales =
getInput(SalesEntity.class, "CustomerSalesEntity.txt");
@Diagram(x = 350, y = 40)
EntityFile<CustomerEntity> customer = getInput(CustomerEntity.class);
@Diagram(x = 160, y = 160)
UniqueJoin<SalesEntity, CustomerEntity, AreaSummaryEntity> join =
new UniqueJoin<SalesEntity, CustomerEntity, AreaSummaryEntity>(
"join", sales, customer, "customerId") {
@Override
protected void merge(SalesEntity main, CustomerEntity sub) {
AreaSummaryEntity result = new AreaSummaryEntity();
result.area = sub.area;
result.amount = main.amount;
output(result);
}
@Override
protected void merge(SalesEntity main) {
// NOP
}
};
@Diagram(x = 160, y = 280, outputX = 160, outputY = 400)
Group<AreaSummaryEntity> group2 =
12 サンプル
153
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
new Group<AreaSummaryEntity>(join, "area") {
@Override
protected void doSummarize(AreaSummaryEntity summary,
AreaSummaryEntity another) {
summary.customerCount += another.customerCount;
summary.amount = summary.amount.add(another.amount);
}
};
setOutput(group2);
}
}
public class AreaSummaryApplication extends EntityFlowManager {
@Override
protected void initializeEntityFlow() throws IOException {
addEntityFlow(new AreaSummaryFlow1());
addEntityFlow(new AreaSummaryFlow2());
}
}
(4) 説明
「12.5 UniqueJoinとGroup」のエンティティフローを、最初の Groupと UniqueJoin以降とで分割して
います。2 つのエンティティフローを連結するために、最初の Groupの次に setOutputを追加しています
(「中間出力」であることに注意してください)。実行結果は、パフォーマンスも含めて「12.5 UniqueJoin
とGroup」と同じになります。
(5) 実行結果
「12.5 UniqueJoinとGroup」と同じです。
12.7 Conversion と openOutput、getEntityCollection のサンプル
Conversion と openOutput を利用し、売上金額を閾値より小さいものと大きいものに分類します。閾値は
getEntityCollectionによりエンティティファイルから取得します。
(1) エンティティ定義
SalesEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
itemCode 2 String
amount BigDecimal 15,0 0
ThresholdEntity
プロパティ キー 型 フォーマット デフォルト
value BigDecimal 15,0
12 サンプル
154
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(2) エンティティフロー図
(3) ソースコード
public class ClassificationFlow extends EntityFlow {
@Override
protected void initialize() {
@Diagram(x = 180, y = 35)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 180, y = 162, outputX = 181, outputY = 393)
Conversion<SalesEntity, SalesEntity> big =
new Conversion<SalesEntity, SalesEntity>(sales) {
@Diagram(x = 422, y = 257, outputX = 423, outputY = 390)
private final Outputable<SalesEntity> small =
openOutput(SalesEntity.class);
private final ThresholdEntity threshold = getEntityManager().
getEntityCollection(ThresholdEntity.class).getFirstEntity();
@Override
protected void convert(SalesEntity entity) {
if (entity.amount.compareTo(threshold.value) >= 0) {
12 サンプル
155
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
output(entity);
} else {
small.output(entity);
}
}
};
setOutput(big, "BigSales.txt");
setOutput(big.getOutput(SalesEntity.class), "SmallSales.txt");
}
}
(4) 説明
Conversion の初期化時、openOutput によりもう 1 つの出力先を開きます。また、EntityCollection
を利用してエンティティファイルから直接閾値エンティティを読み込みます。入力された売上エンティティ
の値が閾値エンティティ以上であれば通常の出力先、そうでなければもう 1つの出力先に出力します。
(5) 実行結果
入力( SalesEntity )
#customerId itemCode amount
C101 I1 1000
C101 I2 2200
C102 I1 2500
C102 I2 3000
C102 I3 4200
C103 I2 1700
入力( ThresholdEntity )
#value
2500
出力( "BigSales.txt" : SalesEntity ) ※順不同
#customerId itemCode amount
C102 I1 2500
C102 I2 3000
C102 I3 4200
出力( "SmallSales.txt" : SalesEntity ) ※順不同
#customerId itemCode amount
C101 I1 1000
C103 I2 1700
C101 I2 2200
12 サンプル
156
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
12.8 Sort のサンプル
Sortを利用し、売上金額の最小値と最大値を求めます。
(1) エンティティ定義
SalesEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
itemCode 2 String
amount BigDecimal 15,0 0
MinMaxSalesEntity
プロパティ キー 型 フォーマット デフォルト
min BigDecimal 15,0
max BigDecimal 15,0
(2) エンティティフロー図
(3) ソースコード
public class MinMaxSalesFlow extends EntityFlow {
@Override
protected void initialize() {
@Diagram(x = 40, y = 40)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 40, y = 160, outputX = 40, outputY = 280)
Sort<SalesEntity, MinMaxSalesEntity> sort =
new Sort<SalesEntity, MinMaxSalesEntity>(sales, "amount") {
12 サンプル
157
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
private BigDecimal min;
private BigDecimal max;
@Override
protected void merge(SalesEntity entity) {
if (min == null) {
min = entity.amount;
}
max = entity.amount;
}
@Override
protected void flush() {
MinMaxSalesEntity result = new MinMaxSalesEntity();
result.min = min;
result.max = max;
output(result);
}
};
setOutput(sort);
}
}
(4) 説明
Sortのインスタンス変数で最小値と最大値を保持し、mergeメソッド中で更新します。最後に flushメ
ソッドで出力します。
(5) 実行結果
入力( SalesEntity )
#customerId itemCode amount
C101 I1 1000
C101 I2 2200
C102 I1 2500
C102 I2 3000
C102 I3 4200
C103 I2 1700
出力( MinMaxSalesEntity )
#min max
1000 4200
12.9 Join、Union とApplicationContext のサンプル
「指定された地域に居住する顧客 または 指定された興味を持つ顧客 の売上を検索する」エンティティフロー
12 サンプル
158
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
です。売上に対応する地域や興味を得るためには、Joinを利用します。OR条件を実現するためには、Unionを
利用します。アプリケーション引数で指定された条件をエンティティフローに渡すためには、
ApplicationContextを利用します。
(1) エンティティ定義
SalesEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
itemCode 2 String
amount BigDecimal 15,0 0
CustomerEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
area String
CustomerInterestEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String
interest String
(2) エンティティフロー図
12 サンプル
159
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(3) ソースコード
public class SearchSalesFlow extends EntityFlow {
@Override
protected void initialize() {
final String targetArea = getApplicationContext().getString("area");
final String targetInterest = getApplicationContext().getString("interest");
@Diagram(x = 301, y = 34)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 30, y = 35)
EntityFile<CustomerEntity> customer = getInput(CustomerEntity.class);
@Diagram(x = 160, y = 160)
UniqueJoin<SalesEntity, CustomerEntity, SalesEntity> customerJoin =
new UniqueJoin<SalesEntity, CustomerEntity, SalesEntity>(
sales, customer, "customerId") {
@Override
protected void merge(SalesEntity main, CustomerEntity sub) {
if (sub.area.equals(targetArea)) {
output(main);
}
}
@Override
protected void merge(SalesEntity main) {
// NOP
}
};
@Diagram(x = 567, y = 36)
EntityFile<CustomerInterestEntity> interest =
getInput(CustomerInterestEntity.class);
@Diagram(x = 436, y = 159)
Join<SalesEntity, CustomerInterestEntity, SalesEntity> interestJoin =
new Join<SalesEntity, CustomerInterestEntity, SalesEntity>(
sales, interest, "customerId") {
@Override
protected void merge(SalesEntity main,
List<CustomerInterestEntity> subs) {
for (CustomerInterestEntity sub : subs) {
if (sub.interest.equals(targetInterest)) {
output(main);
}
12 サンプル
160
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
}
}
};
@Diagram(x = 289, y = 280)
Union<SalesEntity> union =
new Union<SalesEntity>(customerJoin, interestJoin);
@Diagram(x = 288, y = 401, outputX = 288, outputY = 523)
Conversion<SalesEntity, SalesEntity> conversion =
new Conversion<SalesEntity, SalesEntity>(union) {
@Override
protected void convert(SalesEntity entity) {
output(entity);
}
};
setOutput(conversion, "Result.txt");
}
}
public class SearchSalesApplication extends EntityFlowManager {
@Override
protected void initializeContext(List<String> args) throws IOException {
if (args.size() != 2) {
throw new IllegalArgumentException("引数は 2個指定してください。");
}
getApplicationContext().setString("area", args.get(0));
getApplicationContext().setString("interest", args.get(1));
}
@Override
protected void initializeEntityFlow() throws IOException {
addEntityFlow(new SearchSalesFlow());
}
}
(4) 説明
アプリケーション引数は、SearchSalesApplication クラスの initializeContext メソッド内で
ApplicationContextに格納されます。それを SearchSalesFlow側で ApplicationContextから取り出し
ます。
12 サンプル
161
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
顧客 IDに対して顧客エンティティは一意に定まるので、UniqueJoinにより結合して条件を判定します。
顧客 IDに対して顧客興味エンティティは複数あり得るので、Joinにより結合して条件を判定します。2つ
の結合結果を Union によりまとめます。Union から直接 setOutput に連結することはできないので、
Conversionを挟んでいます。
(5) 実行結果
入力(アプリケーション引数)
神奈川 スポーツ
入力( SalesEntity )
#customerId itemCode amount
C101 I1 1000
C101 I2 2200
C102 I1 2500
C102 I2 3000
C102 I3 4200
C103 I2 1700
入力( CustomerEntity )
#customerId area
C101 東京
C102 神奈川
C103 東京
入力( CustomerInterestEntity )
#customerId area
C101 映画
C101 園芸
C102 園芸
C103 映画
C103 スポーツ
出力( SalesEntity ) ※順不同
#customerId itemCode amount
C102 I1 2500
C102 I2 3000
C102 I3 4200
C103 I2 1700
なお、Hadoop上で実行する場合は、以下のように引数を指定します。
hadoop jar xxx.jar –i=/xxx/xxx –o=/xxx/xxx 神奈川 スポーツ
12 サンプル
162
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
12.10 データベース連携のサンプル(1)42
売上テーブルと商品テーブルをテキストファイルに変換し、AZAREA-Clusterアプリケーションで集計後、商
品カテゴリ別売上テーブルに結果を格納します。
(1) テーブル定義
SALES
列名 キー 型 桁数 デフォルト
CUSTOMER_ID 1 CHAR 4
ITEM_CODE 2 CHAR 2
AMOUNT DECIMAL 15,0 0
ITEM
列名 キー 型 桁数 デフォルト
ITEM_CODE 1 CHAR 2
ITEM_CATEGORY CHAR 1
ITEM_CATEGORY_SALES
列名 キー 型 桁数 デフォルト
ITEM_CATEGORY 1 CHAR 1
AMOUNT DECIMAL 15,0 0
(2) 設定ファイル
環境設定ファイル( mysql.properties )
common.type=env
dbconfig.db.dbms=MySQL
dbconfig.db.hostName=AZSERVER
dbconfig.db.port=3306
dbconfig.db.dbName=AZAREA
dbconfig.db.userName=azuser
dbconfig.db.password=xxxxxx
dbconfig.db.schema=
local.basicFolder=/tmp/azarea
タスク設定ファイル( sales.properties )
common.type=task
flow.direction=export
common.dbconfig=db
common.tableName=SALES
42 このサンプルは評価版には含まれていません。ご了承ください。
12 サンプル
163
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
common.textFileName=in/SalesEntity.txt
common.textEnc=utf-8
タスク設定ファイル( item.properties )
common.type=task
flow.direction=export
common.dbconfig=db
common.tableName=ITEM
common.textFileName=in/ItemEntity.txt
common.textEnc=utf-8
タスク設定ファイル( item_category_sales.properties )
common.type=task
flow.direction=export
common.dbconfig=db
common.tableName=ITEM_CATEGORY_SALES
common.textFileName=out/ItemCategorySalesEntity.txt
common.textEnc=utf-8
import.writeMode=drop
ジョブ設定ファイル( export-job.properties )
common.type=job
file.env=mysql.properties
file.task.1=sales.properties
file.task.2=item.properties
ジョブ設定ファイル( import-job.properties )
common.type=job
file.env=mysql.properties
file.task.1=item_category_sales.properties
(3) エンティティ定義
SalesEntity
プロパティ キー 型 フォーマット デフォルト
customerId 1 String 4
itemCode 2 String 2
amount BigDecimal 15,0 0
12 サンプル
164
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
ItemEntity
プロパティ キー 型 フォーマット デフォルト
itemCode 1 String 2
itemCategory String 1
ItemCategorySalesEntity
プロパティ キー 型 フォーマット デフォルト
itemCategory 1 String 1
amount String 15,0 0
(4) エンティティフロー図
(5) ソースコード
public class DbSampleFlow1 extends EntityFlow {
@Override
protected void initialize() {
getEntityManager().defineDefaultOutputEntityFormat(
DelimitedEntityFormat.comment(null));
12 サンプル
165
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
@Diagram(x = 74, y = 76)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 352, y = 81)
EntityFile<ItemEntity> item = getInput(ItemEntity.class);
@Diagram(x = 207, y = 206)
UniqueJoin<SalesEntity, ItemEntity, ItemCategorySalesEntity> uniqueJoin1 =
new UniqueJoin<SalesEntity, ItemEntity, ItemCategorySalesEntity>(
"uniqueJoin1", sales, item, "itemCode") {
@Override
protected void merge(SalesEntity main, ItemEntity sub) {
ItemCategorySalesEntity result = new ItemCategorySalesEntity();
result.copyFrom(sub);
result.copyFrom(main);
output(result);
}
@Override
protected void merge(SalesEntity main) {
// NOP
}
};
@Diagram(x = 209, y = 329, outputX = 208, outputY = 455)
Group<ItemCategorySalesEntity> group1 = new Group<ItemCategorySalesEntity>(
"group1", uniqueJoin1, "itemCategory") {
@Override
protected void doSummarize(ItemCategorySalesEntity summary,
ItemCategorySalesEntity another) {
summary.amount = summary.amount.add(another.amount);
}
};
setOutput(group1);
}
}
(6) シェルスクリプト
#!/bin/sh
rm -f /tmp/azarea/in/*
dbtxt/dbtxt.sh conf/export-job.properties
hadoop fs -rmr /azarea/in
hadoop fs -put /tmp/azarea/in /test/in
12 サンプル
166
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
hadoop fs -rmr /azarea /out
hadoop jar DbSampleFlow1.jar -i=/azarea /in -o=/azarea /out
rm -f /tmp/azarea/out/*
hadoop fs -getmerge /azarea /out/ItemCategorySalesEntity.txt /tmp/azarea/out/ItemCat
egorySalesEntity.txt
dbtxt/dbtxt.sh conf/import-job.properties
「dbtxt.sh」はデータベーステキスト変換ツールです。
なお、エラー処理は省略しています。
(7) 説明
まず、データベーステキスト変換ツールにより、売上テーブルと商品テーブルをテキストファイルに変換
します。そして、そのテキストファイルをHDFSにコピーします。
次に、AZAREA-Clusterアプリケーションを実行します。アプリケーションでは、売上データと商品デー
タを結合し、商品カテゴリ毎に集計します。
最後に、HDFSから集計結果を取得します。そして、データベーステキスト変換ツールにより、商品カテ
ゴリ別売上テーブルに挿入します。
(8) 実行結果
入力( SALES )
CUSTOMER_ID ITEM_CODE AMOUNT
C101 I1 1000
C101 I2 2200
C102 I1 2500
C102 I2 3000
C102 I3 4200
C103 I2 1700
入力( ITEM )
ITEM_CODE ITEM_CATEGORY
I1 A
I2 B
I3 B
出力( ITEM_CATEGORY_SALES ) ※順不同
ITEM_CATEGORY AMOUNT
A 3500
B 11100
12 サンプル
167
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
12.11 データベース連携のサンプル(2)43
「12.10 データベース連携のサンプル(1)」と同様、売上データを商品カテゴリ毎に集計する例です。この例で
は、商品テーブルをテキストファイルに変換せずに、AZAREA-Clusterアプリケーションからデータベースを参
照します。カスタムコンポーネントを用意し、そこから商品テーブルを参照します。
(1) テーブル定義
「12.10 データベース連携のサンプル(1)」と同様です。
(2) 設定ファイル
環境設定ファイルとタスク設定ファイルについては「12.10 データベース連携のサンプル(1)」と同様で
す。
ジョブ設定ファイル( export-sales.properties )
common.type=job
file.env=mysql.properties
file.task.1=sales.properties
ジョブ設定ファイル( export-item.properties )
common.type=job
file.env=mysql.properties
file.task.1=item.properties
ジョブ設定ファイル( import-job.properties )
common.type=job
file.env=mysql.properties
file.task.1=item_category_sales.properties
(3) エンティティ定義
「12.10 データベース連携のサンプル(1)」と同様です。
43 このサンプルは評価版には含まれていません。ご了承ください。
12 サンプル
168
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
(4) エンティティフロー図
(5) ソースコード
@CustomComponent
public class ItemManager {
private final EntityCollection<ItemEntity> items;
public ItemManager(EntityManager entityManager) {
// 全ての商品エンティティを取得する
items = entityManager.getEntityCollection(ItemEntity.class);
}
public String getItemCatetory(String itemCode) {
// 商品コードに対応する商品カテゴリを返す
return items.getEntity(itemCode).itemCategory;
}
}
public class DbSampleFlow2 extends EntityFlow {
12 サンプル
169
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
@Override
protected void initialize() {
getEntityManager().defineDefaultOutputEntityFormat(
DelimitedEntityFormat.comment(null));
@Diagram(x = 206, y = 74)
EntityFile<SalesEntity> sales = getInput(SalesEntity.class);
@Diagram(x = 207, y = 206)
Conversion<SalesEntity, ItemCategorySalesEntity> conversion1 =
new Conversion<SalesEntity, ItemCategorySalesEntity>(
"conversion1", sales) {
@Diagram(x = 448, y = 264)
private final ItemManager itemManager =
new ItemManager(getEntityManager());
@Override
protected void convert(SalesEntity entity) {
ItemCategorySalesEntity result = new ItemCategorySalesEntity();
result.amount = entity.amount;
result.itemCategory = itemManager.getItemCatetory(entity.itemCode);
output(result);
}
};
@Diagram(x = 209, y = 329, outputX = 208, outputY = 455)
Group<ItemCategorySalesEntity> group1 = new Group<ItemCategorySalesEntity>(
"group1", conversion1, "itemCategory") {
@Override
protected void doSummarize(ItemCategorySalesEntity summary,
ItemCategorySalesEntity another) {
summary.amount = summary.amount.add(another.amount);
}
};
setOutput(group1);
}
}
public class DbSampleApplication2 extends EntityFlowManager {
@Override
protected void checkArguments(List<String> args) {
EntityDbMappingLoader loader = new EntityDbMappingLoader();
loader.load(getConfiguration(), getOptions(),
new Path("/azarea/conf/export-item.properties"));
12 サンプル
170
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
}
@Override
protected void initializeEntityFlow() throws IOException {
addEntityFlow(new DbSampleFlow2());
}
public static void main(String[] args) throws Exception {
Main.execute(DbSampleApplication2.class.getName(), args);
}
}
(6) シェルスクリプト
#!/bin/sh
rm -f /tmp/azarea/in/*
dbtxt/dbtxt.sh conf/export-job.properties
hadoop fs -rmr /azarea/in
hadoop fs -put /tmp/azarea/in /test/in
hadoop fs -rmr /azarea/conf
hadoop fs –put conf /azarea/
hadoop fs -rmr /azarea /out
hadoop jar DbSampleFlow1.jar -i=/azarea /in -o=/azarea /out
rm -f /tmp/azarea/out/*
hadoop fs -getmerge /azarea /out/ItemCategorySalesEntity.txt /tmp/azarea/out/ItemCat
egorySalesEntity.txt
dbtxt/dbtxt.sh conf/import-job.properties
(7) 説明
まず、データベーステキスト変換ツールにより、売上テーブルをテキストファイルに変換します。そして、
そのテキストファイルをHDFSにコピーします。また、設定ファイルもHDFSにコピーします。
次に、AZAREA-Clusterアプリケーションを実行します。アプリケーションでは、売上データと商品デー
タを結合し、商品カテゴリ毎に集計します。商品データは設定ファイルに基づいてデータベースから取得し
ます。
最後に、HDFSから集計結果を取得します。そして、データベーステキスト変換ツールにより、商品カテ
ゴリ別売上テーブルに挿入します。
(8) 実行結果
「12.10 データベース連携のサンプル(1)」と同様です。
12 サンプル
171
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
13 トラブルシューティング
172
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
13 トラブルシューティング
本章では、発生しがちな問題とその対象方法を説明します。
13.1 Hadoop のエラー
(1) Application xxx failed 1 times due to AM Conatiner for xxx exited with exitCode: 1
Hadoop 2.0系のMapReduce v2でAZAREA-Clusterアプリケーションを動かすと、このようなエラーが
発生しています。MapReduce v2から v1に切り替えてください(「1.4(2) Hadoopのバージョン」の脚注を
参照してください)。
(2) Error: Found interface org.apache.hadoop.mapreduce.TaskAttemptContext, but class was expected
Hadoop 1.0系用のAZAREA-ClusterフレームワークをHadoop 2.0系で動かすと、このようなエラーが
発生しています。Hadoop 2.0系用のAZAREA-Clusterフレームワークを使用するようにしてください。
(3) Error: Found class org.apache.hadoop.mapreduce.TaskAttemptContext, but interface was expected
Hadoop 2.0系用のAZAREA-ClusterフレームワークをHadoop 1.0系で動かすと、このようなエラーが
発生しています。Hadoop 1.0系用のAZAREA-Clusterフレームワークを使用するようにしてください。
13.2 スタンドアローン実行時のエラー
(1) ClassNotFoundException: org.codehaus.jackson.map.JsonMappingException
「10.5.3 Javaコマンドでの実行」のように Javaコマンドで実行した場合、「-standalone」オプション
を指定していないと、このようなエラーが発生します。
13.3 Oozie のエラー
(1) Output directory not set in JobConf
AZAREA-Clusterフレームワークが組み込まれていないOozieでAZAREA-Clusterアプリケーションを
動かすと、このようなエラーが発生します。「10.4.2(3) AZAREA-Clusterフレームワークの組み込み」を行
ってください。
173
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
変更履歴
版数 日付 変更箇所 変更内容
0.9.0 2012/12/12 評価版を公開
0.9.1 2013/1/18 5.3.4 値のフォーマット 数値型や Date 型において、前後の半角スペースをトリムするよ
うにしました。
6.4.3 エンティティファイ
ルや処理の編集
エンティティファイルや処理の位置情報をアノテーションとし
てソースに保存するようにしました。
エンティティファイルや処理を複数個同時に移動できるように
しました。
ドラッグで矩形範囲を指定することにより、複数のエンティティ
ファイルや処理を選択できるようにしました。
6.4.4 エンティティファイ
ルや処理の詳細
Sortクラスに getLastEntityメソッドを追加しました。
GroupSortクラスのgetLastEntityメソッドでは、isFirstが true
の場合に nullを返すようにしました。
6.4.5 エンティティフロー
の編集の終了
エンティティファイルや処理をダブルクリックしてもソースコ
ードを更新できるようにしました。
6.4.6 その他の機能 エンティティファイルや処理を全選択する機能を追加しました。
6.4.4 エンティティファイ
ルや処理の詳細
エンティティファイルや処理に表示名を設定できるようにしま
した。処理の表示名は、ログやカウンタにも出力されます。
9.3.2 コンソール出力の見
方
9.3.3 カウンタの見方
6.4.4 エンティティファイ
ルや処理の詳細
(8) GroupSort
同一グループのエンティティ数が非常に多い場合のために、エン
ティティを1つずつ引数に取るメソッドを生成できるようにしま
した(今までは手で作成する必要がありました)。
6.7.5 グループ化処理 パフォーマンスを考慮したGroupとGroupSortの使い分けにつ
いて記述しました。
- 実行計画エンジンによる処理最適化を改善しました。
0.9.2 2013/5/7 1.4 実行環境
(2) Hadoopのバージョン
Amazon Elastic MapReduceを追加しました。
3.2 AZAREA-Cluster プラ
グインのインストール
toolフォルダと dbフォルダを追加しました。
5.4.1 Excel ファイルによる
スキーマの定義
プラグインの設定でデフォルトのエンティティパッケージを指
定できるようにしました。
11.3 デフォルトパッケージ
6.4.4 エンティティファイ
ルや処理の詳細
各エンティティファイルや処理にコメント欄を追加しました。
カスタムコンポーネントを追加しました。
6.4.6 その他の機能 縮小表示/通常表示機能を追加しました。
コメントの表示/非表示機能を追加しました。
6.6.2 エンティティファイ
ルの直接アクセス
エンティティファイル名を指定してEntityCollectionを取得する
際、エンティティクラスも明示的に指定するようにしました。
6.6.4.3 アプリケーションコ
ンテキストの参照
アプリケーションコンテキストからもアプリケーション引数を
取得できるようにしました。
174
Copyright © 2012 CAC Corporation. All rights reserved.
AZAREA-Cluster 開発ガイド
7.5 アプリケーション引数
7.4 アプリケーションの編
集
エンティティフロー選択画面においてパッケージをツリーから
選択するよう変更しました。
フロー図表示画面に概要フロー表示機能と縮小表示機能を追加
しました。
8. データベース連携とオン
ライン連携
新たに章を追加しました。
10.3.1 Hadoop コマンドで
の実行方法
「-b」を「-binary」に変更しました。
10.5 スタンドアローンな J
ava VM上での実行
新たに章を追加しました。
11.4 DB の数値型を int 型
に変換する桁数
新たに章を追加しました。
12.10 データベース連携の
サンプル(1)
サンプルを追加しました。
12.11 データベース連携の
サンプル(2)
13.2 スタンドアローン実行
時のエラー
新たに章を追加しました。
Top Related