6

インターフェイスを実装するためWritableに、Hadoop でオブジェクトをシリアル化できます。Writableでは、Hadoopとの接続と違いは何java.io.serializationですか?

4

2 に答える 2

16

基本的なストレージの違い:

Java シリアライズ可能

Serializable は、保存された値のクラスが既知であると想定せず、インスタンスにそのクラスをタグ付けします。クラス名、フィールド名と型、およびそのスーパークラスを含む、オブジェクトに関するメタデータを書き込みます。ObjectOutputStream と ObjectInputStream は、これをある程度最適化し、最初のクラスのインスタンスの後に 5 バイトのハンドルがクラスのインスタンスに書き込まれるようにします。しかし、ハンドルを持つオブジェクト シーケンスは、ストリームの状態に依存しているため、ランダムにアクセスすることはできません。これにより、並べ替えなどの作業が複雑になります。

Hadoop 書き込み可能

「書き込み可能」を定義するときに、予想されるクラスを知っています。したがって、Writables は、逆シリアル化中にその型をシリアル化された表現に格納しません。何が期待されるかはわかっています。例えば。入力キーが LongWritable の場合、空の LongWritable インスタンスが入力データ ストリームからデータを取り込むように求められます。メタ情報 (クラス名、フィールド、それらのタイプ、スーパー クラス) を保存する必要がないため、バイナリ ファイルが大幅にコンパクトになり、ランダム アクセスが簡単になり、パフォーマンスが向上します。


いくつかの良い読み物:

Java シリアライズの場合:

Hadoop 書き込み可能

于 2013-05-30T15:02:24.230 に答える
4

ダグ・カッティングの言葉で:

Writable インターフェイスは、Serializable とは微妙に異なります。Serializable は、格納された値のクラスが既知であることを想定していません。したがって、各インスタンスはそのクラスでタグ付けされます。ObjectOutputStream と ObjectInputStream は、これをある程度最適化し、最初のクラスのインスタンスの後に 5 バイトのハンドルがクラスのインスタンスに書き込まれるようにします。しかし、ハンドルを持つオブジェクト シーケンスは、ストリームの状態に依存しているため、ランダムにアクセスすることはできません。これにより、並べ替えなどの作業が複雑になります。

一方、書き込み可能は、アプリケーションが予想されるクラスを知っていることを前提としています。readFields() を呼び出すには、アプリケーションでインスタンスを作成できる必要があります。そのため、クラスを各インスタンスに格納する必要はありません。これにより、バイナリ ファイルが大幅にコンパクトになり、ランダム アクセスが簡単になり、一般的にパフォーマンスが向上します。

おそらく、Hadoop は Serializable を使用できます。シリアライゼーションがパフォーマンス クリティカルなクラスごとに、writeObject または writeExternal をオーバーライドできます。(MapReduce は非常に I/O 集約的であるため、ほぼすべてのクラスのシリアライゼーションがパフォーマンス クリティカルです。) ObjectOutputStream.writeObjectOverride() および ObjectInputStream.readObjectOverride() を実装して、よりコンパクトな表現を使用できます。たとえば、それぞれにタグを付ける必要はありません。クラスを持つファイルのトップレベルのインスタンス。これにはおそらく、Haddop が Writable や ObjectWritable などで持っているのと同じくらい多くのコードが必要であり、別の型付けモデルを回避しようとするため、コードはもう少し複雑になります。ただし、組み込みのバージョン管理が優れているという利点がある場合があります。それとも?

Serializable のバージョン メカニズムは、クラスに serialVersionUID という名前の static を定義させることです。これにより、互換性のない変更から保護することができますが、下位互換性を実装することは容易ではありません。そのために、アプリケーションはバージョンを明示的に処理する必要があります。クラス固有の方法で、読み取り中に書かれたバージョンについて推論し、何をすべきかを決定する必要があります。しかし、Serializeable のバージョン メカニズムは、これを Writable よりも多かれ少なかれサポートしていません。

このスレッドを一度通過する必要があります。

于 2013-05-30T14:00:38.797 に答える