开发者社区 问答 正文

spark程序序列化出错? 400 报错

spark程序序列化出错? 400 报错

使用scala写spark程序时,定义了一个函数变量:

val coreCompute = (s: Int) => {
			//TODO 核心计算程序放在这里
			(0.0, 0)  
		}
并且在RDD的操作中调用了该函数:

val tempB = z.map(s => {
				val efn = coreCompute(s)
				(s, efn)
		    })



问题是,coreCompute函数只是返回一个值的话能够正常运行;如果想要返回数组的话则会出现序列化的错误。请问这是什么原因?有什么办法让他返回数组或者类似的数据结构吗?

展开
收起
爱吃鱼的程序员 2020-06-04 11:54:20 504 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    首先把错误的日志发上来。

    出现错误的原因是,partitions之间进行shuffle,数据要进行序列化以及反序列化,所以gc容易占用很久时间。

    建议

    1.使用kryo

        conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

    很省空间,效率比默认的java 序列化要好。

    2.使用mappartitions而不是map,mappartitions是针对一个partitions进行处理。

    为啥一定要返回数组呢?是不是可以先在map中生成<k,v>的形式,而在reduce中把结果给聚合成数组的形式?

    ######

    引用来自“blue1110”的评论

    首先把错误的日志发上来。

    出现错误的原因是,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>形式或许是更好的做法。

    最后解决的方法是抛弃了那个数组,把需要返回的一些数据拼成了字符串传出完事。

    至于不同的序列化方式我没有尝试过,需要的时候或许可以试一下。

    2020-06-04 16:48:31
    赞同 展开评论