spark程序序列化出错? 400 报错
使用scala写spark程序时,定义了一个函数变量:
val coreCompute = (s: Int) => { //TODO 核心计算程序放在这里 (0.0, 0) }并且在RDD的操作中调用了该函数:
val tempB = z.map(s => { val efn = coreCompute(s) (s, efn) })
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
首先把错误的日志发上来。
出现错误的原因是,partitions之间进行shuffle,数据要进行序列化以及反序列化,所以gc容易占用很久时间。
建议
1.使用kryo
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
很省空间,效率比默认的java 序列化要好。
2.使用mappartitions而不是map,mappartitions是针对一个partitions进行处理。
为啥一定要返回数组呢?是不是可以先在map中生成<k,v>的形式,而在reduce中把结果给聚合成数组的形式?
######首先把错误的日志发上来。
出现错误的原因是,partitions之间进行shuffle,数据要进行序列化以及反序列化,所以gc容易占用很久时间。
建议
1.使用kryo
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
很省空间,效率比默认的java 序列化要好。
2.使用mappartitions而不是map,mappartitions是针对一个partitions进行处理。
为啥一定要返回数组呢?是不是可以先在map中生成<k,v>的形式,而在reduce中把结果给聚合成数组的形式?
非常感谢回答。当时之所以想要返回数组,是因为当时对于某一个键值有一个数组与之对应(程序是照着单机的“翻译”过来的,所以总是带着单机运行的一些残留思想)。现在想想,使用flatMap的<k,v>形式或许是更好的做法。
最后解决的方法是抛弃了那个数组,把需要返回的一些数据拼成了字符串传出完事。
至于不同的序列化方式我没有尝试过,需要的时候或许可以试一下。