我正在尝试访问Spark中的HDFS文件。当我在本地模式下运行Spark时,一切正常,即
SparkSession.master("local")
并通过
访问HDFS文件hdfs://localhost:9000/$FILE_PATH
但是当我试图在独立集群模式下运行Spark时,即
SparkSession.master("spark://$SPARK_MASTER_HOST:7077")
错误抛出
java.lang.ClassCastException: cannot assign instance of java.lang.invoke.SerializedLambda to field org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction$1.fun$1 of type org.apache.spark.api.java.function.Function in instance of org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction$1
到目前为止我只有 start-dfs.sh 在Hadoop中并没有在Spark中配置任何东西。我是否需要使用YARN集群管理器运行Spark,以便Spark和Hadoop使用相同的集群管理器,因此可以访问HDFS文件?
我已尝试在tutorialspoint https://www.tutorialspoint.com/hadoop/hadoop_enviornment_setup.htm之后在Hadoop中配置yarn-site.xml,并在spark-env.sh中指定HADOOP_CONF_DIR,但它似乎不起作用且抛出相同的错误。我错过了一些其他配置吗?
谢谢!
修改
最初的Hadoop版本是2.8.0,Spark版本是2.1.1,带有Hadoop 2.7。试图下载hadoop-2.7.4,但同样的错误仍然存在。
问题here表明这是一个java语法问题,而不是spark hdfs问题。我将尝试这种方法,看看这是否解决了这里的错误。
答案 0 :(得分:0)
受到帖子here的启发,我自己解决了这个问题。
此map-reduce作业依赖于Serializable类,因此在Spark本地模式下运行时,可以找到此可序列化类,并且可以依赖于map-reduce作业执行。
在Spark独立群集模式下运行时,最好是通过spark-submit提交应用程序,而不是在IDE中运行。将所有东西都装在罐子里,然后点燃它 - 提交罐子,就像一个魅力!