环境
Java1.8 、 Maven3.X、Spark3.X
问题代码
逆序获取三个数字
rdd = sc.parallelize(Stream.of(3, 2, 5, 0).collect(Collectors.toList()));
// takeOrOrdered
List<Integer> list = rdd.takeOrdered(3,(a,b)->-Integer.compareInt(a,b));
启动后报错Exception in thread "main" org.apache.spark.SparkException: Task not serializable异常
错误排查
首先细细想一下Spark在进行RDD操作的时候会涉及分布式,那么自然会设计网络IO,而网络IO会通过字节传输。
想到这里就应该想到Comparator没有实现Serializable接口导致序列化失败。
错误修正
直接进行自定义一个可以序列化的比较器。完整代码如下:
public class RddActionTest01 {
public static void main(String[] args) {
try (JavaSparkContext sc = ContextFactory.create("local")) {
JavaRDD<Integer> rdd = sc.parallelize(Stream.of(3, 2, 5, 0).collect(Collectors.toList()));
// takeOrOrdered
List<Integer> list = rdd.takeOrdered(3,new MyComparator());
System.out.println(list);
}
}
static class MyComparator implements Serializable,Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return -Integer.compare(o1,o2);
}
}
再次运行,问题解决