Kryo通过高效的序列化方法帮助提高Spark应用程序的性能
我想知道,如果Kryo会帮助SparkSQL,我应该如何使用它
在SparkSQL应用程序中,我们会执行很多基于列的操作,例如df.select($"c1", $"c2")
,而DataFrame Row的架构并不是静态的。
不确定如何为用例注册一个或多个序列化程序类。
例如:
case class Info(name: String, address: String)
...
val df = spark.sparkContext.textFile(args(0))
.map(_.split(','))
.filter(_.length >= 2)
.map {e => Info(e(0), e(1))}
.toDF
df.select($"name") ... // followed by subsequent analysis
df.select($"address") ... // followed by subsequent analysis
我认为为每个select
定义案例类并不是一个好主意
或者,如果我注册Info
registerKryoClasses(Array(classOf[Info]))
答案 0 :(得分:5)
根据Spark's documentation,SparkSQL不使用Kryo或Java序列化。
数据集与RDD类似,但是,它们使用专门的编码器来序列化对象以便通过网络进行处理或传输,而不是使用Java序列化或Kryo。虽然编码器和标准序列化都负责将对象转换为字节,但编码器是动态生成的代码,并使用一种格式,允许Spark执行许多操作,如过滤,排序和散列,而无需将字节反序列化回对象。
它们比Java或Kryo轻得多,这是预期的(序列化是一个更可优化的工作,比如一个3行长和2个整数),而不是类,它的版本描述,它的内在变量......)并且必须实现它。
缺点是,目前,为自定义非产品类创建编码器有些限制(请参阅有关用户定义类型的讨论),例如,从这里开始:Does Apache spark 2.2 supports user-defined type (UDT)?
答案 1 :(得分:0)
您可以通过在SparkConf上或在传递给 spark-submit 命令的自定义属性文件中将spark.serializer
属性设置为org.apache.spark.serializer.KryoSerializer
来将序列化程序设置为kryo通过 - properties-file 标志。
配置Kryo序列化程序时,Spark会在节点之间传输数据时透明地使用Kryo。因此,您的Spark SQL语句应该自动继承性能优势。