当前位置: 首页 > 知识库问答 >
问题:

无法在Spark上序列化任务

谷梁驰
2023-03-14

我有一个这样的转变:

JavaRDD<Tuple2<String, Long>> mappedRdd = myRDD.values().map(
    new Function<Pageview, Tuple2<String, Long>>() {
      @Override
      public Tuple2<String, Long> call(Pageview pageview) throws Exception {
        String key = pageview.getUrl().toString();
        Long value = getDay(pageview.getTimestamp());
        return new Tuple2<>(key, value);
      }
    });

Pageview是一种:Pageview。JAVA

我在Spark上注册了这样的课程:

Class[] c = new Class[1];
c[0] = Pageview.class;
sparkConf.registerKryoClasses(c);

异常线程"main"org.apache.spark.SparkExctive:任务不能在org.apache.spark.util.ClosureCleaner$. ensureSerializable(ClosureCleaner.scala:166)在org.apache.spark.util.ClosureCleaner$.清洁(ClosureCleaner.scala:158)在org.apache.spark.SparkContext.clean(SparkContext.scala:1623)在org.apache.spark.rdd.RDD. map(RDD. scala: 286)在org.apache.spark.api.java.JavaRDD类似于$class.map(JavaRDDLike.scala:89)在org.apache.spark.api.java.AbstractJavaRDDLike.map(JavaRDDLike.scala:46)在org.apache.gora.tutorial.log.ExpleSpark.run(ExpleSpark.java:100)在org. apache. gora. tuorial. log。由java. io. NotSerializableExctive: org. apache. gora.教程. log.造成的。示例Spark序列化堆栈:-对象不可序列化(类: org. apache. gora.教程. log。示例Spark,值:org.apache.gora.tutorial.log.ExampleSpark@1a2b4497)-字段(类: org. apache. gora.教程. log.)-字段(类: org. apache. gora.教程. log。示例Spark1美元,名称: this0美元,类型:类org. apache. gora.教程. log。示例Spark)-对象(类org. apache. gora.教程. log。示例Spark$1@4ab2775d)-字段(类: org. apache. spark. api. java. JavaPairRDD$$anonfun$toScala功能1美元,名称: fun1美元,类型:接口org. apache. spark. appark

当我调试代码时,我看到JavaSerializer。scala调用,即使有一个名为KryoSerializer的类。

PS 1:我不想使用Java序列化器,但是在Pageview上实现序列化器并不能解决问题。

PS 2:这并没有丢掉问题:

...
//String key = pageview.getUrl().toString();
//Long value = getDay(pageview.getTimestamp());
String key = "Dummy";
Long value = 1L;
return new Tuple2<>(key, value);
...

共有1个答案

呼延哲
2023-03-14

我在Java代码中多次遇到这个问题。虽然我使用的是Java序列化,但我会使包含该代码的类可序列化,或者如果您不想这样做,我会使该函数成为该类的静态成员。

下面是一个解决方案的代码片段。

public class Test {
   private static Function s = new Function<Pageview, Tuple2<String, Long>>() {

     @Override
     public Tuple2<String, Long> call(Pageview pageview) throws Exception {
       String key = pageview.getUrl().toString();
       Long value = getDay(pageview.getTimestamp());
       return new Tuple2<>(key, value);
      }
  };
}
 类似资料:
  • 问题内容: 我们在Spark上使用Redis来缓存键值对,这是代码: 但是编译器给了我这样的反馈: 有人可以告诉我如何序列化从Redis获得的数据。非常感谢。 问题答案: 在Spark中,s(如此处)上的函数被序列化并发送给执行程序进行处理。这意味着这些操作中包含的所有元素都应该可序列化。 Redis连接不可序列化,因为它打开了到目标DB的TCP连接,该TCP连接已绑定到创建它的机器。 解决方案是

  • 我对Spark,Scala和Cassandra都是新手。使用Spark,我试图从MySQL获取一些ID。 我可以看到在控制台打印的ID。 当我试图在每个提取id上运行相同的函数时 它给出与例外相同的例外 在阅读spark-shell中的Apache spark:“sparkException:Task not serializable”后,我尝试将@transient添加到RDDs中

  • null 每当我尝试访问sc时,我会得到以下错误。我在这里做错了什么?

  • 问题内容: 编写以下Java程序来试验apache spark。 该程序尝试从相应的文件中读取正负列表,将其与主文件进行比较并相应地过滤结果。 执行spark作业时引发以下错误, 任何指针? 问题答案: 创建匿名类时,编译器会做一些事情: 它将被重写为: 这就是为什么您可以使用的原因,因为迭代器不可序列化。 为了避免这种情况,只需在提取出next的结果之前:

  • 问题在于Spark数据集和INT列表的序列化。Scala版本是2.10.4,Spark版本是1.6。 这和其他问题类似,但是我不能基于这些回答让它工作。我已经简化了代码,以便仅仅显示问题。 我有一门案例课: 我的主要方法是: 我得到以下错误: 如果我从FlightExt中删除列表,那么一切正常,这表明lambda函数序列化没有问题。 Scala本身似乎序列化了一系列Int的优点。也许Spark在序