Gearpump カスタマイズ シリアライザ
Gearpumpはshaded Kryoバージョンを使った組み込みのシリアライズフレームワークを持ちます。 これは特定のメッセージタイプをシリアライズする方法をカスタマイズすることができます。
シリアライズの前にクラスを登録する
組み込みのkryoシリアライザフレームワークを使うために、あなたが独自のシリアライザを使うかどうかに関係なく、Gearpumpは使用するために全てのクラスを明示的に登録する必要があります独自のシリアライザを使わない場合は、Gearpumpはクラスをシリアライズするためにデフォルトの com.esotericsoftware.kryo.serializers.FieldSerializer を使うでしょう。
クラスを登録するには、設定ファイルgear.conf(あるいは一つのアプリケーションに対してのみ効果があるようにしたい場合はapplication.conf)を変更する必要があります。
gearpump {
serializers {
## We will use default FieldSerializer to serialize this class type
"io.gearpump.UserMessage" = ""
## we will use custom serializer to serialize this class type
"io.gearpump.UserMessage2" = "io.gearpump.UserMessageSerializer"
}
}
組み込みのkryoシリアライザフレームワークのための独自のシリアライザを定義する方法
独自のシリアライザを定義したいと決めた場合、二つの方法でこれを行うことができます。
Please note that Gearpump shaded the original Kryo dependency. パッケージ名com.esotericsoftware
はio.gearpump.esotericsoftware
に置き換えられました。以下のカスタマイズの中で、対応するshadedクラスをインポートする必要があります。コードの例はその部分を示すでしょう。
一般的にバイナリの非互換性を避けるために可能な限りライブラリのshadedバージョンを使うべきです。例えば、以下を使いません:
import com.google.common.io.Files
むしろ以下を使います:
import io.gearpump.google.common.io.Files
システムレベルのシリアライザ
シリアライザが広く使われる場合、システム内の全てのアプリケーション(あるいはワーカーまたはマスター)で利用可能なグローバルシリアライザを定義することができます。
ステップ1: まず、独自のシリアライザクラスを含むjavaライブラリを開発する必要があります。以下は例です:
package io.gearpump
import io.gearpump.esotericsoftware.kryo.{Kryo, Serializer}
import io.gearpump.esotericsoftware.kryo.io.{Input, Output}
class UserMessage(longField: Long, intField: Int)
class UserMessageSerializer extends Serializer[UserMessage] {
override def write(kryo: Kryo, output: Output, obj: UserMessage) = {
output.writeLong(obj.longField)
output.writeInt(obj.intField)
}
override def read(kryo: Kryo, input: Input, typ: Class[UserMessage]): UserMessage = {
val longField = input.readLong()
val intField = input.readInt()
new UserMessage(longField, intField)
}
}
ステップ2: ライブラリを分配する
jaraファイルをクラスタ内の各Gearpumpインストレーションのlib/フォルダへ分配します。
ステップ3: クラスタの各マシーンのgear.confを変更する:
gearpump {
serializers {
"io.gearpump.UserMessage" = "io.gearpump.UserMessageSerializer"
}
}
準備が整いました!
アプリケーションレベルの独自のシリアライザを定義する
アプリケーションレベルのシリアライザを定義することがしたいことであれば、それは現在のアプリケーションのAppMasterとExecutor(タスクを含む)からのみ見えます。異なるやり方に従うことができます。
ステップ1: 独自のシリアライザ クラスを定義する
アプリケーションjarの中にシリアライザクラスを含めなければなりません。以下は独自のシリアライザを定義する例です:
package io.gearpump
import io.gearpump.esotericsoftware.kryo.{Kryo, Serializer}
import io.gearpump.esotericsoftware.kryo.io.{Input, Output}
class UserMessage(longField: Long, intField: Int)
class UserMessageSerializer extends Serializer[UserMessage] {
override def write(kryo: Kryo, output: Output, obj: UserMessage) = {
output.writeLong(obj.longField)
output.writeInt(obj.intField)
}
override def read(kryo: Kryo, input: Input, typ: Class[UserMessage]): UserMessage = {
val longField = input.readLong()
val intField = input.readInt()
new UserMessage(longField, intField)
}
}
ステップ2: アプリケーションをサブミットするクライアントマシーン上のクラスパスにapplication.confを配置する
### content of application.conf
gearpump {
serializers {
"io.gearpump.UserMessage" = "io.gearpump.UserMessageSerializer"
}
}
ステップ3: 準備が整いました!
上級: 他のシリアライズフレームワークを選択する
注意: これはGearpumpプラットフォームの深いカスタマイズを必要とする上級者のためだけのものです。
Kryoの他にProtobufのような他のシリアライズフレームワークがあります。ユーザが組み込みのKryoシリアライズフレームワークを使いたくない場合は、新しいシリアライズフレームワークをカスタマイズすることができます。
基本的に、ユーザは以下のようにgear.conf(あるいは1つのアプリケーションのスコープに関してはapplication.conf)内で定義する必要があります:
gearpump.serialization-framework = "io.gearpump.serializer.CustomSerializationFramework"
gearpumpのstormモジュールの中で例を見つけてください。ソースコード内で"StormSerializationFramework"を検索します。