Spark 2.2.0连接MongoDB出现NoSuchMethodError问题求助
这个错误java.lang.NoSuchMethodError: org.apache.spark.sql.catalyst.analysis.TypeCoercion$.findTightestCommonTypeOfTwo()Lscala/Function2;本质是Spark版本兼容性问题——你使用的是HDP定制的Spark 2.2.0(版本号2.2.0.2.6.3.0-235),而Mongo Spark Connector是基于官方Apache Spark 2.2.0编译的,HDP对Spark的Catalyst模块做了定制修改,导致Connector调用的方法在你的Spark环境中不存在。
下面是具体的排查和解决步骤:
1. 针对HDP Spark版本重新编译Mongo Spark Connector
HDP的Spark在依赖版本、代码细节上和官方Spark有差异,直接用官方编译的Connector jar会出现方法不匹配的问题,你需要重新编译Connector适配HDP的Spark:
- 保持之前的操作:克隆mongo-spark仓库,切换到
2.2.0标签 - 修改项目根目录的
pom.xml,将Spark相关依赖的版本替换为你的HDP版本2.2.0.2.6.3.0-235,比如:<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.2.0.2.6.3.0-235</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.2.0.2.6.3.0-235</version> <scope>provided</scope> </dependency> - 执行编译命令:
mvn clean package -DskipTests,确保编译过程中没有依赖错误 - 将编译生成的
mongo-spark-connector-assembly-2.2.0.jar替换之前的jar包,上传到Spark服务器的所有节点(包括Worker节点)
2. 确认Mongo Java Driver版本与Connector的兼容性
Mongo Spark Connector 2.2.0需要搭配特定版本的Mongo Java Driver,建议使用3.6.0版本(这个版本和Connector 2.2.0是官方适配的)。你可以检查当前使用的mongo-java-driver.jar版本,如果不是3.6.x,替换为对应版本,避免驱动和Connector之间的兼容性问题。
3. 确保jar包在集群中全局可用
在Zeppelin或PySpark的客户端部署模式下,要保证Connector和Driver的jar包能被所有Executor节点加载:
- 最简单的方式是将这两个jar包放到Spark安装目录的
jars文件夹下,重启Spark集群 - 如果不想修改集群配置,可以在启动PySpark时通过
--jars参数指定本地jar包路径(注意如果是集群环境,需要确保所有节点都能访问到这些jar包,比如放到共享存储上)
4. 修正MongoDB连接URI的格式问题
你的代码中URI里的&是HTML实体转义,在Python字符串中不需要这样处理,应该直接写&,修改后的URI如下:
'mongodb://user:password@172.22.100.231:27017,172.22.100.234:27017/dmp?authMechanism=SCRAM-SHA-1&authSource=admin&replicaSet=rs0&connectTimeoutMS=300&readPreference=nearest'
按照以上步骤操作后,应该能解决这个方法找不到的错误,成功读取MongoDB数据。
内容的提问来源于stack exchange,提问作者ser0t0nin

