|
ProgrammingGuideDefinitionOfDataType
SSS Mapreduce Programming Guide - Definition of original data type
ja, en 独自データ構造の定義キーやバリューに利用可能な独自のデータ構造の定義方法の解説を行います。 SSS Mapreduceでは2つの独自データの定義方法として以下の2つの方法を提供しています。
共通部分SSS Mapreduceのキー、バリューとして利用するにはまず、Packableインターフェイスを実装する必要があります。 このインターフェイスを実装する際には以下の2つのメソッドの実装する必要があります。
getRoughSizeメソッドでは、このクラスのインスタンスが専有するメモリ利用量の大まかな値を返します。 getRoughSizeメソッドは、SSS Mapreduceのシステムのバッファにデータを貯める際に大まかなサイズを知るために必要です。 slotメソッドではこのPackableの「スロット値」を返します。 「スロット値」はストレージサーバー内部でデータを分散させるために利用する整数値です。 SSS Mapreduceではスロット値によってストレージサーバー内部でデータを分散させることで、ワーカーサーバーがデータをストレージサーバーから読み込む際に並列に読み込むことが可能になっています。 注意: この値はPartitionerで各ストレージサーバーに分散された後に更に分散させるために利用されるため、Partitionerの返す値と同じであるとサーバー内部での分散がうまくいかずに並列に読み込みを実行することができなくなります。 基本的にはhashCode()の値をそのまま返す実装で問題ありません。 slotメソッドはキーとして利用される場合にのみ利用されるため、バリューとしてのみ利用する場合にはどのような値を返しても問題ありません。 また、キーとして利用される場合には、Object#equalsメソッドとObject#hashCodeメソッドを正しく実装する必要があります。 MessagePackを利用する方法SSS Mapreduceではストレージサーバーにデータを書き込む際に、バイト列にエンコードする必要があります。 そのための方法としてSSS MapreduceではMessagePackを利用することができます。 SSS MapreduceではPackableインターフェイスを実装した上でMessagePackでエンコード可能なクラスであれば、キーもしくはバリューとして利用することができます。 MessagePackでは独自のクラスが以下の条件を満たしていればエンコード可能になります。
独自にエンコーダ/デコーダを定義する方法別の方法として、独自にエンコード/デコードを定義することも可能です。 まず、Packableを継承したInterface SelfPackableを実装します。 SelfPackableを実装するには以下のメソッドを実装する必要があります。 loadBytesメソッドでバイト列からのデコードを、toBytesメソッドでバイト列のエンコードを実装します。ただし、エンコード/デコードを行う場合に何らかのクラスのインスタンスを利用する場合もありえます。 この場合にはloadBytes/toBytesを使う方法では1つのキーもしくはバリューのエンコード/デコードを行うたびに、そのクラスのインスタンスを再生成しなければなりません。 そこで、SelfPackableを実装した上で、クラスメソッドとして以下の名称のものを定義すると、 そのメソッドを使ってスレッド毎にEncoder/Decoderを作成し、それを利用してエンコード/デコードを行います。 public static Encoder createEncoder();
public static Decoder createDecoder();createEncoder/createDecoderはどちらか片方のみ定義しても問題ありません。その場合はloadBytesもしくはtoBytesメソッドを利用します。 Encoder/Decoderの定義は以下のとおりです。 適切にencodeメソッドでエンコードを、decodeメソッドでデコードを適切に実装したものを返すようにして下さい。 public interface Encoder {
byte[] encode(Packable p) throws IOException;
} public interface Decoder {
Packable decode(byte[] b) throws IOException;
}
| |