You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动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]

已执行的检查

  1. 确认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
  1. 确认环境变量配置无误:
$ 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包:

  1. 定位Hadoop安装目录下的javax.servlet-api Jar包(路径一般为$HADOOP_HOME/share/hadoop/common/lib/javax.servlet-api-3.1.0.jar,版本可能略有差异)。
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:52:47