启动Spark Thrift Server报错:AmIpFilter非javax.servlet.Filter
Spark Thrift Server启动报错:AmIpFilter无法转换为javax.servlet.Filter
问题场景
使用Java 1.8、Spark 3.5.0-bin-hadoop3、Hadoop 3.3.6启动Spark Thrift Server时,spark-submit提示作业提交成功并在数秒内完成,但抛出SparkContext初始化错误:
ERROR SparkContext: Error initializing SparkContext. MultiException[java.lang.IllegalStateException: class org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter is not a javax.servlet.Filter, java.lang.IllegalStateException: class org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter is not a javax.servlet.Filter] Suppressed: java.lang.IllegalStateException: class org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter is not a javax.servlet.Filter [CIRCULAR REFERENCE:java.lang.IllegalStateException: class org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter is not a javax.servlet.Filter]
已执行的检查
- 确认Spark和Hadoop的Jar包中均包含
AmIpFilter.class:
# 检查Spark内置Jar包 $ jar -tf $SPARK_HOME/jars/hadoop-yarn-server-web-proxy-3.3.6.jar | grep AmIpFilter Picked up _JAVA_OPTIONS: -Djava.io.tmpdir=/opt/disk1/tmp org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.class # 检查Hadoop官方Jar包 $ jar -tf $HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-server-web-proxy-3.3.6.jar | grep AmIpFilter Picked up _JAVA_OPTIONS: -Djava.io.tmpdir=/opt/disk1/tmp org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.class
- 确认环境变量配置无误:
$ echo $HADOOP_CONF_DIR && echo $SPARK_HOME && echo $HADOOP_HOME .../hadoop-3.3.6/etc/hadoop .../spark-3.5.0-bin-hadoop3 .../hadoop-3.3.6
问题原因
Spark 3.0+版本开始切换使用Jakarta EE的Servlet API(包名从javax.servlet改为jakarta.servlet),而Hadoop 3.x系列仍依赖传统的javax.servlet.Filter接口。当Spark加载Hadoop的AmIpFilter类时,由于classpath优先加载了Spark的Jakarta Servlet API,找不到javax.servlet.Filter的定义,导致类转换失败。
解决方案
在启动Spark Thrift Server时,配置让Spark优先加载Hadoop的javax.servlet-api包:
- 定位Hadoop安装目录下的javax.servlet-api Jar包(路径一般为
$HADOOP_HOME/share/hadoop/common/lib/javax.servlet-api-3.1.0.jar,版本可能略有差异)。 - 修改spark-submit启动命令,添加以下配置参数:
spark-submit \ --conf spark.driver.extraClassPath=$HADOOP_HOME/share/hadoop/common/lib/javax.servlet-api-3.1.0.jar \ --conf spark.executor.extraClassPath=$HADOOP_HOME/share/hadoop/common/lib/javax.servlet-api-3.1.0.jar \ --class org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 \ $SPARK_HOME/lib/spark-hive-thriftserver_2.12-3.5.0.jar
或者将上述配置添加到$SPARK_HOME/conf/spark-defaults.conf中,避免每次启动重复输入:
spark.driver.extraClassPath=$HADOOP_HOME/share/hadoop/common/lib/javax.servlet-api-3.1.0.jar spark.executor.extraClassPath=$HADOOP_HOME/share/hadoop/common/lib/javax.servlet-api-3.1.0.jar
内容的提问来源于stack exchange,提问作者bsethi24
相关产品推荐
相关产品推荐

