2017-12-26 10 views
2

Wenn ich einen Datensatz jeden Datensatz von dem ein Fallklasse ist, und ich beharren, dass die Datenmenge, wie unten dargestellt, so dass die Serialisierung verwendet wird:Funke: Dataset-Serialisierung

myDS.persist(StorageLevel.MERORY_ONLY_SER) 

Does Funken Verwendung java/kyro Serialisierung den Datensatz serialisieren? oder wie Datarahmen, Spark hat seine eigene Art, die Daten im Datensatz zu speichern?

Antwort

2

Dataset[SomeCaseClass] unterscheidet sich nicht von Dataset[Row] oder einem anderen Dataset. Es verwendet die gleiche interne Repräsentation (die Instanzen der externen Klasse bei Bedarf zugeordnet wurde) und die gleiche Serialisierungsmethode.

Daher ist die direkte Objektserialisierung (Java, Kryo) nicht erforderlich.

+0

In den letzten Versionen von Spark haben wir hauptsächlich DataSet und Dataframe, wobei Dataframe nur ein Spezialfall von Dataset ist. Wenn also die Serialisierung keine Auswirkungen auf die Datasets hat, warum drängen Spark-Entwickler dann auf Kyro? Also, ich bin mir nicht sicher, was Sie oben sagen, ist richtig. Ich denke, wenn Dataframe-Datensätze Objekte sind, werden diese Objekte serialisiert. Daher verwendet das Dataset selbst möglicherweise keine Serialisierung, aber die Objekte werden serialisiert. –

-1

Unter der Haube ist ein Datensatz eine RDD. Von der documentation for RDD persistence:

RDD als serialisierte Java-Objekte (ein Byte-Array pro Partition) speichern. Dies ist in der Regel platzsparender als deserialisierte Objekte, insbesondere bei Verwendung eines schnellen Serialisierers, aber mehr CPU-lastig zum Lesen.

ist standardmäßig Java Serialisierung source verwendet:

standardmäßig Spark-Objekte Framework Java Object serialisiert ... Funken kann auch die Kryo-Bibliothek (Version 2) verwenden, um Objekte zu serialisieren schnellen .

Kryo zu aktivieren, initialisieren Sie den Job mit einem SparkConf und setzen spark.serializer-org.apache.spark.serializer.KryoSerializer:

val conf = new SparkConf() 
      .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 
val sc = new SparkContext(conf) 

Möglicherweise müssen Sie vor dem Erstellen des SparkContext Klassen mit Kryo registrieren:

conf.registerKryoClasses(Array(classOf[Class1], classOf[Class2])) 
0

Funken Dataset verwendet keine Standard-Serialisierer. Stattdessen verwendet es Encoders, die interne Struktur der Daten "verstehen" und effizient Objekte (alles, Encoder, einschließlich) in internen binären Speicher transformieren können.

Der einzige Fall, in dem Kryo oder Java-Serialisierung verwendet wird, ist, wenn Sie explicitly applyEncoders.kryo[_] oder Encoders.java[_]. In jedem anderen Fall wird Spark die Objektdarstellung destrukturieren und versuchen, Standard-Encoder (atomare Encoder, Prodcuct Encoder, etc.) anzuwenden. Der einzige Unterschied zu ist seine Encoder - RowEncoder (in gewisser Hinsicht Encoders sind Linsen ähnlich).

Databricks setzt explizit Encoder/Dataset Serialisierung im Gegensatz zu Java und Kryo Serializer in seiner Introducing Apache Spark Datasets (sehen vor allem für Blitzschnelle Serialisierung mit Encoder Abschnitt)

enter image description here

enter image description here

Quelle der Bilder