Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行apache spark作业时出现任务不可序列化异常_Java_Apache Spark - Fatal编程技术网

Java 运行apache spark作业时出现任务不可序列化异常

Java 运行apache spark作业时出现任务不可序列化异常,java,apache-spark,Java,Apache Spark,下面的java程序是用ApacheSpark编写的 程序尝试从相应的文件中读取肯定和否定词列表,将其与主文件进行比较,并相应地过滤结果 import java.io.Serializable; import java.io.FileNotFoundException; import java.io.File; import java.util.*; import java.util.Iterator; import java.util.List; import java.util.List; i

下面的java程序是用ApacheSpark编写的

程序尝试从相应的文件中读取肯定和否定词列表,将其与主文件进行比较,并相应地过滤结果

import java.io.Serializable;
import java.io.FileNotFoundException;
import java.io.File;
import java.util.*;
import java.util.Iterator;
import java.util.List;
import java.util.List;
import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.Function;

public class SimpleApp implements Serializable{
  public static void main(String[] args) {
    String logFile = "/tmp/master.txt"; // Should be some file on your system
    String positive = "/tmp/positive.txt"; // Should be some file on your system
    String negative = "/tmp/negative.txt"; // Should be some file on your system

    JavaSparkContext sc = new JavaSparkContext("local[4]", "Twitter Analyzer", "/home/welcome/Downloads/spark-1.1.0/", new String[]{"target/scala-2.10/Simple-assembly-0.1.0.jar"});

    JavaRDD<String> positiveComments = sc.textFile(logFile).cache();

    List<String> positiveList = GetSentiments(positive);
    List<String> negativeList= GetSentiments(negative);

    final Iterator<String> iterator = positiveList.iterator();
    int i = 0;
    while (iterator.hasNext())
    {
      JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
      {
        public Boolean call(String s)
        {
          return s.contains(iterator.next());
        }
      });

     numAs.saveAsTextFile("/tmp/output/"+ i);
     i++;
     }

  }

public static List<String> GetSentiments(String fileName) {
  List<String> input = new ArrayList<String>();
try
{
  Scanner sc = new Scanner(new File(fileName));

  while (sc.hasNextLine()) {
      input.add(sc.nextLine());
  }
}
catch (FileNotFoundException e){
    // do stuff here..
}
  return input;
}

}

任何指针???

创建匿名类时,编译器会执行一些操作:

JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
      {
        public Boolean call(String s)
        {
          return s.contains(iterator.next());
        }
      });

一些Java事实

  • 在外部类中定义的任何匿名类都引用外部类
  • 如果匿名类需要序列化,它将迫使您将外部类序列化
  • 在lambda函数内部,如果使用封闭类的方法,则需要序列化该类(如果正在序列化lambda函数)
  • 关于Spark的一些事实。

  • 在同一执行器上,多个任务可以在同一JVM中同时运行,因为任务在spark中生成为线程
  • 与spark转换函数(map、mapPartitions、keyBy、redudeByKey…)一起使用的任何lambda匿名类都将在驱动程序上实例化、序列化并发送给执行器
  • 序列化对象意味着将其状态转换为字节流,以便字节流可以恢复为对象的副本
  • 如果Java对象的类或其任何超类实现了Java.io.serializable接口或其子接口Java.io.Externalizable,并且其所有非瞬态、非静态字段都是可序列化的,则Java对象是可序列化的
  • 避免序列化问题的经验法则:

  • 避免使用匿名类,而是使用静态类,因为匿名类将强制您序列化外部类
  • 避免使用静态变量作为解决序列化问题的方法,因为多个任务可以在同一JVM内运行,并且静态实例可能不是线程安全的
  • 使用瞬态变量以避免序列化问题,您必须在函数调用中初始化它们,而不是在构造函数中初始化它们。与在驱动程序上一样,构造函数将被调用,在执行器上它将反序列化并为对象执行。初始化的唯一方法是在函数调用内部
  • 使用静态类代替匿名类
  • 只对只需要序列化的类严格遵循“attaching implements Serializable”
  • 在“lambda函数”内部,永远不要直接引用outclass方法,因为这将导致外部类的序列化
  • 如果需要在Lambda函数中直接使用,请将方法设为静态,否则请使用Class::func()概念,但不要直接使用func()
  • JavaMap没有实现可序列化,但HashMap实现了
  • 在决定使用Braodcast还是原始数据结构时要明智。如果你看到一个真正的好处,那么只使用广播
  • 要深入了解,请跟随

    迭代器不可序列化有什么原因吗?
    JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
          {
            public Boolean call(String s)
            {
              return s.contains(iterator.next());
            }
          });
    
    JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
          {
            private Iterator<...> $iterator;
            public Boolean call(String s)
            {
              return s.contains($iterator.next());
            }
          });
    
    String value = iterator.next();
    JavaRDD<String> numAs = positiveComments.filter(new Function<String, Boolean>()
          {
            public Boolean call(String s)
            {
              return s.contains(value);
            }
          });