前言
参考这个文章(使用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"});