2016-07-29 3 views
0

MahoutののDrmRdd型はスパークRDDタプルフィールドは直列化可能である必要がありますか? MahoutのDRMは何

RDD[(K,Vector)] 

に変換

type DrmRdd[K] = RDD[DrmTuple[K]] 

として定義されていないと言っているようだが、Mahoutのドキュメントは明確Vectorクラスが直列化可能ではないと述べています。

これは、Vectorがシリアル化できないという事実を乗り越えることなくMahout DrmにラップするためのRDD [(K、Vector)]を生成する方法を頭を悩ませることです。

私の質問は、スパークRDDタプルはいつシリアライズ可能である必要がありますか?または、シャッフルを通過する必要がある特定の関数に対しては、シリアライズ可能である必要がありますか?

答えて

2

まあ、技術的にシリアライズしたり、直列化可能でないデータとRDDを持つことができ、同様のプロセスとはシャッフル、キャッシュはありません(シリアル化する理由はない場合たとえば、あなたは、このようなデータを持っている場合:。

Fooが直列化ではありません
class Foo(x: Int) 

val rdd = sc.parallelize(1 to 4, 4).map(i => (i, new Foo(i))) 

あなたが数えることができます。

rdd.count 
// 4 

しかし、あなたがすることができませんdistinct.countを:

rdd.distinct.count 
// java.io.NotSerializableException: $line30.$read$$iwC$$iwC$Foo 
// Serialization stack: 
// - object not serializable (class: $line30.$read$$iwC$$iwC$Foo, value: ... 
// - field (class: scala.Tuple2, name: _2, type: class java.lang.Object) 
// - object (class scala.Tuple2, (1,[email protected])) 
// at ... 

したがって、直列化不可能なオブジェクトは、単一のタスクに限られた一時的な記憶域に対してのみ有効です。

しかし、これはMahoutベクトルでは当てはまりません。 Mahoutスパークバインディング実際Kryo registration toolsを提供し、Vectoris actually registered there

kryo.addDefaultSerializer(classOf[Vector], new VectorKryoSerializer()) 

をして提供。また、あなたもうまく動作します上記のorg.apache.spark.serializer.KryoSerializerdistinct.count例にspark.serializerを設定するとKryoはとても大きく、より寛容することができますので、ご注意ください

specialized serializerFooはJavaシリアル化を使用してシリアライズできません。

+0

Ahhh Kryoのシリアル化の登録!私が心配したのは、Spark 1.6がシャッフル操作のタプルフィールドの直列化可能性をorg.apache.spark.util.ClosureCleaner $ .ensureSerializableを介して明示的にチェックしているためです。java.io.NotSerializableException:org .apache.mahout.math.RandomAccessSparseVector。しかし、実際にKryoが常にSparkの設定によって存在しているので、それらが実際にシリアライズ可能な場合は、Serializableを安全にミックスして例外を取り除くことができます。 – Simplefish

+0

私はより具体的に説明する必要があります - ここで使用される操作はaggregateByKeyです。これは集計のために値型の値をゼロにします。これは集約関数のクロージャの一部です。これは、すべてのクロージャ要素がjava直列化可能でなければならないため、SpryがKryo-Serializableであるにもかかわらずスローする理由です。解決方法は、Serializableで混合するよりもややこしいです。 – Simplefish

+1

これが問題の場合は、さまざまな回避策があります。たとえば、 'combineByKey'を使用することができます。また、風ベクトルは直列化可能であり、外部デプスを必要としません。 – zero323

関連する問題