My favorites | Sign in
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Search
for
ProgrammingGuideDefinitionOfDataType  
SSS Mapreduce Programming Guide - Definition of original data type
ja, en
Updated Feb 27, 2013

独自データ構造の定義

キーやバリューに利用可能な独自のデータ構造の定義方法の解説を行います。 SSS Mapreduceでは2つの独自データの定義方法として以下の2つの方法を提供しています。

  • MessagePackを利用する方法
  • 独自にエンコーダ/デコーダを定義する方法

共通部分

SSS Mapreduceのキー、バリューとして利用するにはまず、Packableインターフェイスを実装する必要があります。 このインターフェイスを実装する際には以下の2つのメソッドの実装する必要があります。

  • long getRoughSize()
  • int slot()

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では独自のクラスが以下の条件を満たしていればエンコード可能になります。

  • @Messageアノテーションをクラスに付与する
  • コンストラクタを持つ

独自にエンコーダ/デコーダを定義する方法

別の方法として、独自にエンコード/デコードを定義することも可能です。

まず、Packableを継承したInterface SelfPackableを実装します。 SelfPackableを実装するには以下のメソッドを実装する必要があります。

  • Packable loadBytes(byte bytes) throws Exception;
  • byte toBytes() throws Exception;
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;
} 
Powered by Google Project Hosting