Pivotal Knowledge Base

フォローする

パーティションリージョンを有する全てのメンバー上での Function 実行方法

環境

  • 同一パーティションリージョンを有する複数のメンバーが存在

事象

与えられたパーティションリージョンを有する「全てのメンバー」上で単一 Function を並列実行しようとしても、そのうちのいくつかのメンバー上でしか実行されないことがある。

原因

GemFire は、パーティションリージョンにおける Function 実行メンバー数を、Function オブジェクトの optimizeForWrite() メソッドの返り値によって自動的に決定する。

もし、optimizeForWrite() の返り値が false であった場合(すなわち、データ読み込みに最適化)、GemFire は、対象リージョンにおいて全てのデータエントリーにアクセスすることが可能な最小のメンバー数で Function を実行する。例えば、パーティションリージョンを 2 つメンバー上で有し、redundant-copies="0" と設定(すなわち、冗長コピーを保持しない設定)した場合は、各データエントリーはどちらかのメンバーに排他的に格納される。この場合、GemFire の Function は双方のメンバーで並列実行される。なぜなら、この構成では全てのエントリーにアクセスするために各メンバーへのローカルアクセスを要するからである。一方、パーティションリージョンを 2 つのメンバー上で有し、redundant-copies="1" と設定(すなわち、冗長コピーを 1 つ保持する設定)した場合、各エントリーは両方のメンバーに格納される(1 つはプライマリーとして、他方はセカンダリーコピーとして)。したがって、GemFire の Function は、1 つのメンバー上でのみ実行される。なぜなら、各メンバーは全てのエントリー(プライマリーと冗長コピーを含む)を保持するからである。よって、Function は単一のメンバーでのみ実行すれば充分なのである。

しかしながら、もし optimizeForWrite() の返り値が true であった場合(すなわち、データ書き込みに最適化)、GemFire の Function は対象パーティションリージョンを有する全てのメンバーで実行される。なぜなら、全てのエントリーを更新するには、プライマリーデータへのアクセスを必要とするためである。 

修正

実際に書き込み処理を行うか行わないかに関わらず、対象 Function を特定パーティションリージョンを有する全てのメンバー上での並列実行を保証するには、Function オブジェクトにて optimizeForWrite() の返り値を "true" とするよう実装する必要がある。すなわち、以下のように optimizeForWrite() メソッドを実装する:

public boolean optimizeForWrite() {
    return true;
}

コメント

Powered by Zendesk