如何使用编码器比java和kryo序列化快得多?
答案 0 :(得分:1)
因为Encoders
会牺牲性能的一般性。这个想法并不新鲜。为什么Kryo比Java序列化更快?出于同样的原因。考虑一下这个记录:
scala> val spark = SparkSession.builder.config("spark.serializer", "org.apache.spark.serializer.JavaSerializer").getOrCreate()
spark: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@1ed28f57
scala> val map = Map[String, Int]("foo" -> 1).withDefaultValue(0)
map: scala.collection.immutable.Map[String,Int] = Map(foo -> 1)
scala> map("bar")
res1: Int = 0
scala> val mapSerDe = spark.sparkContext.parallelize(Seq(map)).first
mapSerDe: scala.collection.immutable.Map[String,Int] = Map(foo -> 1)
scala> mapSerDe("bar")
res2: Int = 0
与
相比scala> val spark = SparkSession.builder.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer").getOrCreate()
spark: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@5cef3456
scala> val map = Map[String, Int]("foo" -> 1).withDefaultValue(0)
map: scala.collection.immutable.Map[String,Int] = Map(foo -> 1)
scala> map("bar")
res7: Int = 0
scala> val mapSerDe = spark.sparkContext.parallelize(Seq(map)).first
mapSerDe: scala.collection.immutable.Map[String,Int] = Map(foo -> 1)
scala> mapSerDe("bar")
java.util.NoSuchElementException: key not found: bar
at scala.collection.MapLike$class.default(MapLike.scala:228)
at scala.collection.AbstractMap.default(Map.scala:59)
at scala.collection.MapLike$class.apply(MapLike.scala:141)
at scala.collection.AbstractMap.apply(Map.scala:59)
... 48 elided
(我无法找到确切的帖子,但此示例的想法来自开发人员列表)。
正如您所看到的,Kryo虽然速度更快,却无法处理所有可能的情况。它侧重于最常见的,并且正确。
Spark Encoders
做同样的事情,但更不普遍。如果您只支持16种类型,并且不关心互操作性(必须使用真正的序列化库),那么您有很多优化的机会。
无需互操作性即可让您更进一步。原子类型的编码器只是身份。根本不需要任何转换。
了解架构,正如himanshuIIITian所解释的那样是另一个因素。
为什么重要?因为具有良好定义的形状,允许您优化序列化和存储。如果您知道您的数据是结构化的,那么您可以切换维度 - 而不是拥有存储和访问费用昂贵的异构行,您可以使用柱状存储。
将数据存储在列中后,您将打开一组全新的优化机会:
这个想法也不新鲜。列式数据库,存储格式(如Parquet)或为分析设计的现代序列化格式(如Arrow)使用相同的想法,并且经常进一步推动这些(零拷贝数据共享)。
不幸的是,编码器不是银弹。存储非标准对象is a mess,集合编码器可以是very inefficient。
答案 1 :(得分:0)
简单 - 编码器知道记录的架构。这就是它们如何提供明显更快的序列化和反序列化(与默认的Java或Kryo序列化器相比)。
供参考 - https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-Encoder.html