使用Idea提交Spark程序

来源:互联网 发布:淘宝优质网店怎么搜 编辑:程序博客网 时间:2024/05/23 01:26

前言

参考这个文章(使用Intellij IDEA开发并提交Spark应用到远程Spark集群)试了一下,把遇到问题记录一下。


正文

1,错误:Permission denied: user=root, access=WRITE, inode=”/user”:hdfs:supergroup:dr

这个问题的原因是因为Idea在执行程序时,使用了系统用户作为向Hadoop进行写的用户了。比如,你的电脑系统用户是:administrator,而你的Hadoop用户是:hadoop,用户不一样,所以写不进去。

解决办法:设置“HADOOP_USER_NAME=hadoop”为环境变量。
设置的办法有两个:

  • 在Idea里进行设置,点上面的“Edit Configurations”,然后选择要执行的Application,在右边进行设置“Environment Variables”。
  • 在系统里进行设置,可以编辑“.bash_profile”文件,添加export HADOOP_USER_NAME=hadoop

设置完后,可以用System.getenv()方法进行测试,看是否能读取到。


2,错误:java.lang.ClassCastException: cannot assign instance of java.lang.invoke.SerializedLambda to field

这个问题的原因是:没有使用setJars方法,进行设置Jar文件。
在参考的文章中,进行了使用了setJars方法。但自己测试时没有使用,因为不知道这行语句的作用。
在网上查了一下,发生这个错误最根本的原因是因为Lambda表达式解析的问题,自己的测试程序中,使用了Lambda表达式,如果各个Worker中没有解析Lambda表达式的方法的话,就会产生这样的错误。setJars方法的目的就是把生成Lambda表达式的程序,给各个Worker,让他们知道如何解析。感兴趣的可以看一下:java.lang.ClassCastException using lambda expressions in spark job on remote server

如何使用setJars方法呢?把你要提交的类,生成一个Jar,把这个Jar的路径设置到setJars方法里就可以了。例如:

SparkConf conf = new SparkConf().setAppName("wordCount_111")                .setMaster("spark://your-master-ip:7077")                .setJars(new String[]{"/Users/myaccount/IdeaProjects/spark/spark-wordcount/out/artifacts/spark_word_count/spark_word_count.jar"});
0 0