S-JIS[2013-10-05] 変更履歴

Asakusa Framework0.5.1 Windows

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の修正

CDH3(Hadoop)をインストールし、シェルにパッチを当てる。

HADOOP_HOME/bin/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にファイルエンコーディングの指定を追加する。

HADOOP_HOME/bin/hadoop-config.sh:

# 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)のパスに変換する指定を追加する。

HADOOP_HOME/conf/hadoop-env.sh:

# 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

Asakusa Frameworkのインストール

AsakusaFWは、まずは普通にインストールする。

  1. 環境変数ASAKUSA_HOMEを定義しておく。
    (ASAKUSA_HOMEで指定したディレクトリーにAsakusa Frameworkがインストールされる)
  2. Framework Organizerをインストールする。
    1. Framework Organizer利用ガイドから、Framework Organizerのアーカイブ(asakusafw-organizer-0.5.1.tar.gz)をダウンロードする。
    2. Cygwinでアーカイブを解凍する。
      $ cd 展開する場所
      $ tar xf ダウンロードした場所/asakusafw-organizer-0.5.1.tar.gz
      $ ls		…asakusafw-organizerというディレクトリーが作られていることの確認
      asakusafw-organizer
  3. Asakusa Frameworkをインストールする。
    (色々なjarファイルがダウンロードされるので、時間がかかる)
    (これにより、環境変数ASAKUSA_HOME指すディレクトリーの下に色々なファイル・ディレクトリーが配置される)
    (MAVEN_OPTSでエンコーディングを指定しないと、bulkloader(ThunderGate)のシェル内の日本語が文字化けする。ThunderGateはまず使わないと思うので、あまり関係ないけど^^;
    $ 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の修正

インストールしたAsakusa Frameworkのシェルにパッチを当てる。
(青い部分を追加する。ほとんどはcygpathの追加)

ASAKUSA_HOME/testing/libexec/hadoop-execute.sh:

_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:///」を追加)する。

ASAKUSA_HOME/testing/libexec/configure-libjars.sh:

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プロジェクトの作成

Asakusaプロジェクトは、まずは普通に作成する。

  1. Asakusa Frameworkの開発用プロジェクト(ディレクトリー)を作成する。
    $ cd ワークスペースのディレクトリー
    $ mvn archetype:generate -DarchetypeCatalog=http://asakusafw.s3.amazonaws.com/maven/archetype-catalog-0.5.xml
    Choose archetype:
    1: http://asakusafw.s3.amazonaws.com/maven/archetype-catalog-0.5.xml -> com.asakusafw:asakusa-archetype-windgate (-)
    2: http://asakusafw.s3.amazonaws.com/maven/archetype-catalog-0.5.xml -> com.asakusafw:asakusa-archetype-thundergate (-)
    3: http://asakusafw.s3.amazonaws.com/maven/archetype-catalog-0.5.xml -> com.asakusafw:asakusa-archetype-directio (-)
    3 Direct I/Oを選択。
    Choose version:
    1: 0.5-SNAPSHOT
    2: 0.5.0
    3: 0.5.1
    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 パッケージ名。
    デフォルトはグループ名と同一。
  2. Eclipseの設定を生成する。
    $ cd dio051/
    $ mvn eclipse:eclipse

テストドライバーの修正

JobflowExecutorのソースをコピーして、自分のAsakusaプロジェクト内に同名同パッケージのクラスを作成し、(Cygwinの)bash.exeの呼び出しを追加する。
(環境変数PATHにbash.exeのパスを追加しておく)

src/test/java/com/asakusafw/testdriver/JobflowExecutor.java:

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)


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