Asakusa on M3BPユーザーガイド

この文書では、Asakusa on M3BPを利用してバッチアプリケーションをビルドし、実行する方法について説明します。

概要

Asakusa on M3BPは、Asakusa DSLを始めとするAsakusa Frameworkの開発基盤を利用して作成したバッチアプリケーションに対して、M3 for Batch Processing [1] をその実行基盤として利用するための機能セットを提供します。

M3 for Batch ProcessingはDAG (Directed Acyclic Graph; 有向非循環グラフ) の形で表現されたタスクをマルチコア環境で効率よく処理するためのフレームワークで、以下のような特徴があります。

  • 単一ノード上のマルチコア/マルチプロセッサ用に最適化
  • 細粒度で動的なタスクスケジューリング
  • ほぼすべてオンメモリで処理

上記のような特徴のため、Hadoop MapReduceやSparkに比べて、小〜中規模データサイズのバッチ処理に非常に適しています。

Asakusa Frameworkの適用領域においても、中間結果が全てメモリ上に収まる規模のバッチにおいてはAsakusa on Sparkよりも高速で、かつ高いコストパフォーマンスになることを確認しています [2]

[1]https://github.com/fixstars/m3bp
[2]https://www.asakusafw.com/techinfo/reference.html

構成

Asakusa on M3BPを利用する場合、従来のAsakusa Frameworkが提供するDSLやテスト機構をそのまま利用して開発を行います。 アプリケーションをビルドして運用環境向けの実行モジュール(デプロイメントアーカイブ)を作成する段階ではじめてAsakusa on M3BPのDSLコンパイラ(DSL Compiler for M3BP)を利用します。

../_images/asakusa-sdk.png

また、DSL Compiler for M3BPで生成したバッチアプリケーションは、従来と同様にYAESSを利用して実行できます。 このとき、MapReduceやSparkと異なり、実行基盤にHadoopを必要としません (Hadoopとの連携により、HDFS等を利用することもできます)。

../_images/asakusa-runtime.png
Asakusa DSL
従来のAsakusa DSLやDMDLで記述したバッチアプリケーションは基本的に変更なしで、DSL Compiler for M3BPを利用してM3 for Batch Processing上で実行可能なジュールを生成することができます。
テスト機構
従来のAsakusa DSLのテスト方法と同様に、テストドライバーを利用してAsakusa DSLのテストを実行することができます。このとき、Asakusa on M3BPは特に利用しません。
アプリケーションの実行
従来と同様、YAESSを利用してバッチアプリケーションを実行することができます。 実行環境にMapReduce用、Spark用、M3 for Batch Processing用のバッチアプリケーションをすべて配置して運用することも可能です。
外部システム連携
Direct I/OやWindGateといった外部システム連携モジュールはAsakusa on M3BPのバッチアプリケーションでもそのまま利用することができます。

Attention

Asakusa on M3BPを利用する上でもWindGateなどの外部システム連携機能において、一部Hadoopの機能を利用します。

対応プラットフォーム

実行環境

Asakusa on M3BPは、今のところ64ビットx86アーキテクチャのLinux環境 (以下、Linux x64)上のみで動作の確認を行っています。

Asakusa on M3BPのアプリケーションを実行する場合、以下または互換のソフトウェアが必要になります。

  • Java SE Development Kit 8 Update 74 (Linux x64)
  • GNU C++ Library 4.8.5 (libstdc++.so.6)
  • GNU C Library 2.17 (libc.so.6)
  • Portable Hardware Locality 1.7 (libhwloc.so.5) [3]

Hint

上記の構成は、Red Hat Enterprise Linux 7.2 (またはCentOS 7.2などのクローン)を想定しています。 これらのディストリビューションを利用している場合、標準のパッケージ管理ツールで上記の一部を導入できます。

[3]https://www.open-mpi.org/projects/hwloc/

Hadoopディストリビューション

Asakusa on M3BPは、実行環境にインストールされたHadoopと連係して動作することもできます。

以下のような機能を利用できます。

  • Direct I/O
    • 入出力データソースに、HDFSやその他のHadoopが対応しているファイルシステムを利用
  • WindGate
    • HDFSを経由してWindGateの入出力を授受

Hadoopとの連携方法は、 Hadoopとの連携 を参照してください。

Asakusa on M3BPが動作を検証しているHadoopディストリビューションは、 対応プラットフォーム の「Hadoopディストリビューション」を参照してください。

Attention

Asakusa on M3BP をMapRと連携して利用する場合において、バッチアプリケーションの起動時にデッドロックが発生しアプリケーションが実行されないことがある問題を確認しています。 この問題の回避方法について Hadoopとの連携 に記載しています。

開発環境の構築

バッチアプリケーションの開発環境には、通常のAsakusa Frameworkの開発環境に加え、実行環境上で動作するネイティブライブラリをビルドするための環境が必要となります。

Asakusa on M3BPを利用して実行モジュールを作成するには、以下または互換のソフトウェアが必要になります。

  • Java SE Development Kit 8 Update 74
  • CMake 2.8 [4]
  • GNU Make 3.82 [5]
  • GNU Compiler Collection 4.8.5 (Linux x64) [6]
    • gcc
    • g++

Attention

ビルド環境と実行環境が異なる場合、実行環境で動作するオブジェクトコードを生成するためのクロスコンパイラが必要になります。 オブジェクトコードの生成時にはCMakeを内部的に利用しているため、クロスコンパイラの設定もCMakeの機能を利用して行うことができます。

クロスコンパイラを導入したら、DSL Compiler for M3BPのコンパイラオプション m3bp.native.cmake.CMAKE_TOOLCHAIN_FILE にCMakeのツールチェインファイルを指定してください。

参考URL: https://cmake.org/Wiki/CMake_Cross_Compiling

Hint

通常のAsakusa Frameworkの開発環境を準備するには以下のドキュメントなどを参考にしてください。

[4]https://cmake.org/
[5]https://www.gnu.org/software/make/
[6]https://gcc.gnu.org/

アプリケーションの開発

開発環境上で Asakusa Frameworkのバッチアプリケーションを開発し、Asakusa on M3BPのアプリケーションをビルドする方法を見ていきます。

プロジェクトテンプレート

Asakusa on M3BPを利用する構成を持つアプリケーション開発用のプロジェクトテンプレートは、以下リンクからダウンロードします。

See also

プロジェクトテンプレートの構成や利用方法については、 Asakusa Gradle Plugin ユーザーガイド を参照してください。

サンプルアプリケーション

サンプルプログラム集 (GitHub) に含まれるプロジェクト example-basic-m3bp は Asakusa on M3BPを利用する基本的なサンプルアプリケーションプロジェクトです。

このプロジェクトは Asakusa on M3BP用のプロジェクトテンプレートに対して、 Asakusa Framework スタートガイド などで説明しているサンプルアプリケーション「カテゴリー別売上金額集計バッチ」用のソースコードが追加されています。

Asakusa on M3BP Gradle Plugin

Asakusa on M3BP Gradle Pluginは、アプリケーションプロジェクトに対してAsakusa on M3BPのさまざまな機能を追加します。

プロジェクトテンプレートサンプルアプリケーション で紹介したプロジェクトには、 Asakusa on M3BP Gradle Pluginがあらかじめ利用可能になっています。

その他のプロジェクトで Asakusa on M3BP Gradle Pluginを有効にするには、アプリケーションプロジェクトのビルドスクリプト ( build.gradle )に対して以下の設定を追加します。

  • apply plugin: 'asakusafw-m3bp'

以下はAsakusa on M3BP Gradle Pluginの設定を追加したビルドスクリプトの例です。

build.gradle
group 'com.example'

buildscript {
    repositories {
        maven { url 'https://asakusafw.s3.amazonaws.com/maven/releases' }
    }
    dependencies {
        classpath group: 'com.asakusafw.gradle', name: 'asakusa-distribution', version: '0.10.4'
    }
}

apply plugin: 'asakusafw-sdk'
apply plugin: 'asakusafw-organizer'
apply plugin: 'asakusafw-m3bp'
apply plugin: 'eclipse'

See also

Asakusa on M3BP Gradle Pluginのより詳細な情報は、 Asakusa Gradle Plugin リファレンスAsakusa on M3BPリファレンス などを参照してください。

アプリケーションのビルド

Asakusa on M3BP Gradle Plugin を設定した状態で、Gradleタスク m3bpCompileBatchapps を実行すると、Asakusa on M3BP向けのバッチアプリケーションのビルドを実行します。

./gradlew m3bpCompileBatchapps

m3bpCompileBatchapps タスクを実行すると、アプリケーションプロジェクトの build/m3bp-batchapps 配下にビルド済みのバッチアプリケーションが生成されます。

標準の設定では、Asakusa on M3BPのバッチアプリケーションは接頭辞に m3bp. が付与されます。 例えば、サンプルアプリケーションのバッチID example.summarizeSales の場合、Asakusa on M3BPのバッチアプリケーションのバッチIDは m3bp.example.summarizeSales となります。

See also

DSL Compiler for M3BPで利用可能な設定の詳細は、 Asakusa on M3BPリファレンス を参照してください。

デプロイメントアーカイブの生成

Asakusa on M3BP Gradle Plugin を設定した状態で、Asakusa Frameworkのデプロイメントアーカイブを作成すると、Asakusa on M3BPのバッチアプリケーションアーカイブを含むデプロイメントアーカイブを生成します。

デプロイメントアーカイブを生成するには Gradleの assemble タスクを実行します。

./gradlew assemble

Hint

Shafuを利用する場合は、プロジェクトを選択してコンテキストメニューから Jinrikisha (人力車) ‣ Asakusaデプロイメントアーカイブを生成 を選択します。

Hadoopとの連携

Attention

Hadoopとの連携についての標準の動作および設定は、Asakusa Framework バージョン 0.10.0 から大きく変更されました。 バージョン0.9系、およびそれ以前のバージョンから移行する場合、必ず Asakusa Gradle Plugin バージョン 0.10系 の変更点 を参照してください。

デプロイメントアーカイブの生成を行う際に、標準の設定では実行環境上にインストールしたHadoopと連携するようデプロイメントアーカイブを生成します。 実行環境上にインストールしたHadoopと連携することで、環境上に構築されているHDFSなどに対してファイルの入出力を行うことができるようになります。

実行環境にインストールされたHadoopを利用する際、以下の順序で hadoop コマンドを探して利用します (上にあるものほど優先度が高いです)。

  • 環境変数に HADOOP_CMD が設定されている場合、 $HADOOP_CMD コマンドを経由して起動します。
  • 環境変数に HADOOP_HOME が設定されている場合、 $HADOOP_HOME/bin/hadoop コマンドを経由して起動します。
  • hadoop コマンドのパスが通っている場合、 hadoop コマンドを経由して起動します。

Warning

多くのHadoopコマンドは、Java VMのヒープ容量の最大値に非常に小さな値を標準で指定します。 この設定を上書きする方法は、 Java VMの設定 を参照してください。

Attention

MapRなどの一部の環境では、バッチアプリケーション起動時にデッドロックが発生しアプリケーションが正しく実行されないことがある問題が確認されています。 これを回避するには、 build.gradle に以下の設定を加えてください

build.gradle
asakusafwOrganizer {
    extension {
        libraries += ["com.asakusafw.m3bp.bridge:asakusa-m3bp-workaround-hadoop:${asakusafw.m3bp.version}"]
    }
}

また、実行環境のHadoopと連携せずローカルファイルシステムや外部のデータベースに対してのみデータの入出力を行うような場合でも、 Direct I/OやWindGateなどの一部のコンポーネントはHadoopに含まれるライブラリやスクリプトを必要とするため、 実行環境上にはAsakusa Frameworkの実行に必要なHadoopコンポーネントを導入する必要があります。

このような場合 Asakusa Gradle Plugin の機能で、必要な最低限のHadoopライブラリーをデプロイメントアーカイブに組み込むことができます。 デプロイメントアーカイブにHadoopライブラリーを含めるには、以下の設定を追加してください。

  • asakusafwOrganizer.hadoop.embed true

以下は、 prod プロファイルのデプロイメントアーカイブに対してのみ上記の設定を行う例です。

build.gradle
group 'com.example'

buildscript {
    repositories {
        maven { url 'https://asakusafw.s3.amazonaws.com/maven/releases' }
    }
    dependencies {
        classpath group: 'com.asakusafw.gradle', name: 'asakusa-distribution', version: '0.10.4'
    }
}

apply plugin: 'asakusafw-sdk'
apply plugin: 'asakusafw-organizer'
apply plugin: 'asakusafw-m3bp'
apply plugin: 'eclipse'

asakusafwOrganizer {
    profiles.prod {
        hadoop.embed true
    }
}

Attention

この方法で導入されるHadoopはAsakusa Frameworkの実行に最低限必要なコンポーネントのみが含まれます。 特にHDFSなどのHadoopファイルシステム実装ライブラリが含まれないなどの制約があるため、 実行環境上のHadoopファイルシステムと連携する場合にはこのオプションを有効にせず、実行環境上にインストールしたHadoopと連携するようにしてください。

Tip

バッチアプリケーション実行時の環境変数は、YAESSプロファイルで設定することも可能です。

Asakusa on M3BPを利用する場合、コマンドラインジョブのプロファイル command.m3bp が利用できます。 $ASAKUSA_HOME/yaess/conf/yaess.propertiescommand.m3bp.env.HADOOP_CMD といったような設定を追加することで、YAESSからAsakusa on M3BPを実行する際に環境変数が設定されます。

YAESSのコマンドラインジョブの設定方法について詳しくは、 YAESSユーザーガイド - コマンドラインジョブの実行 などを参照してください。

アプリケーションの実行

ここでは、Asakusa on M3BP固有の実行環境の設定について説明します。

Asakusa Frameworkの実行環境の構築方法やバッチアプリケーションを実行する方法の基本的な流れは、 Asakusa Framework デプロイメントガイド などを参照してください。

バッチアプリケーションの実行

デプロイしたバッチアプリケーションをYAESSを使って実行します。

$ASAKUSA_HOME/yaess/bin/yaess-batch.sh コマンドに実行するバッチIDとバッチ引数を指定してバッチを実行します。 標準の設定では、Asakusa on M3BPのバッチアプリケーションはバッチIDの接頭辞に m3bp. が付与されているので、このバッチIDを指定します。

Attention

標準の設定では、バッチIDの接頭辞に m3bp. がついていないバッチIDは従来のHadoop MapReduce向けバッチアプリケーションです。YAESSの実行時にバッチIDの指定を間違えないよう注意してください。

例えば、サンプルアプリケーションを実行する場合は、以下のように yaess-batch.sh を実行します。

$ASAKUSA_HOME/yaess/bin/yaess-batch.sh m3bp.example.summarizeSales -A date=2011-04-01

See also

サンプルアプリケーションのデプロイやデータの配置、実行結果の確認方法などは、 Asakusa Framework スタートガイド - サンプルアプリケーションの実行 を参照してください。

Attention

Asakusa on M3BPではメモリ上に中間データを配置するため、入力データが膨大であったり中間データが膨らむようなバッチ処理では、メモリ容量が不足してしまう場合があります。この場合、バッチ処理はエラーにより中断されます。

空きメモリ容量を増やすか、またはAsakusa on Sparkなどの利用を検討してください。

この制約は将来緩和される可能性があります。

Java VMの設定

Asakusa on M3BPでバッチアプリケーションを実行する際には、Java VMをひとつ起動してそのプロセス内でM3 for Batch ProcessingやAsakusaの演算子を実行します。

このとき、対象のJava VMを起動する際のオプション引数を、環境変数 ASAKUSA_M3BP_OPTS で指定できます。

以下は環境変数の設定例です。

export ASAKUSA_M3BP_OPTS='-Xmx16g'

上記のように書いた場合、Javaのヒープ領域の最大値を 16GB に設定できます。

実行コマンドの設定

Asakusa on M3BP実行用のJVMプロセスを起動するJavaコマンドは、環境変数 JAVA_CMD で設定することができます。 JAVA_CMD が未設定の場合、 PATH 環境変数に含まれる java コマンドが使用されます。

Hadoopとの連携 を設定した場合、Asakusa on M3BP実行用のJVMプロセスを起動するコマンドには hadoop コマンドが使用されます。 この場合に利用される hadoop コマンドの検索方法は Hadoopとの連携 の説明を参照してください。

環境変数 ASAKUSA_M3BP_LAUNCHER は実行コマンドの先頭に任意のコマンド文字列を追加します。

ログの設定

Asakusa on M3BPの実行時のログ設定は、Logback設定ファイル $ASAKUSA_HOME/m3bp/conf/logback.xml で設定します。

Attention

Hadoopとの連携 を設定してバッチアプリケーションを実行した際に、利用する環境によってはバッチアプリケーションのログがHadoopのログ設定の上で出力される可能性があります。

Asakusa on M3BPのログ設定を優先したい場合は、環境変数 HADOOP_USER_CLASSPATH_FIRST=true を設定してください。