我有一个类从HDFS中的文件读取并尝试从中创建图形。我在类初始化中对文件进行了一些转换,除非我使类可序列化。
class GraphLoader(path:String, sc:SparkContext)
extends java.io.Serializable {
val records = sc.textFile(path).map(x => x.split(",")).filter(x => x(0) == "1" || x(0) == "2")
records.cache()
val people:RDD[(Long,PersonProperty)] = records.
flatMap(line => List(line(1).safeToLong, line(4).safeToLong)).
map(number => (number, PersonProperty("default")))
...
.safeToLong基本上是我在隐式类中定义的方法,我用它将字符串转换为Longs并处理我遇到的任何异常。
如果没有Serializable扩展程序它将无法运行,我会感到烦恼,因为我觉得这是一个非常重要的事情。是否有更好/更优雅的方式来做到这一点?
答案 0 :(得分:1)
Spark是分布式(集群)计算的引擎,它本身需要不同节点(JVM)之间的通信。这种通信反过来需要序列化,因为每次类或对象离开它的JVM时,它都必须被序列化。
最重要的是,您编写的大多数Spark代码都需要可序列化。任何代码都不能利用Spark的分布式特性。您应该tune序列化来优化您的Spark应用程序。