S-JIS[2012-12-24/2015-07-08] 変更履歴

AZAREA Tips

AZAREA-Cluster0.9.0の操作に関するメモ。


Tips

エディターの起動方法

  1. パッケージエクスプローラー上で対象のクラス(フロー・エンティティ・アプリケーション)あるいはパッケージを選択する。
  2. ツールバーの「AZAREA-Cluster Editor」をクリックする。
    もしくは、パッケージエクスプローラーから右クリックでポップアップメニューを開いて「AZAREA-Cluster」メニューを選択する。

どこが選択されているかに応じて、「AZAREA-Cluster」メニューの内容が変わる。

新規作成

フローやエンティティを初めて作成する場合は、先に空のディレクトリー(パッケージ)を作っておく必要がある。
(フロークラスでは、「新規エンティティフローを作成」ダイアログでパッケージ名を入力すれば作られるらしい[2013-01-06]

フロー図の編集

エディターはモーダルダイアログであり、ソースと同時に見るには広いディスプレイが必要。
箱をダブルクリックしてソースの該当箇所へ跳ぶといった機能は無い。
範囲選択してまとめて箱を削除したり移動したりすることは出来ない。
図が多くなるとスクロールバーが出てくるが、Windows版(Pleiades All in One)Eclipse3.7だとマウスホイールでスクロールさせることは出来ない(Linux版Eclipse3.7は出来た)。

エディター上で描いたフローや変数名・クラス名はソースと連動する。
ただし、図の修正がその都度(リアルタイムで)ソースに反映されるわけではない。
エディター上で確定(更新ボタンを押す)してダイアログを閉じるとソースが生成(修正)される。

ソース以外に図のデータを保持していないので、ソースを変えれば次にエディターを開いたときには反映されている。
図上の箱の位置は毎回再計算されるので、手で綺麗に整列させる意味はあまり無い。

箱の処理の種類を変えること(GroupSortをGroupに変えるとか)も出来るが、ソースへの反映は追加分のみとなる。
(変更前のメソッドは残るからコンパイルエラーになるので、手で修正する)

箱の編集では、出力エンティティ(ファイルの種類)を変えられる処理と変えられない処理がある。
(例えばGroupは入力と同じ出力でないといけないようで、出力の種類だけを変えることは出来ない)
箱の入出力エンティティを別の物に変えると、線で結ばれて連動している箇所については自動的に同じエンティティに変更される。

UniqueJoinでは2箇所から線を引いてくることになるが、後から引く方(結合エンティティ)がマスターになる。(矢印も白抜きになる)
入れ替えたい場合は、白抜き矢印を右クリックして「入力順を先頭に」を選ぶと入れ替わる。[/2013-01-06]
(線を複数選択してまとめて削除することは出来ない)

エンティティのエディター

エンティティクラス名をエディター上で変えることは出来ない。
ソース上でリファクタリングによって変えるのは問題ない。

エンティティクラスのプロパティ作成時にコピー&ペーストすることは出来ない。
( 一旦Excelにエクスポートして編集するのがいいかも?)
別のエンティティクラスのプロパティを全部持ってくる(インポートする)ことは出来る。

JUnit用のテストソース作成

JUnitのテストソースは、一旦テストクラス(シミュレーターによる実行クラス)を生成してから、JUnit用に修正するのが楽。

処理(GroupSort)

GroupSortで自動生成されるソースでは“エンティティーのListを受け取るmergeメソッド”が用意されるが、先頭の数レコードだけ処理する場合は“1レコードずつ呼ばれるmergeメソッド”を使う方が実行効率が良くなる。[2013-01-12]
(このメソッドは自分で(手動で)オーバーライドする必要がある)

修正前 修正後
GroupSort<NumberEntity, Result2Entity> distinct2 =
	new GroupSort<NumberEntity, Result2Entity>(
		entity4, "date", "number")
{
	@Override
	protected void merge(List<NumberEntity> entities) {
		// 先頭レコードに対してのみ出力する(distinct)
		NumberEntity entity = entities.get(0);

		Result2Entity result = new Result2Entity();
		result.date  = entity.date;
		result.count = 1;
		output(result);
	}
};
GroupSort<NumberEntity, Result2Entity> distinct2 =
	new GroupSort<NumberEntity, Result2Entity>(
		entity4, "date", "number")
{
	@Override
	protected void merge(List<NumberEntity> entities) {
		// NOP
	}

	@Override
	protected void merge(NumberEntity entity, boolean isFirst, boolean isLast) {
		// 先頭レコードに対してのみ出力する(distinct)
		if (isFirst) {
			Result2Entity result = new Result2Entity();
			result.date  = entity.date;
			result.count = 1;
			output(result);
		}
	}
};

処理(Group)

GroupSortよりGroupの方が実行効率が良いらしいので、Groupに出来るものはGroupにした方が良い。[2013-01-12]
GroupSortが必ずReducerで実行されるのに対し、Groupは可能であればMapperでも処理される為)

distinct(重複レコードを排除する=全カラムをキーとしてグループ化して先頭レコードだけ出力する)の例
修正前 修正後
GroupSort<NumberEntity, Result2Entity> distinct2 =
	new GroupSort<NumberEntity, Result2Entity>(
		entity4, "date", "number")
{
	@Override
	protected void merge(List<NumberEntity> entities) {
		// 先頭レコードに対してのみ出力する(distinct)
		NumberEntity entity = entities.get(0);

		Result2Entity result = new Result2Entity();
		result.date  = entity.date;
		result.count = 1;
		output(result);
	}
};
Group<NumberEntity> distinct2 =
	new Group<NumberEntity>(entity4, "date", "number")
{
	@Override
	protected void doSummarize(NumberEntity summary, NumberEntity another) {
		// NOP(先頭レコードだけ出力する)
	}
};
Conversion<NumberEntity, Result2Entity> entity2 =
	new Conversion<NumberEntity, Result2Entity>(distinct2)
{
	@Override
	protected void convert(NumberEntity entity) {
		Result2Entity result = new Result2Entity();
		result.date  = entity.date;
		result.count = 1;
		output(result);
	}
};
  Group#doSummarize()に何も記述しないと、summaryがそのまま出力される。
summaryは初期値が先頭レコードなので、結果として先頭レコードだけが出力されることになる。

Asakusa Frameworkとの比較

一見AZAREAと立場が似ているように見えるAsakusa Frameworkとの比較。

  AZAREA-Cluster Framework 0.9.0 Asakusa Framework 0.7.3
コンセプト Hadoop用アプリケーションを開発しやすくする。 大規模な基幹バッチを開発しやすくする。
素のHadoop(MapReduce)APIでは大規模なアプリケーションを作成するのが困難な為、容易に開発する目的で作られた。
個人的には、MapReduceを上手くラップしたフレームワークに見える。
大規模なバッチアプリケーションを記述する目的で作られた。
大量データを扱う際の実行基盤としてHadoopを利用するという位置付け。
Sparkで実行することも出来る。[2015-07-08]
フローをGUIで編集できる。 フロー等をDSL(ドメイン特化言語)で記述する。
対応バージョン 開発環境はWindows・Linux
Hadoopは1系・2系
開発環境はLinux
Hadoopは1系・2系およびMapR・Amazon EMR
ライセンス 商用(有効期限2ヶ月間の評価版ライセンスあり) Apache License 2.0(OSS)
データ 呼び名 エンティティ データモデル
記述方法 AZAREA独自のエディターやExcelで記述する。 DMDLという独自言語(テキストベース)で記述する。
(汎用機の)大規模な基幹バッチではカラム数が数百から千を超えることもあり、それを編集する想定でテキストベースになっているらしい。
「+」によって複数のデータモデルを合わせた新しいデータモデルを作れるようになっていたりするのもその一環。
対象 HDFS(およびAmazon S3)上のファイル
AsakusaFWのDirect I/Oとほぼ同じ)
HDFS(およびAmazon S3)上およびローカルのファイル
その他にRDBMSとの連携モジュール(WindGate)を提供している。
個人的には、RDBMSとの連携に関しては、外部のツールを利用した方が良いと思うが。
形式 CSVおよびTSV。
入力には正規表現も使用可能。
テキストファイルはCSVやTSV。
HadoopのSequenceFileも使用可能。
RDBMSはテーブルやビュー。
処理 処理の種類は絞られている。
Mapper#map()がConversion、Reducer#reduce()がGroupに当たる。
MapReduceのシャッフル機能を利用するものとしてGroupSortやSortがあり、
結合だけ入力が2つ要るので別途Joinがあるイメージ。
(Conversionが最適化によってReducerで実行されることもあるらしい[2013-01-06])
AsakusaFWでは演算子と呼ぶ。
演算子の種類は多い。(個々の処理内に書ける内容を限定することで最適化しやすくする方針)
処理の種類 変換 Conversion Extract(・Update・Branch等)
集約 Group Fold(・Summarize)
集約方法は関数型言語のfold相当。  
ソート GroupSort・Sort GroupSort
結合 UniqueJoin MasterJoin(・MasterJoinUpdate・MasterBranch等)
Join CoGroup
結合キーを指定しないとエラーになる。 結合キーを指定しないとcross join扱いとなる(全データがマッチする)。
  合流 Union confluent
ベースとなる言語 Java Java
ベースとなるツール Eclipse GradleおよびEclipse。[/2015-07-08]
(Eclipseは必須ではないが、あった方が確実に便利)
インストーラー なし(インストール作業はファイルを解凍してコピーするだけ) Jinrikisha(手作業でも可能)
あるいはEclipseプラグイン(Shafu[2015-07-08]
プロジェクト 普通にEclipseの新規プロジェクト作成機能を使ってJavaプロジェクトを作成する。
ビルドパスにAZAREAのライブラリー一式を追加する。
Eclipseプラグイン(Shafu)を使ってプロジェクトを作成する。[/2015-07-08]
フローおよび処理 フローおよび処理はFlowクラスの1メソッド内に記述する。
フローはGUIで作成・変更が可能。
(ソースを修正するとフローの図にも反映される(というか、フロー図はソースから毎回生成される)
処理はOperatorクラスに各メソッドを作って記述する。
フローはFlowクラス内の1メソッドに記述する。(Flow DSLと呼ぶ)
フローをサブルーチンの様にまとめる事も出来る(FlowPart)。
バッチアプリケーション アプリケーションクラスを生成可能。
実行対象フローはGUIで作成・変更が可能。
バッチクラスを作成する。(Batch DSLと呼ぶ)
処理の単体テスト 不可。
(処理はFlowクラスのメソッド内の無名クラスとして記述されているので、そこだけを実行することは出来ない)
可能。
Operatorクラスを“普通のJavaアプリのJUnit”と同様にテストする。
シミュレーター シミュレーターが提供されており、Hadoopを使わずに実行可能。
シミュレーターを使って実行するクラスは生成できる。
(入力データファイルだけ自分で用意する)
なし
フローの単体テスト シミュレーターを使って(Hadoopを使わずに)実行可能。
Eclipseのデバッグ機能を使用可能(ブレークポイントで止めて変数を見るとか)。
中間データの内容もコンソールに表示されるし、Eclipseのワークスペース内にテキストファイルとして保存されるので簡単に確認できる。
スモールジョブ実行エンジンを使って実行可能。[/2015-07-08]
Eclipseのデバッグ機能を使用可能(ブレークポイントで止めて変数を見るとか)。
中間データはSequenceFileなので、簡単には見られない。
テスト用検証データ 実際に入出力されるファイルと同形式で入力・検証データを用意しておく。
出力データのソート順の検証も出来る。
Excelファイルで入力・検証データおよび検証ルールを記述する。
(出力されたデータの一部分だけを検証するといった事も出来る)
リリースアーカイブの生成 AZAREAが提供しているメニューを実行することでjarファイルを生成する。 Gradleのコマンドでアーカイブ(jarファイル等)を生成する。[/2015-07-08]
リリース方法 生成されたjarファイルをHadoopクライアントに持っていくだけ。 生成されたアーカイブをHadoopクライアント上で展開する。[/2015-07-08]
入出力の指定方法 入力ディレクトリーは複数指定できる(ファイル名で区別される)が、
出力ディレクトリーは1箇所(そこに全種類の出力が入る)。
アプリ内でファイル名のみ指定する。
(out1.txtとout2.txtが出力される場合、出来るファイルは「output/out1.txt/part-r-00000」「output/out2.txt/part-r-00000」の様な感じになる)
AsakusaFWのコンフィグファイルでルートディレクトリーを指定する。
ルートディレクトリーからの相対パスおよびファイル名はアプリ内で指定する。
(out1.txtと指定されていれば、out1.txtが作られる。Hadoopが作った分散ファイル名のままにしておく事も出来る)
実行方法 通常のMapReduceアプリと同様に「hadoop jar」コマンドで実行する。 AsakusaFWの提供する実行ツール(YAESS)で実行する。
小規模データ
[2015-07-08]
スタンドアローンモード(0.9.2)。
Hadoopの代わりに単独のJavaVM(マルチスレッド)で実行させることが出来る。
スモールジョブ実行エンジン(0.7.1)。
小さなデータがあったら、Hadoopの代わりにスモールジョブ実行エンジンで実行する。
(実行時に自動的に判定して切り替わる)
CI(継続インテグレーション) 不明 Gradleを使っているので、普通にJenkinsに乗せられる。[/2015-07-08]

AZAREAは、処理(AsakusaFWで言う演算子)がMap/Reduceにきっちり対応しているように見えるので、MapReduceのラッパーを目指しているように感じられる(MapReduceのラッパーだと考えると分かり易い)。
(AsakusaFWは処理に必要な演算子(と、あったら便利な演算子)(および、最適化に有効)という視点で演算子を用意していると思われる)

GUIによるフローも、Map/Reduceをどの順序で処理するかを記述するものになっているような気がする。
(フローの箱に表示されるのがConversionやGroupといった処理名であり、何の処理をするものなのかという説明は0.9.0版では入れられない。(変数名でそれっぽく入れられるけど)
複雑なアプリならConversionとかは大量に出てくるはずで、何を行う為のConversionなのかが書けないと不便なはず。
ということは、逆説的に、あまり複雑なものは対象にしていないのではないかと思ってしまう^^;)

AsakusaFWは大規模な基幹バッチを対象にするという目的から、敢えてGUIを外してDSL方式を採用したらしい。(箱が多くなったら大変だから)
実際、AZAREAで作ってみた1つの入力から4種類の集計を行うサンプルでは箱が20個くらいで1画面に収まらなくなっているので、もっと複雑になったらどうなるか…。
(ちなみに、このサンプルの当初版は実行したらOutOfMemoryErrorになったので、AZAREAはあまり複雑なものに対応できていないのではないかと思ったのだが、GroupSortのコーディング方法を変えたら回避できた。[/2013-01-06]


AZAREA目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま