我使用Java创建了一个Apache Spark应用程序.它只是计算包含"spark"字的行数1000次.
这是我的代码:
public class Example1 { public static void main(String[] args) { String logfile = args[0]; try{ SparkConf conf = new SparkConf(); conf.setAppName("Sample"); conf.setMaster("spark://:7077"); conf.set("spark.executor.memory", "1g"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD logData = sc.textFile(logfile).cache(); long count = 0; for(int i=0; i<=1000; i++){ count += logData.filter(new Function (){ public Boolean call(String s){ if (s.toLowerCase().contains("spark")) return true; else return false; } }).count(); } } catch(Exception ex){ System.out.println(ex.getMessage()); } } }
当我在Eclipse IDE中执行调试时,我遇到了java.lang.ClassNotFoundException
:
WARN scheduler.TaskSetManager: Loss was due to java.lang.ClassNotFoundException java.lang.ClassNotFoundException: org.spark.java.examples.Example1$1 at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:323) at java.lang.ClassLoader.loadClass(ClassLoader.java:268) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:270)
我也试图在集群内部使用spark-submit
,但仍遇到同样的异常.这是stacktrace的一部分:
ERROR Executor: Exception in task ID 4 java.lang.ClassNotFoundException: org.spark.java.examples.Example1$1 at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.forName0(Native Method)
关于如何解决这个问题的任何想法?提前致谢!
您需要将工作中的罐子交给工人.为此,让maven构建一个jar并将该jar添加到上下文中:
conf.setJars(new String[]{"path/to/jar/Sample.jar"}); [*]
对于"真正的"工作,您需要构建一个具有依赖关系的jar(检查Maven shade插件),但对于没有外部依赖关系的简单工作,一个简单的jar就足够了.
[*]我对Spark java API不太熟悉,只是假设它应该是这样的.