azarea-cluster 開発ガイド - amazon s3...です。yahoo、facebook、twitter など有力なit...

174
1 Copyright © 2012 CAC Corporation. All rights reserved. AZAREA-Cluster 開発ガイド AZAREA-Cluster 開発ガイド Version 0.9.2

Upload: others

Post on 22-May-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

1

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

AZAREA-Cluster 開発ガイド

Version 0.9.2

Page 2: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 3: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 4: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 5: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 6: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

AZAREA-Cluster開発ガイド

本書の著作権は株式会社シーエーシーが保有します。

「AZAREA」は株式会社シーエーシーの登録商標です。

本書に記載されている会社名または製品名は各社の商標または登録商標です。

Page 7: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 プラグ

インも用意しています。

Page 8: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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フレームワーク

開発支援

シミュレータ

Page 9: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

フレームワーク

アプリケーション

Page 10: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 11: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

フレームワーク上のアプリケーションは同じで構いません。

Page 12: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 13: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

エンティティ

Page 14: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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ジョブに変換されるかは、処理

の内容によります。

エンティティフロー

グループ化

エンティティ

エンティティ エンティティ エンティティ 結合

Page 15: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

2 AZAREA-Cluster における概念

15

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

Hadoop

アプリケーション

エンティティフロー エンティティフロー

グループ

結合 エンテ

ィティ 変換 エンテ

ィティ

エンテ

ィティ

エンテ

ィティ

エンテ

ィティ

MapReduceジョブ1 MapReduceジョブ2

実行計画エンジン

Page 16: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 (データベース関連)

Page 17: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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プラグインのバージョンを確認することができます。

Page 18: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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系を利用する場合です。

Page 19: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

4 簡単なアプリケーションの開発

19

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

(4) 空のエンティティフロークラスの作成

パッケージエクスプローラで「tutorial.flow」パッケージを選択し、ツールバーのアイコン をクリ

ックしてください。ダイアログが表示されるので、クラス名に「TutorialFlow」と入力して「OK」を押し

てください。

すると、空の TutorialFlowクラスが作成され、同時にエンティティフロー編集画面が開きます。

エンティティフロー編集画面は、エンティティフロークラスを選択してアイコン をクリックすること

Page 20: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

4 簡単なアプリケーションの開発

20

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

により開くこともできます。

(5) エンティティクラスの作成

まず、エンティティクラスを作成するパッケージを設定します。「パッケージ選択」ボタンを押下するとダ

イアログが表示されるので、「tutorial.entity」パッケージを選択してください。

追加ボタンを押すと、「エンティティクラスの追加」ダイアログが開きます。そこで、下図のように入力し

て「更新」ボタンを押してください。右側の「+」ボタンを押すことにより、新しい行を追加することがで

きます。

Page 21: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

4 簡単なアプリケーションの開発

21

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

エンティティクラスは、Excelファイルから生成することもできます。

(6) エンティティフローの編集

リストボックスで SalesEntity が選択された状態で、「getInput」を右側にドラッグ&ドロップしてく

ださい。これは、入力となるエンティティを表します。

Page 22: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

4 簡単なアプリケーションの開発

22

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

同様に、「Group」と「setOutput」もドラッグ&ドロップしてください。これらは、それぞれグループ化

処理とエンティティの出力処理を表します。

「input1:getInput」の「➘」アイコンをドラッグし、「group1:Group」にドロップしてください。する

Page 23: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

4 簡単なアプリケーションの開発

23

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

と、それらが矢印でつながります。同様に、「group1:Group」の「➘」アイコンをドラッグし、「setOutput」

にドロップしてください。こうすることにより、「入力した SalesEntityをグループ化し、出力する」とい

うエンティティフローが定義されます。

グループ化キーを設定する必要があるので、「group1:Group」の「✎」アイコンをクリックしてください。

「customerCode」を選択して「>」ボタンを押すと、グループ化キーに設定されます。「OK」を押して設

定を終了します。

Page 24: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

4 簡単なアプリケーションの開発

24

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

また、「setOutput」の「✎」アイコンをクリックし、ファイル名に「Result.txt」を入力してください。

これは、処理結果の出力ファイル名を表します。

Page 25: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 =

Page 26: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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」ファイルを作成してください。

Page 27: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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」を押してください。

Page 28: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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」フォルダーの下を確認してください。

Page 29: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

4 簡単なアプリケーションの開発

29

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

Page 30: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

エンティティクラス

Page 31: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 32: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 型の列の値

スキーマで定義されたフォーマットに従って、文字列に変換されます。

Page 33: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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セルに「エンティティ定義」と入力されていないシートは無視されま

す。

エンティティクラス ○ エンティティのクラス名です。完全修飾クラス名またはクラス名のみを

Page 34: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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];

}

可変長のリスト型にしたい場合は、「*」と記述します。その場合、エン

ティティのフィールドは以下のようになります。

Page 35: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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>

Page 36: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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) エンティティクラス編集画面の起動

パッケージエクスプローラでエンティティクラスを選択し、ツールバーのアイコン をクリックすると、

エンティティクラス編集画面が開きます。

また、エンティティフロー編集画面から開くこともできます。左側のパネルで「パッケージ選択ボタン」

を押すと、パッケージ選択ダイアログが開きます。そこでパッケージを選択すると、そのパッケージ直下の

エンティティクラスの一覧が表示されます。そこでエンティティクラスを選択して「編集」ボタンを押すと、

エンティティクラス編集画面が開きます。

Page 37: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

5 エンティティクラス

37

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

「追加」ボタンを押すと、エンティティクラス編集画面が開いて新しいエンティティクラスを作成するこ

とができます。「削除」ボタンを押すと、選択されているエンティティクラスが削除されます。「エクスポー

ト」ボタンを押すと、ファイル保存ダイアログが開き、選択されているパッケージ直下の各エンティティク

ラスの定義をExcelファイルまたはXMLファイルとして保存することができます。

Page 38: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

5 エンティティクラス

38

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

(2) エンティティクラス編集画面の操作

項目 必須 説明

パッケージ エンティティのパッケージです。編集不可です。

クラス名 ○ エンティティのクラス名です。エンティティフロー編集画面から「追

加」ボタンで開いた場合に限り、入力可能です。

説明 エンティティクラスの説明を記述します。エンティティクラスの

Javadocに反映されます。

プロパティ名 ○ エンティティ列のプロパティ名を記述します。プロパティ名はエンテ

ィティクラスの publicフィールド名となります。

他のエンティティ列と重複してはなりません。

列名 エンティティ列を表す名前を記述します。列名は Javadoc に反映され

ます。

キー エンティティを一意に特定するためのキーを指定します。

詳細は「5.4.1 Excelファイルによるスキーマの定義」を参照してくだ

さい。

型 ○ エンティティ列の型をドロップダウンリストから選択します。

詳細は「5.4.1 Excelファイルによるスキーマの定義」を参照してくだ

さい。

繰り返し エンティティ列を固定長の配列型にしたい場合は、その要素数(2以上)

を記述します。

Page 39: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

5 エンティティクラス

39

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

可変長のリスト型にしたい場合は、「*」と記述します。

フォーマット エンティティ列のフォーマットを記述します。「型」が Entityの場合

は、クリックするとダイアログが開くので、エンティティクラスを選

択してください。

フォーマットの記述方法の詳細は「5.4.1 Excelファイルによるスキー

マの定義」を参照してください。

デフォルト エンティティ列のデフォルト値を記述します。

詳細は「5.4.1 Excelファイルによるスキーマの定義」を参照してくだ

さい。

「✚」ボタン 新しいエンティティ列を追加します。

「↑」ボタン 選択されているエンティティ列を 1つ上に移動します。

「↓」ボタン 選択されているエンティティ列を 1つ下に移動します。

「✖」ボタン 選択されているエンティティ列を削除します。

「更新」ボタン 編集内容をエンティティクラスに反映し、エンティティ編集画面を終

了します。

「キャンセル」ボタン 編集内容をエンティティクラスに反映せずに、エンティティ編集画面

を終了します。

「インポート」ボタン 以下を参照してください。

「インポート」ボタンでは、他のエンティティクラスの列をコピーすることができます。「インポート」ボ

タンを押すとダイアログが開くので、インポートするエンティティクラスを選択します。このとき、「重複す

るプロパティ名はインポートしない」がチェックされていると、インポート先のエンティティクラスに存在

しないプロパティ名のエンティティ列のみがコピーされます。

Page 40: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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クラスは、エンティティファイルのフォーマットを表すクラスです。文字区切りフォーマット

Page 41: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 42: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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) コンストラクタ

引数 説明

-

戻り値 説明

- -

仕様

固定長区切りエンティティフォーマットを定義します。エンコーディングとコメント文字はデフォルト

Page 43: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

メソッドで指定されていない入力エンティティファイルのフォーマットは、全てこのフォーマットにな

ります。

Page 44: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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メソッドにより取得しま

Page 45: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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(","));

Page 46: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 47: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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のサブクラス

Page 48: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

48

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

左側のボタン等がある領域を「操作パネル」、右側の大きな領域を「メインパネル」と呼びます。メインパネ

ルにエンティティフロー図を作成していきます。

6.4.2 エンティティクラスの選択

まず、エンティティクラスを選択します。このエンティティクラスは、入力エンティティや処理を追加する際

に反映されます(追加後に変更することも可能です)。

操作パネルの「パッケージ選択」ボタンを押すと、パッケージ選択ダイアログが開きます。そこでパッケージ

を選択すると、そのパッケージ下のエンティティクラスが一覧表示されます。エンティティクラスを選択すると、

そのエンティティの列の一覧が表示されます。

操作パネル メインパネル

Page 49: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

49

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

「追加」「編集」「削除」ボタンにより、エンティティクラスを編集することができます。また、「エクスポー

ト」ボタンにより、エンティティクラスの定義を出力することができます。詳細は「5.5.2 エンティティフロー

編集画面での編集」を参照してください。

6.4.3 エンティティファイルや処理の編集

本章では、エンティティファイルや処理の基本的な編集方法について説明します。個々のエンティティファイ

ルや処理の仕様については、次章で詳しく説明します。

(1) エンティティファイルや処理の追加

エンティティファイル(または処理)を追加するには、操作パネルのボタンをメインパネルにドラッグ&

ドロップします。

Page 50: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

50

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

(2) エンティティファイルや処理の編集

エンティティファイル(または処理)の右上の「✎」アイコンをクリックすると、詳細編集画面が開きま

す。詳細編集画面で編集可能な内容は、エンティティファイルまたは処理の種類毎に異なります。詳しくは

「6.4.4 エンティティファイルや処理の詳細」で説明します。右クリックメニューから「編集」を選択して

も、詳細編集画面が開くことができます。

メインパネル上でエンティティファイル(または処理)をドラッグすると、位置を移動することもできま

す13。選択された複数のエンティティファイル(または処理)を一編に移動することも可能です。複数選択

を行うには、Shiftキーを押しながらクリックするか、ドラッグして矩形範囲を選択します。

(3) エンティティファイルや処理間の入出力

エンティティファイル(または処理)の右上の「➘」アイコンを他のエンティティファイル(または処理)

にドラッグ&ドロップすると、それらの間に入出力関係を定義することができます。

13 位置の情報は、アノテーションとしてエンティティフロークラスのソースに保存されます。

ドラッグ&ドロップ

ドラッグ&ドロップ

Page 51: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

51

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

矢印をクリックすると両端に□が現れます。それを別のエンティティファイル(または処理)にドラッグ

&ドロップすると、入力元または出力先を変更することができます。

矢印を右クリックしてメニューから「削除」を選択すると、入出力関係を削除することができます。

複数の入力がある場合は、先頭の入力が黒塗りの矢印、その他の入力が白抜きの矢印となります。右クリ

ックメニューから「入力順を先頭に」を選択すると、対応する入力を先頭にすることができます。入力順の

意味については、「6.4.4 エンティティファイルや処理の詳細」を参照してください。

(4) エンティティファイルや処理の削除

メインパネルでエンティティファイル(または処理)を選択して「Delete」キーを押すと、削除すること

ができます。右クリックメニューから「削除」を選択しても同様です。選択された複数のエンティティファ

イル(または処理)を一編に削除することも可能です。複数選択を行うには、Shift キーを押しながらクリ

ックするか、ドラッグして矩形範囲を選択します。

6.4.4 エンティティファイルや処理の詳細

下表にエンティティファイルと処理の一覧をまとめました。「入力」は、そのエンティティファイルや処理に

入力可能な個数を表します。

Page 52: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 のようになります。

下図はその例です。なお、フローを循環させることはできません。

Page 53: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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);

}

};

Page 54: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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により定義されているエンティティファイル

これらに該当しない場合は、実行時にエラーとなります(エンティティフロー編集画面ではエラーになり

ません)。

「✎」アイコンにより開く詳細画面は以下のようになります。

Page 55: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

55

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

項目 必須 説明

表示名 エンティティフロー編集画面上に表示される名称です。デフ

ォルトでは変数名と同じになります。

変数名 ○ initializeメソッド内でのローカル変数名です。他と重複す

ることはできません。

コメント コメントです。ソースコードには Javadoc 形式で反映されま

す。エンティティフロー図上に表示することもできます。

ファイル名 入力するエンティティファイル名です。省略した場合は、「エ

ンティティクラス名.txt」となります。

ファイルサイズ(テスト用) 実際のエンティティファイルのサイズを入力します。「6.4.6(6)

MapReduceジョブ表示」で利用します。

エンティティクラス ○ 入力するエンティティファイルのエンティティクラスを指定

します。

(2) Union

同一エンティティクラスの複数の入力エンティティファイル(または処理)を 1つに集約します。入力の

Page 56: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

56

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

順序に意味はありません。Unionは他の処理へ入力することはできますが、setOutputで出力することはで

きません。

下図は、2つのエンティティファイルと、もう 1つのエンティティファイルをグループ化した結果を集約

する例です。

「✎」アイコンにより開く詳細画面は以下のようになります。

Page 57: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

57

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

項目 必須 説明

表示名 エンティティフロー編集画面上に表示される名称です。デフォルト

では変数名と同じになります。

変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること

はできません。

コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ

ンティティフロー図上に表示することもできます。

エンティティクラス (○) 集約した結果のエンティティクラスです。入力元のエンティティク

ラスが自動的に設定されます。

Unionのサンプルは、「12.9 Join、UnionとApplicationContextのサンプル」を参照してください。

(3) setOutput

処理結果をエンティティフローの出力として定義します。アプリケーションが複数のエンティティフロー

から構成される場合は、以降のエンティティフローで入力エンティティファイルとして使用することができ

ます。

「中間出力」がチェックされていない場合は、最終的にエンティティファイルとして出力されることが保

証されます。逆にそうでない場合は、メモリ内で処理されファイル出力されない可能性があります。

出力エンティティファイル名が他と重複する場合や、入力エンティティフォルダーに同名のエンティティ

ファイルが存在する場合は、実行時にエラーとなります(エンティティフロー編集画面ではエラーになりま

せん)。

Page 58: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

58

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

「✎」アイコンにより開く詳細画面は以下のようになります。

項目 必須 説明

表示名 エンティティフロー編集画面上に表示される名称です。

コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ

ンティティフロー図上に表示することもできます。

ファイル名 出力するエンティティファイル名です。省略した場合は、「エンティ

ティクラス名.txt」となります。

中間出力 未チェックの場合は、必ずファイルが出力されます。

チェックされている場合は、フレームワークでの処理の最適化によ

りファイル出力されない可能性があります。

パフォーマンス向上のため、ファイル出力する必要が無ければチェ

ックすることを推奨します。

エンティティクラス (○) 出力されるエンティティクラスです。入力元のエンティティクラス

が自動的に設定されます。

(4) openOutput

条件に応じてエンティティを振り分けたい場合、正常な処理結果とは別にエラー結果を出力したい場合な

ど、1 つの処理から複数のエンティティファイルを出力したい場合があります。そのようなときには、

「openOutput」を使用します。これは、通常の処理結果の出力先に加え、別の出力先を定義する機能です14。

14 openOutputはあくまでも出力先を増やすだけであり、それだけではファイルにが出力されません。ファイルに出力するには、

更に setOutputを接続する必要があります。

Page 59: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

59

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

Group以外の処理に対して使用することができます。

「✎」アイコンにより開く詳細画面は以下のようになります。

Page 60: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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);

Page 61: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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と組み合わせる)

「✎」アイコンにより開く詳細画面は以下のようになります。

Page 62: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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のサンプル」を参照

してください。

Page 63: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 64: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

64

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

「✎」アイコンにより開く詳細画面は以下のようになります。

項目 必須 説明

表示名 エンティティフロー編集画面上に表示される名称です。デフォルト

では変数名と同じになります。

ログにもこの名称が出力されます。

種別 ○ 処理の種別を変更することができます。

変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること

はできません。

コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ

ンティティフロー図上に表示することもできます。

グループ化列 グループ化列を指定します。

左側でエンティティ列を選択して「>」ボタンを押すと、グループ

化列に追加されます。エンティティ型の列や配列型の列は、展開し

て個々の要素を指定することができます。

「✖」ボタンを押すと、選択されているグループ化列が削除されま

す。

グループ化列が 1 つも指定されていない場合は、全ての入力エンテ

Page 65: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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の方を使用するようにしてください。

「✎」アイコンにより開く詳細画面は以下のようになります。

Page 66: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

66

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

項目 必須 説明

表示名 エンティティフロー編集画面上に表示される名称です。デフォルト

では変数名と同じになります。

ログにもこの名称が出力されます。

種別 ○ 処理の種別を変更することができます。

変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること

はできません。

コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ

ンティティフロー図上に表示することもできます。

ソート列 ○ ソート列を指定します。

左側でエンティティ列を選択して「>」ボタンを押すと、ソート列

に追加されます。エンティティ型の列や配列型の列は、展開して個々

の要素を指定することができます。

「降順」をチェックすると降順、そうでない場合は昇順でソートさ

れます。

「✖」ボタンを押すと、選択されているソート列が削除されます。

エンティティクラス ○ 処理結果のエンティティクラスです。

Page 67: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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のサンプル」を参照してください。

Page 68: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

68

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

(8) GroupSort

まず、入力エンティティファイル(または処理)を指定された列でグループ化し、更にグループ内でソー

トして出力します。必要に応じて変換を行うこともできます。

例えば、「顧客別で売上金額が多い順に順序を付加する」ということができます。この場合は、顧客をグル

ープ化列、売上金額をソート列に指定します。

Sortにより顧客と売上金額でソートしても同様の処理を実現できますが、Sortは分散されず、GroupSort

はグループ化列で分散される、という違いがあります(詳細は「6.5 処理の分散」を参照してください)。そ

のため、GroupSortの方がパフォーマンスが高くなります。

「✎」アイコンにより開く詳細画面は以下のようになります。

Page 69: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

69

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

項目 必須 説明

表示名 エンティティフロー編集画面上に表示される名称です。デフォルト

では変数名と同じになります。

ログにもこの名称が出力されます。

種別 ○ 処理の種別を変更することができます。

変数名 ○ initializeメソッド内でのローカル変数名です。他と重複すること

はできません。

コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ

ンティティフロー図上に表示することもできます。

グループ化列 ○ グループ化列を指定します。

左側でエンティティ列を選択して「>グループ化」ボタンを押すと、

グループ化列に追加されます。エンティティ型の列や配列型の列は、

展開して個々の要素を指定することができます。

「✖」ボタンを押すと、選択されているグループ化列が削除されま

す。

ソート列 ソート列を指定します。

左側でエンティティ列を選択して「>ソート」ボタンを押すと、ソ

ート列に追加されます。エンティティ型の列や配列型の列は、展開

して個々の要素を指定することができます。

「降順」をチェックすると降順、そうでない場合は昇順でソートさ

れます。

「✖」ボタンを押すと、選択されているソート列が削除されます。

Page 70: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 71: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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でグループ化することに

より、結合と同等の処理を行うことができます。

Page 72: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

興味分野=スポーツ

Page 73: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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();

Page 74: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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();

...

Page 75: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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」ボタンをドラッグ&ドロップします。

そして、カスタムコンポーネントを利用する処理から矢印を引きます。

Page 76: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

6 エンティティフロークラス

76

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

③ カスタムコンポーネントの詳細設定

「✎」アイコンにより詳細画面を開き、詳細設定を行います。

項目 必須 説明

表示名 エンティティフロー編集画面上に表示される名称です。デフォルト

では変数名と同じになります。

変数名(※) ○ 入力元の処理内でのインスタンス変数名です。同じ処理の他のカス

タムコンポーネントや openOutputと重複することはできません。

コメント コメントです。ソースコードには Javadoc 形式で反映されます。エ

ンティティフロー図上に表示することもできます。

クラス名 ○ カスタムコンポーネントのクラス名です。

「参照」ボタンを押すと、クラス選択ダイアログが表示され、カス

タムコンポーネントとして利用可能なクラスを選択することができ

ます。

Page 77: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 エンティティフローの編集の終了

操作パネルの「更新」ボタンを押すと、編集内容をエンティティフロークラスのソースコードに反映してエン

ティティフロー編集画面を閉じます。「キャンセル」ボタンを押すと、ソースコードに反映せずにエンティティ

フロー編集画面を閉じます。

また、エンティティファイル(または処理)をダブルクリックした場合もエンティティフロークラスが更新さ

れます。エンティティフロー編集画面が閉じた後、ソースコードの該当箇所にカーソルが移動します。

Page 78: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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) エンティティファイルや処理の整列

操作パネルの「表示▼」ボタンを押し、表示されるメニューから「整列」を選択すると、エンティティフ

ァイルや処理が適切な位置に配置し直されます。

エンティティフローの編集操作により、フロー図が見にくくなってしまった場合に使用すると便利です。

Page 79: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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」です。

Page 80: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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) コメントの表示/非表示

コメントが設定されているエンティティファイルや処理、カスタムコンポーネントを右クリックし、メニ

ューから「コメントを表示」を選択すると、コメント文字列がエンティティフロー図上に表示されます。

Page 81: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 なお、一旦非表示にした後に再び表示した場合、座標は復元されません。

Page 82: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 83: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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;

Page 84: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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が発生することに注意してください。

Page 85: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

各キーの値を配列で指定

Page 86: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 フレームワークによりチェックされて例外が投げられます。

Page 87: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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インスタンスとそこで処理されるエンティティの関係は、以下のようなイメージになります。

Page 88: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

アプリケーション

アプリケーションコンテキスト

エンティティフロー

処理

初期化 参照

Page 89: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

引数 説明

-

Page 90: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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に渡されるのは今月の売上

だけになります。

Page 91: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

全売上

全売上

全売上

今月の売上

今月の売上

今月の売上

Page 92: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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のヒープサイズやアプリケーションの処理内容等によって変わります。

Page 93: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 はフレームワーク内でキャッシュされていますが、それでもアプリケーション側でキャ

ッシュしたい場合もあると思います。

そのような場合、小さなエンティティファイルであれば、①あるいは②でキャッシュしてよいでしょう。キャ

ッシュを複数の処理で使用するのであれば①、特定の処理だけで使用するのであれば②が妥当です。

比較的大きなエンティティファイルであれば、③でキャッシュすべきです。

Page 94: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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;

}

Page 95: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 96: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 インスタンスは必ずしも(というより多くの場合)一対一では対応し

ません。

アプリケーションクラス

エンティティ

ファイル

エンティティ

ファイル

エンティティ

ファイル

エンティティ

フロー

エンティティ

フロー

エンティティ

ファイル

Page 97: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 98: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

7 アプリケーションクラス

98

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

項目 説明

「更新」ボタン 編集内容をアプリケーションクラスに反映し、アプリケーション編集画

面を終了します。

「キャンセル」ボタン 編集内容をアプリケーションクラスに反映せずに、アプリケーション編

集画面を終了します。

「フロー図を表示」ボタン アプリケーション全体のエンティティフロー図を表示します。

「✚」ボタン エンティティフロー選択画面が開きます。そこで選択したエンティティ

フローが追加されます。

「↑」ボタン 選択されているエンティティフローを 1つ上に移動します。

「↓」ボタン 選択されているエンティティフローを 1つ下に移動します。

「✖」ボタン 選択されているエンティティフローを削除します。

エンティティフロー選択画面は以下の通りです。パッケージを選択すると、そのパッケージ直下のエンティテ

ィフロークラスが一覧表示されるので、そこから追加したいものを選択します。

Page 99: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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出力」と同様です)。

Page 100: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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コマンドでの実行」を参照してください)。

Page 101: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 エンティティフローやアプリケーションの実行」を参照してください。

Page 102: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

変換ツール 変換ツール

Page 103: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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アプリケーション

エンティティ

エンティティ

Page 104: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 データベースに接続するパスワードです。

接続名は任意の文字列です。複数の接続名を使用することにより、複数のデータベース接続情報を定義す

ジョブ設定

ファイル

環境設定

ファイル

タスク設定

ファイル

データベース接続情報

を参照

Page 105: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 106: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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文字目以降は小文字に変換されます。アンダーバーがある場合は取り除かれ、その次の文字が大文字に変換

されます。

Page 107: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 何らかの型のエンティティ列が生成される場合もありますが、エンティティ列が生成されない場合もあります。

Page 108: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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値をエンティティに変換す

Page 109: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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には対応していませんので、削除するには削除フラグなどを用意して論理削除する必要があります。

Page 110: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

フレームワーク

マッピング

定義

Page 111: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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");

}

Page 112: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 設定ファイルは処理を分散実行する各マシンから参照できる必要があります。従って、ローカルファイルを指定するとエラー

が発生します(スタンドアローンで実行する場合は問題ありません)。

Page 113: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 クラスに

よりエンティティを取得することができます。

Page 114: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 クラスを使用します。そのメ

Page 115: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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<エンティティクラス> 出力エンティティのリスト。存在しない場合は空リストが返される。

Page 116: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 インポート方式)メソ

ッドを使用します。

Page 117: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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と同等のメソッドが利用可能です。

Page 118: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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);

Page 119: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 120: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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を使用する場合)

Page 121: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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フレームワーク

テストクラス

エンティティフロークラス

または

アプリケーションクラス

シミュレータ

起動

参照

実行

Page 122: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 {

Page 123: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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;

Page 124: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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アプリケーションとして実行することができ

ます。

Page 125: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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()));

}

Page 126: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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()));

}

}

Page 127: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 ファイルの作成方法

パッケージエクスプローラでエンティティフロークラスまたはアプリケーションクラスを選択し、 アイコ

ンをクリックします。すると以下のようなダイアログが開きます。

Page 128: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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対象のフォルダーやライブラリは絶対パスで保存されています。ビルド・パスを変更しても反映されませんので、ご注意

ください。

Page 129: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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)から指定してください。

Page 130: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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]

Page 131: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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のカウンタ数には制限があるためです。

Page 132: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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クラスとして追加することはできません。

Page 133: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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フォルダーに入っています。

Page 134: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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により作成されます。

Page 135: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 136: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 137: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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ジョブ表示」参照)では、エンティティフロークラスのコ

Page 138: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

11 プラグインの設定

138

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

ンパイルを行います。そのためのコマンドを指定します。デフォルトでは「javac」です。

特定のバージョンの Javaコンパイラを利用したい場合や、コンパイラオプションを指定したい場合に利用しま

す。

Page 139: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 140: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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);

}

}

Page 141: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 142: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 143: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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();

Page 144: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 145: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 146: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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);

}

}

Page 147: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

プロパティ キー 型 フォーマット デフォルト

Page 148: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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() {

Page 149: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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);

}

Page 150: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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」と同じです。

Page 151: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

12 サンプル

151

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

(2) エンティティフロー図

(3) ソースコード

public class AreaSummaryFlow1 extends EntityFlow {

@Override

Page 152: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 =

Page 153: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 154: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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) {

Page 155: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 156: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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") {

Page 157: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 のサンプル

「指定された地域に居住する顧客 または 指定された興味を持つ顧客 の売上を検索する」エンティティフロー

Page 158: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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) エンティティフロー図

Page 159: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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);

}

Page 160: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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から取り出し

ます。

Page 161: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 神奈川 スポーツ

Page 162: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 このサンプルは評価版には含まれていません。ご了承ください。

Page 163: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 164: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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));

Page 165: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 166: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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

Page 167: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 このサンプルは評価版には含まれていません。ご了承ください。

Page 168: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 {

Page 169: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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"));

Page 170: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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)」と同様です。

Page 171: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

12 サンプル

171

Copyright © 2012 CAC Corporation. All rights reserved.

AZAREA-Cluster 開発ガイド

Page 172: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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フレームワークの組み込み」を行

ってください。

Page 173: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 アプリケーションコ

ンテキストの参照

アプリケーションコンテキストからもアプリケーション引数を

取得できるようにしました。

Page 174: AZAREA-Cluster 開発ガイド - Amazon S3...です。Yahoo、Facebook、Twitter など有力なIT 企業で採用されたこともあり、分散処理基盤のデファクトス

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 スタンドアローン実行

時のエラー

新たに章を追加しました。