===========================
MapReduceタスクの最適化設定
===========================
この文書では、Hadoopパラメータとして設定可能なMapReduceタスクの最適化設定について説明します。
.. attention::
本書で説明する機能はAsakusa on MapReduceでのみ使用可能です。
.. seealso::
Hadoopパラメータの設定方法については、 :doc:`../administration/configure-hadoop-parameters` を参照してください。
タスク最適化の設定
==================
MapReduceタスクの最適化に関する設定を有効にするには、後述する最適化設定用のHadoopパラメータを :file:`asakusa-resources.xml` に設定します。
以下はタスク最適化の設定例です。
.. code-block:: xml
:caption: asakusa-resources.xml
:name: asakusa-resources.xml-configure-task-optimization-1
com.asakusafw.inprocess.limit
5242880
com.asakusafw.input.combine.max
256
com.asakusafw.input.combine.tiny.limit
1048576
com.asakusafw.reducer.tiny.limit
1048576
この例では以下の設定を行なっています。
* `スモールジョブ実行エンジン`_ に関する設定
* スモールジョブ実行エンジンを有効にする最大入力バイト数: ``5MB``
* `入力スプリットの結合`_ に関する設定
* Mapperごとの最大スプリット数: ``256``
* 「小さな入力」として扱う最大バイト数: ``1MB``
* `Reduceタスクの調整`_ に関する設定
* 「小さなジョブ」として扱う最大バイト数: ``1MB``
スモールジョブ実行エンジン
==========================
スモールジョブ実行エンジンはAsakusa Frameworkの実行モジュールとして提供される、小さなデータの処理に適したジョブの実行エンジンです。
これを従来のHadoopが提供するMapReduceフレームワークと組み合わせて利用することで、幅広いデータレンジに対してそれぞれ適した実行エンジンを自動的に選択し、効果的にバッチアプリケーションを実行することができます。
スモールジョブ実行エンジンに関するHadoopパラメータは以下の通りです。
.. list-table:: スモールジョブ実行エンジン
:widths: 20 10 30
:header-rows: 1
* - 設定名
- 既定値
- 概要
* - ``com.asakusafw.inprocess.limit``
- ``-1``
- スモールジョブ実行エンジンを有効にする最大入力バイト数 [#]_ ( ``0`` 未満の場合は無効)
* - ``com.asakusafw.mapreduce.shuffle.buffer``
- ``67108864``
- スモールジョブ実行エンジン内で利用する、シャッフルバッファ向けのメモリバイト数 [#]_
* - ``com.asakusafw.mapreduce.shuffle.tempdir``
- ``java.io.tmpdir`` と同等
- スモールジョブ実行エンジンが使用する一時ディレクトリ [#]_
.. [#] スモールジョブ実行エンジンの選択を判定する際に使用される入力データのバイト数は、該当ジョブが入力とする全てのファイルサイズの合計値です。
.. [#] 通常はこのパラメータを変更する必要はありません。
.. [#] 一時ディレクトリを指定する場合は必ずフルパスで指定してください。
.. attention::
スモールジョブ実行エンジンは、ジョブを実行するクライアントプロセス内で処理を行うため、大きなデータを処理した際に性能が大幅に劣化します。通常の場合、 ``com.asakusafw.inprocess.limit`` は最大でも10MB程度 ( ``10485760`` ) を上限値とすることを推奨します。
.. attention::
入力データが小さくても計算に時間が掛かる処理や、途中でデータを大量に増幅させる処理などが存在する場合、本機能を有効にすることで余計に処理時間を要する可能性があります。
.. attention::
スモールジョブ実行エンジンを利用して処理を行った場合、Hadoopが提供するジョブ履歴の機能や、ログの保存機能などは利用できません。これらHadoopの機能を利用したい場合には、上記の設定は行わないでください。
なお、スモールジョブ実行エンジンはHadoopクライアントのログ設定を利用してログを出力します。
入力スプリットの結合
====================
Asakusa Frameworkでは、MapReduceジョブを実行する際に複数の入力データのスプリットを結合して、実行するMapタスク数を減らす機能を提供しています。
入力スプリットの結合に関するHadoopパラメータは以下の通りです。
.. list-table:: 入力スプリットの結合
:widths: 20 10 30
:header-rows: 1
* - 設定名
- 既定値
- 概要
* - ``com.asakusafw.input.combine.max``
- ``Integer.MAX_VALUE``
- Mapperごとの最大スプリット数
* - ``com.asakusafw.input.combine.tiny.limit``
- ``-1``
- 「小さな入力」として扱う最大バイト数 ( ``0`` 未満の場合は無効)
.. hint::
Mapタスク数を減らすことで計算リソースの無駄遣いを抑制したり、タスク起動のオーバーヘッドを削減したりできます。
Mapperごとの最大スプリット数
----------------------------
``com.asakusafw.input.combine.max`` は `Mapperごとの最大スプリット数` の設定です。
特定のMapperの入力データのスプリット数がこの設定値を超える場合、そのMapperに対する入力スプリットをこの設定値となるよう結合します。
ジョブの中で複数のMapperが利用される場合、最大で `Mapper数 * Mapperごとの最大スプリット数` のMapタスクが実行されます。
.. hint::
この設定値は通常、はMapタスクの合計スロット数の1~2倍程度が妥当でしょう。
標準では ``Integer.MAX_VALUE`` に設定されているため、この機能は無効化されています。
.. tip::
スタンドアロンモードのHadoop、およびスモールジョブ実行エンジン上では、 `Mapperごとの最大スプリット数`_ は自動的に ``1`` が設定されます。
遺伝的アルゴリズムの調整
~~~~~~~~~~~~~~~~~~~~~~~~
入力スプリットの結合には遺伝的アルゴリズムを利用します。遺伝的アルゴリズムのパラメータは以下の設定が可能です。
.. list-table:: 遺伝的アルゴリズムの調整
:widths: 5 1 4
:header-rows: 1
* - 設定名
- 既定値
- 概要
* - ``com.asakusafw.input.combine.ga.generation``
- ``100``
- 世代数 [#]_
* - ``com.asakusafw.input.combine.ga.population``
- ``50``
- 世代ごとの個体数 [#]_
* - ``com.asakusafw.input.combine.ga.mutation``
- ``0.001``
- 突然変異率 [#]_
* - ``com.asakusafw.input.combine.ga.initialLoacality``
- ``0.8``
- 初期遺伝子に対するデータローカルタスクの割合 [#]_
* - ``com.asakusafw.input.combine.ga.averageTimeWeight``
- ``1.0``
- タスクの平均実行時間に対する重み付け [#]_
* - ``com.asakusafw.input.combine.ga.nonLocalPenalty``
- ``2.0``
- 非データローカルタスクのペナルティ率 [#]_
.. note::
基本的に、上記パラメータの変更は不要です。
例外的に、遺伝的アルゴリズムによる計算にかかる時間が気になる場合、世代数や個体数を減らすことで計算時間を削減できます。
.. [#] 遺伝的アルゴリズムの世代数を表します。
この値を増やすことによってより最適解に近いスケジュールを発見できるようになりますが、遺伝的アルゴリズムの処理時間は世代数に対して線形に増加します。
.. [#] 遺伝的アルゴリズムの世代ごとの個体数を表します。
世代数と同様にスケジュールが改善する可能性がありますが、アルゴリズムの処理時間は線形に増加します。
.. [#] 遺伝的アルゴリズムの突然変異率を表します。
この値は各個体に含まれる遺伝子上の要素に対する発生確率を表しています。
この値を高くすると、アルゴリズムはランダム探索に近づいていきます。
逆にこの値を低くすると、アルゴリズムは局所解に陥りやすくなるおそれがあります。
.. [#] アルゴリズムで利用する初期遺伝子に対する、データローカリティの割合を表します。
この値を低く設定した場合、遺伝子の多様性が保たれる反面、最適解を得るためには十分な世代数(generation)が必要となります。
この値を高く設定した場合、初期状態でよい結果が得られる可能性が高い反面、遺伝子の多様性が低下するため局所解に陥る可能性があります。
.. [#] ジョブに含まれるタスクの最悪実行時間に対し、タスクの平均実行時間をどの程度重視するかを表します。
1.0の場合には同等として扱います。
この値を小さく設定すると、アルゴリズムはタスクごとの最悪時間を最小にすることを優先します。
この値を大きく設定すると、タスク全体のデータローカリティの向上を優先します。
.. [#] tmpfsを利用したり、ラックネットワークが極端に遅いなど、ローカルストレージとネットワーク速度に大きな開きがある場合、この値を大きな値に変更します。
アルゴリズムでは、この値を利用してデータローカリティのないデータの読み出し速度を計算します。
具体的には、データローカリティのあるデータ処理に掛かる推定時間に対し、この値を乗算した値をデータローカリティのないデータ処理に掛かる推定時間として利用します。
「小さな入力」として扱う最大バイト数
------------------------------------
``com.asakusafw.input.combine.tiny.limit`` は `「小さな入力」として扱う最大バイト数` の設定です。
特定のMapperへの入力データサイズがこの設定値よりも小さな場合、そのMapperに対するスプリットはすべて1つにまとめられます。
.. attention::
この設定値に大きな数を指定した場合、 Mapタスクが分散処理を行えなくなる場合があります。
.. hint::
標準では ``-1`` に設定されているため、この設定は無効化されています。
この設定値には非常に小さな値を指定するか、設定を無効化しておくことを推奨します。
Reduceタスクの調整
==================
Asakusa Frameworkでは、MapReduceジョブを実行する際に入力データの特性に応じてReduceタスクを調整する機能を提供しています。
Reduceタスクの調整に関するHadoopパラメータは以下の通りです。
.. list-table:: Reduceタスクの調整
:widths: 20 10 30
:header-rows: 1
* - 設定名
- 既定値
- 概要
* - ``com.asakusafw.reducer.tiny.limit``
- ``-1``
- 「小さなジョブ」として扱う最大バイト数 ( ``0`` 未満の場合は無効)
.. hint::
Reduceタスク数を減らすことで計算リソースの無駄遣いを抑制したり、タスク起動のオーバーヘッドを削減したりできます。
「小さなジョブ」として扱う最大バイト数
--------------------------------------
``com.asakusafw.reducer.tiny.limit`` は `「小さな入力」として扱う最大バイト数` の設定です。
あるジョブの入力データサイズが、「小さなジョブ」として扱う最大バイト数以下の場合に、そのジョブのReduceタスク数を ``1`` に再設定します(Reduceタスクを利用しない場合を除く)。
.. attention::
入力データが小さくても計算に時間が掛かる処理や、Mapタスク内でデータを大量に増幅させる処理などが存在する場合、この設定を有効にすることで余計に処理時間を要する可能性があります。
.. hint::
ここには非常に小さな値(数MB程度)を指定するか、本機能を無効化しておくことを推奨します。
標準では ``-1`` に設定されているため、この設定は無効化されています。