S-JIS[2011-12-22/2014-04-01] 変更履歴

Asakusa Framework WindGate(Maven時代)

Asakusa Framework(Maven時代)のWindGateのメモ。


概要

WindGate(風門)は、AsakusaFWで外部(ファイルやRDB)と連携する部分。

AsakusaFW 0.2.4では、WindGateがCSVファイルに対応した。
AsakusaFWアプリ(WindGate)を起動したマシンのローカルにあるCSVファイルを読み込んでHDFSへSequenceFileとして書き込み、処理した結果のSequenceFileを読み込んでローカル上にCSVファイルを作成する。[2012-01-07]

AsakusaFW本体は今までのbatchappと同じくHDFS上のSequenceFileを読み込んでSequenceFileを出力する。
すなわち、HDFS上のCSVファイルを読み込んだり、HDFS上にCSVファイルを出力したりするわけではない。

  WindGate   (AsakusaFW)
Hadoop
  WindGate  
ローカル
CSVファイル
転送・変換 HDFS
SequenceFile
バッチ処理 HDFS
SequenceFile
転送・変換 ローカル
CSVファイル

WindGate自体はその転送(と変換)を行うだけだが、DMDL上に“WindGateを使用する”という印を付けることにより、WindGateを使用する為のクラスが自動生成される。
その生成されたクラスをジョブフローのImporter/Exporterとして記述することでWindGateと連動する。
WindGate版WordCount


開発環境構築(CentOS)

CentOS5にAsakusaFW 0.2.4(WindGate)の開発環境を構築する手順。
(VMware上の64bit版CentOS5.7で試している。→対応プラットフォーム

  1. 環境変数を設定しておく。
    JAVA_HOME /usr/java/default  
    ASAKUSA_HOME /home/ユーザー名/asakusa Asakusa Frameworkをインストールする場所。
    インストール前に環境変数を設定しておくと、この場所に作られる。
    $HOME/asakusaが推奨されている。
  2. AsakusaFW(WindGate)開発環境用ディレクトリーを作成する。
    (後でEclipseへインポートすることを考えて、Eclipseのワークスペースの下にディレクトリーを作成する)
    $ cd ~/workspace
    $ mvn archetype:generate -DarchetypeCatalog=http://asakusafw.s3.amazonaws.com/maven/archetype-catalog.xml
    途中で聞かれる選択肢は以下の様な感じで指定する。
    Choose archetype:
    1: http://asakusafw.s3.amazonaws.com/maven/archetype-catalog.xml -> com.asakusafw:asakusa-archetype-batchapp (-)
    2: http://asakusafw.s3.amazonaws.com/maven/archetype-catalog.xml -> com.asakusafw:asakusa-archetype-thundergate (-)
    3: http://asakusafw.s3.amazonaws.com/maven/archetype-catalog.xml -> com.asakusafw:asakusa-archetype-windgate (-)
    Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): :
    3 ここではWindGateを選択する。
    Choose version:
    1: 0.2-SNAPSHOT
    2: 0.2.2
    3: 0.2.3
    4: 0.2.4
    Choose a number: 4:
    4 AsakusaFWのバージョンを指定。
    ここでは0.2.4を使う。
    (0.2-SNAPSHOTが0.2系では最新(ベータ版))
    Define value for property 'groupId': : afw-wgate MavenのgroupId。
    Define value for property 'artifactId': : afw-wgate これがプロジェクトのディレクトリー名になる。
    Define value for property 'version': 1.0-SNAPSHOT: : 1.0 どんな値でもいい。
    Define value for property 'package': example: : afw.wgate 生成されるクラスのパッケージ名。
    Confirm properties configuration:
    groupId: afw-wgate
    artifactId: afw-wgate
    version: 1.0
    package: afw.wgate
    Y: :
    y 上で入力した値の確認。
    これで良ければYを入れる。
    nとか入れると再度groupIdから入力し直せる。
  3. 開発環境のインストールを行う。(AsakusaFW 0.5.0以降では方法が異なる。→インストール方法 [2013-05-10]
    $ cd afw-wgate
    $ mvn assembly:single antrun:run
    実行が正常に終わると、afw-wgateの下にtargetというディレクトリーが出来ている他、ASAKUSA_HOMEで指定された場所に 実際にディレクトリーが作られる。
    (既にASAKUSA_HOMEディレクトリー(asakusaディレクトリー)が存在していた場合は 、日時付きのディレクトリー名に変更され、新しく作り直される)
  4. テストを実行してみる。SUCCESSすればOK。(→テスト時のエラー
    $ mvn test
  5. Eclipse用の設定ファイルを作成する。
    $ mvn eclipse:eclipse
  6. そのワークスペースにAsakusaFWをインストールするのが初めての場合は、EclipseにMavenのリポジトリー用の変数(M2_REPO)を作成する。
    $ mvn -Declipse.workspace=.. eclipse:add-maven-repo
  7. EclipseにAsakusaFWプロジェクト(afw-wgate)をインポートする。
    1. メニューバーの「File」→「Import」で「Import」ダイアログを開く。
    2. 「General」→「Existing Projects into Workspace」を選択して「Next」
    3. 「Select root directory」でafw-wgateの場所を指定して「Finish」

これでインストール(Eclipseの設定)が終わったので、テストを実行してみる。


CentOSでのエラー

エラー内容 エラーの説明と対処法
java.io.IOException: 分散キャッシュ"storeInfo"からハッシュ表を作成できませんでした
at com.asakusafw.runtime.flow.join.JoinResource.setup(JoinResource.java:69)

Caused by: java.io.FileNotFoundException: File /tmp/hadoop-ユーザー/mapred/local/archive/90〜48/filetarget/testdriver/hadoopwork/bid/byCategory/prologue/windgate/storeInfo does not exist.
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:383)
mvn test」を実行した際の例外。
CentOSでは$HOMEに権限を付ける必要がある。
(→開発環境構築ユーザガイド
# cd /home
# chmod a+rx ユーザー
それでも駄目なら、念の為targetディレクトリーも権限を変える。
$ chmod -R a+rx ユーザー/target
java.lang.IllegalStateException: この環境ではJavaコンパイラーを利用できません (JREにはコンパイラーが含まれていません)
at com.asakusafw.compiler.flow.packager.FilePackager.compile(FilePackager.java:239)


 
Eclipseでジョブフローのテストを実行した際の例外。
システムライブラリー(ビルドパス)にJDK1.6(/usr/java/default)を設定する。
java.lang.IllegalStateException: java.io.IOException: WindGate profile is not found (profile=asakusa, description=afw.wgate.jobflow.Ex1FromCsv)
at com.asakusafw.testdriver.JobFlowTester.runTest(JobFlowTester.java:95)
$ASAKUSA_HOMEの下にWindGateのプロファイルが見つからない。[2012-01-08]
0.2.4をインストールした後に古いバージョンをインストールするとそんな状態になる。
AsakusaFWをインストールし直す。

開発環境構築(Windows)

Windows7にAsakusaFW 0.2.4(WindGate)の開発環境を構築してみる。(挫折中

Mavenを使ってディレクトリーを作り、EclipseのワークスペースへインポートしてOperatorのテストをするまではCentOSへのインストールと同じ。
(「mvn test」は失敗するが)

しかしジョブフローのテスト(CategorySummaryJobTest)を実行するとエラーになる。

Windowsでのエラー

エラー内容 エラーの説明と対処法
java.lang.IllegalStateException: java.io.IOException: Failed to configure local
at com.asakusafw.testdriver.JobFlowTester.runTest(JobFlowTester.java:95)

Caused by: java.lang.IllegalArgumentException: Failed to resolve "basePath": /tmp/windgate-${USER} (resource=local)
at com.asakusafw.windgate.stream.file.FileProfile.extract(FileProfile.java:132)

Caused by: java.lang.IllegalArgumentException: parameter "USER" is not defined in the list: 〜
環境変数USERが定義されていない。
(UNIXではUSERにユーザーIDが入っている)
実行時の環境変数にUSERを定義してやる。
(Cygwinにログインした際のユーザー)
org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory target/testdriver/hadoopwork/bid/byCategory/stage0001 already exists
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:132)
ホームディレクトリーの位置の認識がずれているので、ディレクトリーが消されていない。
実行時のVM引数に「-Duser.home=D:/cygwin/home/ユーザー」を指定してやる。
java.lang.IllegalStateException: java.io.IOException: Cannot run program "D:\cygwin\home\ユーザー\asakusa/windgate/bin/finalize.sh" (in directory "C:\Users\ユーザー"): CreateProcess error=193, %1 ?͗L?ø?È Win32 ?A?v???P
at com.asakusafw.testdriver.JobFlowTester.runTest(JobFlowTester.java:95)
finalize.shが実行できない。
(process.shでも似た例外が発生する)
windgate-0.2.4-win.zipを解凍してプロジェクト内のソースフォルダーにコピーし、BridgeShellを実行するとWindows用のシェルに置き換える。
(“ブリッジシェルの作成”のWindGate版)
java.lang.AssertionError: コマンドの実行に失敗しました (exitCode=1, command="D:\cygwin\home\ユーザー\asakusa/windgate/bin/process.sh asakusa begin classpath:META-INF/windgate/import-asakusa.properties bid byCategory CategorySummaryJobTest-bid-byCategory date=testing")
com.asakusafw.windgate.core.session.SessionException: The specified session already exists: Session ID=CategorySummaryJobTest-bid-byCategory
at com.asakusafw.windgate.file.session.FileSessionProvider.attach(FileSessionProvider.java:188) ~[asakusa-windgate-core-0.2.4.jar:na]
WindGateのセッション情報(ファイル)が残っている。
Windowsでは「カレントドライブ\home\ユーザー\asakusa\windgate\var\session\asakusa」
の下にセッションファイルが作られるので、手動で消してやる。
WARN resource.StageResourceDriver: Failed to resolve stage resource "storeInfo"
WARN mapred.LocalJobRunner: job_local_0001
java.io.IOException: ���U�L���b�V��"storeInfo"����n�b�V���\���쐬�ł��܂���ł���
at com.asakusafw.runtime.flow.join.JoinResource.setup(JoinResource.java:69)

Caused by: java.io.FileNotFoundException: File /tmp/hadoop-ユーザー/mapred/local/archive/11〜01/filetarget/testdriver/hadoopwork/bid/byCategory/prologue/windgate/storeInfo does not exist.
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:383)
CentOSで実行したときは$HOMEの権限の問題でこの例外が発生したが、Windowsでは違う原因
今のところ解決策なしorz

storeInfoが見つからないというのは、分散キャッシュのstoreInfoのファイルが見つからないというもの。
(Hadoopには「分散キャッシュ」という“ファイルを各データノードへ配布する仕組み”がある)
WindGateでは分散キャッシュを利用しているらしい。

で、スタンドアローンモード(単独環境)のHadoop内では、分散キャッシュのファイルをtmpに作成する。
このとき、「/tmp/hadoop-ユーザー/mapred/〜/windgate/storeInfo」というファイルを作る為に、
一旦「/tmp/hadoop-ユーザー/mapred/〜/windgate-work-乱数/」という場所に作ってから、「windgate-work-乱数」を「windgate」に改名する。
(TrackerDistributedCacheManagerというクラスのdownloadCacheObject()メソッド内の「localFs.rename(workDir, finalDir)」でRawLocalFileSystemのrename()が呼ばれる)
これは、最終的にはFile#renameTo()を呼び出す。
renameTo()は、CentOSでは改名先のディレクトリーが存在していると上書きするので正常に改名(移動)できるが、
Windowsでは失敗する。失敗したらHadoopのFileUtilを使ってディレクトリーをコピーするようになっているのだが、なんと「windgate」の下に「windgate-work-乱数」をコピーしてしまう!(余計な階層のディレクトリーになってしまう)
したがって、本来欲しいパスにはstoreInfoファイルが存在しないので、分散キャッシュが取得できずエラーになってしまう。

Hadoop(CDH3u2)のバグ…と言いたいところだが、Windowsは正式サポートの対象ではない気がするので、直してもらえないかなぁ。
でも「リネームが失敗したらコピー」という部分のバグだから、修正対象に入れてもらえるかなぁ?


運用環境構築・実行

運用環境(実際の分散環境・本番環境)でAsakusaアプリを動かせるようにすることを「運用環境へのデプロイ」と言う。[2011-12-24]

開発環境上でプログラミングしてテストが成功したら、アーカイブを作って本番環境(アプリを起動させるマシン)に持っていく。
アプリを起動させるマシンはCDH3がインストールされていて設定ファイル(conf)が運用環境を指していればどのマシンでもいいと思うが、今回はNameNodeから起動させることにする。

WindGate SSH


運用環境の構築

Asakusaアプリを起動させるマシンには、AsakusaFWのライブラリーを最初にインストール(整備)しておく必要がある。
仮想分散環境(CentOS)のNameNodeにインストールしてみた。
※ここでは、アプリを起動させる(UNIXの)ユーザーを「hishidama」としている。

  1. 起動マシン(NameNode)のアプリ起動ユーザー(hishidama)で環境変数ASAKUSA_HOME(インストールする場所)を定義しておく。
    export ASAKUSA_HOME=$HOME/asakusa
  2. インストール先のディレクトリーを作っておく。
    $ mkdir -p $ASAKUSA_HOME
  3. 開発環境上のAsakusaアプリのディレクトリーでMavenのコマンドを実行し、「インストールアーカイブ」を生成する。
    (初めて開発環境を構築するときに実行しているので、アーカイブは既に出来ているはず)
    $ cd Asakusaアプリのディレクトリー
    $ mvn assembly:single
    
    $ ls target/*.gz
    target/asakusafw-0.2.4-dev.tar.gz
    target/asakusafw-0.2.4-prod-cleaner.tar.gz
    target/asakusafw-0.2.4-prod-windgate.tar.gz
  4. インストールアーカイブ(asakusafw-0.2.4-prod-windgate.tar.gz)をインストールするマシンへ転送し、解凍する。
    $ cd $ASAKUSA_HOME
    $ tar xf asakusafw-0.2.4-prod-windgate.tar.gz
    $ find . -name "*.sh" | xargs chmod u+x

運用環境で実行

開発環境上でAsakusaアプリのアーカイブを作り、運用環境に持っていって実行する。

  1. 開発環境上のAsakusaアプリのディレクトリーでMavenのコマンドを実行し、アーカイブを作成する。
    $ cd Asakusaアプリのディレクトリー
    $ mvn package
    
    $ ls target/*.jar
    target/アプリ名-バージョン-sources.jar
    target/アプリ名-batchapps-バージョン.jar
    target/アプリ名-バージョン.jar
  2. バッチアプリのアーカイブ(アプリ名-batchapps-バージョン.jar)を起動するマシンへ転送し、解凍する。
    (バッチIDの名前のディレクトリーが作られる)
    $ cd 適当なディレクトリー
    $ jar xf アプリ名-batchapps-バージョン.jar
    $ find . -name "*.sh" | xargs chmod u+x
  3. 実行する。
    $ cd 適当なディレクトリー/バッチID
    $ bin/experimental.sh

(experimental.shでなく)YAESSを使って実行する方法もある。

  1. バッチアプリのアーカイブ(アプリ名-batchapps-バージョン.jar)を起動するマシン上の$ASAKUSA_HOMEに展開する。
    $ cd $ASAKUSA_HOME/batchapps
    $ jar xf アプリ名-batchapps-バージョン.jar
    $ rm -rf META-INF
    $ find . -name "*.sh" | xargs chmod u+x
  2. 実行する。
    (バッチIDは、$ASAKUSA_HOME/batchappsの下のディレクトリー名と同じ)
    $ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh バッチID

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