まあ、技術的にシリアライズしたり、直列化可能でないデータと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を提供し、Vector
is actually registered there:
kryo.addDefaultSerializer(classOf[Vector], new VectorKryoSerializer())
をして提供。また、あなたもうまく動作します上記のorg.apache.spark.serializer.KryoSerializer
distinct.count
例にspark.serializer
を設定するとKryoはとても大きく、より寛容することができますので、ご注意ください
specialized serializerFoo
はJavaシリアル化を使用してシリアライズできません。
Ahhh Kryoのシリアル化の登録!私が心配したのは、Spark 1.6がシャッフル操作のタプルフィールドの直列化可能性をorg.apache.spark.util.ClosureCleaner $ .ensureSerializableを介して明示的にチェックしているためです。java.io.NotSerializableException:org .apache.mahout.math.RandomAccessSparseVector。しかし、実際にKryoが常にSparkの設定によって存在しているので、それらが実際にシリアライズ可能な場合は、Serializableを安全にミックスして例外を取り除くことができます。 – Simplefish
私はより具体的に説明する必要があります - ここで使用される操作はaggregateByKeyです。これは集計のために値型の値をゼロにします。これは集約関数のクロージャの一部です。これは、すべてのクロージャ要素がjava直列化可能でなければならないため、SpryがKryo-Serializableであるにもかかわらずスローする理由です。解決方法は、Serializableで混合するよりもややこしいです。 – Simplefish
これが問題の場合は、さまざまな回避策があります。たとえば、 'combineByKey'を使用することができます。また、風ベクトルは直列化可能であり、外部デプスを必要としません。 – zero323