我正在尝试为我们的分析师设置一个Spark客户端分发,他们可以从他们的桌面上使用。
为了实现这一点,我在我现有的Hadoop客户端发行版中添加了一个“使用用户提供的Apache Hadoop预构建”的Spark版本。
我尝试启动最基本的spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster Spark/examples/jars/spark-examples_2.12-3.1.1.jar
,但java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
失败
我已经检查了常见的嫌疑犯:
- JAVA_HOME、HADOOP_HOME、SPARK_HOME、HADOOP_CONF_DIR、SPARK_CONF_DIR和路径均已正确设置
- SPARK_DIST_CLASSPATH包含
hadoop classpath
的内容
我在Hadoop集群上检查了launch_container.sh
,发现CLASSPATH变量如下所示:$PWD:$PWD/__spark_conf__:$PWD/__spark_libs__/*:/etc/hadoop/conf/*:/usr/lib/hadoop/*:/usr/lib/hadoop/lib/*:/usr/lib/hadoop-hdfs/*:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-yarn/*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-mapreduce/*:/usr/lib/hadoop-mapreduce/lib/*:/etc/hadoop/conf/*:/usr/lib/hadoop/*:/usr/lib/hadoop/lib/*:/usr/lib/hadoop-hdfs/*:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-yarn/*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-mapreduce/*:/usr/lib/hadoop-mapreduce/lib/*:
,后跟独立计算机中SPARK_DIST_CLASSPATH变量的完整内容(C:\HadoopClient\Hadoop\share...
或/home/user/Hadoop/share...
)。org/apache/hadoop/fs/FSDataInputStream
来自hadoop-common-3.1.2.jar
,它应该在CLASSPATH上,因为它位于集群节点上的/usr/lib/hadoop
中。
1.如果hadoop-common-3.1.2.jar
在类路径上,为什么Yarn找不到它?
1.我的SPARK_DIST_CLASSPATH在Yarn作业的类路径中做了什么?它是无害的浪费,还是我做错了什么?
当我使用不同的Spark发行版(为Apache Hadoop 3.1.2(我们的Hadoop版本)预构建的发行版)时,作业崩溃得更快,
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
CLASSPATH变量如下所示:$PWD:$PWD/__spark_conf__:$PWD/__spark_libs__/*:
,后跟独立计算机中SPARK_DIST_CLASSPATH变量的全部内容。
在这种情况下,我同意类路径上没有hadoop-common-3.1.2.jar
,独立机器上的%SPARK_HOME%\jars
目录肯定包含hadoop-common-3.1.2.jar
,但它不在集群上的$PWD/__spark_libs__/
中。
1.为什么spark-submit不将jar发送到Hadoop集群?
1条答案
按热度按时间vsaztqbk1#
原来问题出在SPARK_CONF_DIR中的spark-defaults.conf中。我从群集节点复制了整个
conf
目录以访问Hive,但spark-defaults.conf被调整为从群集节点运行并覆盖了spark.yarn.archives
。我从配置中删除了该文件,并能够成功地将作业提交到Yarn群集。