Asakusa Framework0.5.1のDirect I/OをWindows7で使うメモ。
AsakusaFW 0.5.1のDirect I/OをWindowsにインストールしてバッチやジョブフローのテストまで実行する方法をまいあしさんに教えていただいたので、その方法をメモ。
(0.7.1では変なことをしなくてもWindowsでフローのテストが出来る→スモールジョブ実行エンジン [2014-12-13])
Windowsの環境変数を定義する。
| 環境変数名 | ユーザー/ システム  | 
		例 | 説明 | 
|---|---|---|---|
| HADOOP_HOME | システム環境変数 | D:/cygwin/usr/local/hadoop-0.20.2-cdh3u6 | 
		CDH3をインストールした場所。 | 
| PATH | システム環境変数 | 〜;D:/cygwin/bin;%HADOOP_HOME%/bin | 
		Cygwinのbash.exeのある場所およびCDH3のシェルのある場所。 | 
| ASAKUSA_HOME | ユーザー環境変数 | D:/cygwin/home/hishidama/asakusa | 
		Asakusa Frameworkをインストールする場所。 「 D:/cygwin/home/hishidama」は、Cygwin上のホームディレクトリー($HOME)。 | 
	
| USER | ユーザー環境変数 | %USERNAME% | 
		ユーザー名をWindowsの環境変数からUNIXの環境変数に入れる。 | 
CDH3(Hadoop)をインストールし、シェルにパッチを当てる。
# cygwin path translation
if $cygwin; then
  CLASSPATH=`cygpath -p -w "$CLASSPATH"`
  HADOOP_HOME=`cygpath -w "$HADOOP_HOME"`
  HADOOP_LOG_DIR=`cygpath -w "$HADOOP_LOG_DIR"`
  TOOL_PATH=`cygpath -p -w "$TOOL_PATH"`
  JAVA_LIBRARY_PATH=`cygpath -p -w "$JAVA_LIBRARY_PATH"`
  HADOOP_OPTS="-Dfile.encoding=UTF-8 $HADOOP_OPTS"
fi
HADOOP_OPTSにファイルエンコーディングの指定を追加する。
# the root of the Hadoop installation
if [ -z "$HADOOP_HOME" ]; then
  export HADOOP_HOME=`dirname "$this"`/..
else
  export HADOOP_HOME=$(cygpath -u "$HADOOP_HOME")
fi
HADOOP_HOMEをUNIX(Cygwin)のパスに変換する指定を追加する。
# export JAVA_HOME=/usr/lib/j2sdk1.6-sun
export JAVA_HOME=/usr/local/jdk1.6
JAVA_HOMEの指定を追加する。
CDH3で使う為のJavaのシンボリックリンクを作成しておく。
Cygwin(bash)で、以下のようなコマンドを実行する。
$ ln -s "/cygdrive/c/Program Files (x86)/Java/jdk1.6.0_27" /usr/local/jdk1.6
AsakusaFWは、まずは普通にインストールする。
$ cd 展開する場所 $ tar xf ダウンロードした場所/asakusafw-organizer-0.5.1.tar.gz
$ ls …asakusafw-organizerというディレクトリーが作られていることの確認 asakusafw-organizer
$ cd asakusafw-organizer $ export MAVEN_OPTS="-Dfile.encoding=UTF-8" $ mvn package antrun:run
$ ls $ASAKUSA_HOME …インストールされた内容の確認 batchapps compiler directio ext scripts testing VERSION windgate-ssh yaess-hadoop bulkloader core dmdl log temp tools windgate yaess $ cat $ASAKUSA_HOME/VERSION # Asakusa Framework Build Information asakusafw.version=0.5.1 asakusafw.build.timestamp=20130726-1956 asakusafw.build.java.version=1.6.0_33 asakusafw.git.commit=7416e5b5fe9e3f83a5f7226cf6af0038d7a85b4e asakusafw.git.branch=0.5-release
インストールしたAsakusa Frameworkのシェルにパッチを当てる。
(青い部分を追加する。ほとんどはcygpathの追加)
_OPT_APP_LIB="$(cygpath -m "$1")" shift _OPT_CLASS_NAME="$1" shift _OPT_BATCH_ID="$1" shift # _TD_ROOT="$(cd "$(dirname "$0")/.." ; pwd)" _TD_ROOT="$(cygpath -ma "$(dirname "$0")/..")"
_TD_LIBJARS="$_OPT_APP_LIB"
import "$_TD_ROOT/libexec/configure-libjars.sh"
import "$_TD_ROOT/libexec/configure-hadoop-cmd.sh"
_TD_LIBJARS="$(echo $_TD_LIBJARS | sed 's!\(.:\)!file:///\1!g')"
_TD_LIBJARSは、「C:\hoge」といったパス(Windowsのドライブが指定されたパス)を「file:///C:\hoge」に変換(「file:///」を追加)する。
if [ -d "$ASAKUSA_HOME/core/lib" ]
then
    for f in $(ls "$ASAKUSA_HOME/core/lib")
    do
        if [ "$_TD_LIBJARS" = "" ]
        then
            _TD_LIBJARS="$(cygpath -m "$ASAKUSA_HOME/core/lib/$f")"
        else
            _TD_LIBJARS="$_TD_LIBJARS,$(cygpath -m "$ASAKUSA_HOME/core/lib/$f")"
        fi
    done
fi
if [ "$_OPT_BATCH_ID" != "" -a -d "$ASAKUSA_HOME/batchapps/$_OPT_BATCH_ID/usr/lib" ]
then
    _OPT_LIBRARIES_PATH="$(cygpath -m "$ASAKUSA_HOME/batchapps/$_OPT_BATCH_ID/usr/lib")"
    echo "$_OPT_LIBRARIES_PATH"
if [ -d "$ASAKUSA_HOME/ext/lib" ]
then
    for f in $(ls "$ASAKUSA_HOME/ext/lib")
    do
        if [ "$_TD_LIBJARS" = "" ]
        then
            _TD_LIBJARS="$(cygpath -m "$ASAKUSA_HOME/ext/lib/$f")"
        else
            _TD_LIBJARS="$_TD_LIBJARS,$(cygpath -m "$ASAKUSA_HOME/ext/lib/$f")"
        fi
    done
fi
Asakusaプロジェクトは、まずは普通に作成する。
$ cd ワークスペースのディレクトリー $ mvn archetype:generate -DarchetypeCatalog=http://asakusafw.s3.amazonaws.com/maven/archetype-catalog-0.5.xml
Choose archetype: | 
			3 | 
			Direct I/Oを選択。 | 
Choose version: | 
			3 | 
			AsakusaFW 0.5.1を使用。 | 
Define value for property 'groupId': : | 
			com.example | 
			プロジェクトのグループ名。 | 
Define value for property 'artifactId': : | 
			dio051 | 
			プロジェクトのディレクトリー名。 | 
Define value for property 'version': 
			1.0-SNAPSHOT: : | 
			1.0 | 
			今回作る自分のプロジェクトのバージョン。 どんな値でもいいが、ファイル名の一部に使われる。  | 
		
Define value for property 'package': 
			com.example: 
			: | 
			com.example | 
			パッケージ名。 デフォルトはグループ名と同一。  | 
		
$ cd dio051/ $ mvn eclipse:eclipse
JobflowExecutorのソースをコピーして、自分のAsakusaプロジェクト内に同名同パッケージのクラスを作成し、(Cygwinの)bash.exeの呼び出しを追加する。
(環境変数PATHにbash.exeのパスを追加しておく)
import org.apache.commons.lang.SystemUtils;
    public int runShell(
            String[] shellCmd,
            Map<String, String> environmentVariables) throws IOException {
〜
        if (SystemUtils.IS_OS_WINDOWS) {
            String[] sc = new String[shellCmd.length + 1];
            sc[0] = "bash.exe";
            System.arraycopy(shellCmd, 0, sc, 1, shellCmd.length);
            shellCmd = sc;
        }
        LOG.info("[COMMAND] {}", toStringShellCmdArray(shellCmd));
        ProcessBuilder builder = new ProcessBuilder(shellCmd);
〜
    }
JobflowExecutorはジョブフローのテストの実行時に呼ばれる。
このJobflowExecutorと本来のJobflowExecutorが被ることになるが、デフォルトでは自分で作ったクラスの方が先に読み込まれる。
ジョブフロー(やバッチ・フローパート)のテストクラスをEclipseのJUnitで実行する際に、VM引数にuser.homeを指定する。
| VM引数 | 説明 | 
|---|---|
-Duser.home=D:/cygwin/home/hishidama | 
		Cygwin上のユーザーのホームディレクトリー。 | 
mvnでテストするときも同様のオプションを付ければテストが通るが、このオプションはMavenのリポジトリーの場所にも影響を与えるので、再度jarファイル類がダウンロードされてしまう(苦笑)
$ mvn test -Duser.home=D:/cygwin/home/hishidama
というわけで、上記の修正を施したファイルは以下の通り。
windows-0.5.1.zip(16.5kB)