参考这个文章(使用Intellij IDEA开发并提交Spark应用到远程Spark集群)试了一下,把遇到问题记录一下。
这个问题的原因是因为Idea在执行程序时,使用了系统用户作为向Hadoop进行写的用户了。比如,你的电脑系统用户是:administrator,而你的Hadoop用户是:hadoop,用户不一样,所以写不进去。
解决办法:设置“HADOOP_USER_NAME=hadoop”为环境变量。 设置的办法有两个:
在Idea里进行设置,点上面的“Edit Configurations”,然后选择要执行的Application,在右边进行设置“Environment Variables”。在系统里进行设置,可以编辑“.bash_profile”文件,添加export HADOOP_USER_NAME=hadoop。设置完后,可以用System.getenv()方法进行测试,看是否能读取到。
这个问题的原因是:没有使用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"});