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
CentOS5にAsakusaFW 0.2.4(WindGate)の開発環境を構築する手順。
(VMware上の64bit版CentOS5.7で試している。→対応プラットフォーム)
JAVA_HOME | /usr/java/default |
|
ASAKUSA_HOME | /home/ユーザー名/asakusa |
Asakusa Frameworkをインストールする場所。 インストール前に環境変数を設定しておくと、この場所に作られる。 $HOME/asakusaが推奨されている。 |
$ cd ~/workspace $ mvn archetype:generate -DarchetypeCatalog=http://asakusafw.s3.amazonaws.com/maven/archetype-catalog.xml途中で聞かれる選択肢は以下の様な感じで指定する。
Choose archetype: |
3 | ここではWindGateを選択する。 |
Choose version: |
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: |
y | 上で入力した値の確認。 これで良ければYを入れる。 nとか入れると再度groupIdから入力し直せる。 |
$ cd afw-wgate $ mvn assembly:single antrun:run実行が正常に終わると、afw-wgateの下にtargetというディレクトリーが出来ている他、ASAKUSA_HOMEで指定された場所に 実際にディレクトリーが作られる。
$ mvn test
$ mvn eclipse:eclipse
$ mvn -Declipse.workspace=.. eclipse:add-maven-repo
これでインストール(Eclipseの設定)が終わったので、テストを実行してみる。
エラー内容 | エラーの説明と対処法 |
---|---|
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をインストールし直す。 |
Windows7にAsakusaFW 0.2.4(WindGate)の開発環境を構築してみる。(挫折中)
Mavenを使ってディレクトリーを作り、EclipseのワークスペースへインポートしてOperatorのテストをするまではCentOSへのインストールと同じ。
(「mvn test」は失敗するが)
しかしジョブフローのテスト(CategorySummaryJobTest)を実行するとエラーになる。
エラー内容 | エラーの説明と対処法 |
---|---|
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から起動させることにする。
Asakusaアプリを起動させるマシンには、AsakusaFWのライブラリーを最初にインストール(整備)しておく必要がある。
仮想分散環境(CentOS)のNameNodeにインストールしてみた。
※ここでは、アプリを起動させる(UNIXの)ユーザーを「hishidama」としている。
export ASAKUSA_HOME=$HOME/asakusa
$ mkdir -p $ASAKUSA_HOME
$ 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
$ cd $ASAKUSA_HOME $ tar xf asakusafw-0.2.4-prod-windgate.tar.gz $ find . -name "*.sh" | xargs chmod u+x
開発環境上でAsakusaアプリのアーカイブを作り、運用環境に持っていって実行する。
$ cd Asakusaアプリのディレクトリー $ mvn package $ ls target/*.jar target/アプリ名-バージョン-sources.jar target/アプリ名-batchapps-バージョン.jar target/アプリ名-バージョン.jar
$ cd 適当なディレクトリー $ jar xf アプリ名-batchapps-バージョン.jar $ find . -name "*.sh" | xargs chmod u+x
$ cd 適当なディレクトリー/バッチID $ bin/experimental.sh
(experimental.shでなく)YAESSを使って実行する方法もある。
$ cd $ASAKUSA_HOME/batchapps $ jar xf アプリ名-batchapps-バージョン.jar $ rm -rf META-INF $ find . -name "*.sh" | xargs chmod u+x
$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh バッチID