使用spark JAVA API takeOrdered方法获取错误

时间:2014-08-21 17:55:17

标签: java action apache-spark

spark JavaRDDLike接口有api

 takeOrdered(int num, java.util.Comparator<T> comp)

 top(int num,java.util.Comparator<T> comp)

返回第一个k元素,但是当我使用带有collect方法的wordcount示例进行测试时,我收到了以下错误。

org.apache.spark.SparkException: Job aborted due to stage failure: Task not serializable: java.io.NotSerializableException

有人能帮助我吗? 非常感谢。

1 个答案:

答案 0 :(得分:3)

要使top()takeOrdered()正常工作,您必须确保自己的工作 自定义比较器类实现java.io.Serializable。方法如下: 这里我的RDD元素(T)是Tuple2<String, Integer>,我想要的 排序要在第二个元组元素上完成,这是一个整数:

import java.util.Comparator;
import java.io.Serializable;
....
static class MyTupleComparator implements 
   Comparator<Tuple2<String, Integer>>, Serializable {
   final static MyTupleComparator INSTANCE = new MyTupleComparator();
   // note that the comparison is performed on the key's frequency
   // assuming that the second field of Tuple2 is a count or frequency
   public int compare(Tuple2<String, Integer> t1, 
                      Tuple2<String, Integer> t2) {
       return -t1._2.compareTo(t2._2);    // sort descending
       // return t1._2.compareTo(t2._2);  // sort ascending
   }
}

然后传递MyTupleComparator.INSTANCE作为比较器。 我在YARN上运行Spark时注意到的另一件事是 你的Spark驱动程序应该实现java.io.Serializable 界面也是如此。

最好的问候,

Mahmoud Parsian