Spark 2.3抛出Netty相关java.lang.NoSuchMethodError异常求助
java.lang.NoSuchMethodError with Netty in Spark 2.3 Hey there, let's tackle this issue you're facing—this is almost certainly a Netty version conflict that's tripping up your Spark 2.3 application. Here's a breakdown of what's happening and how to fix it:
Why this error happens
The NoSuchMethodError for io.netty.buffer.PooledByteBufAllocator.metric() means your app is loading an older version of Netty that doesn't include this method. Spark 2.3 relies on a specific Netty version (typically Netty 4.1.13.Final) that introduced this metric functionality, but another dependency in your project (like HBase or Phoenix, which often bundle older Netty builds) is overriding Spark's required version.
Step-by-step solutions
First, spot conflicting Netty versions
Run these commands to check your dependency tree and identify which libraries are pulling in outdated Netty:# For Maven projects mvn dependency:tree | grep netty # For Gradle projects gradle dependencies | grep nettyLook for entries with versions lower than 4.1.x—those are the sources of the conflict.
Exclude conflicting Netty dependencies
Once you find the problematic library (e.g., HBase client), exclude all Netty-related artifacts from it in your build file to let Spark's bundled Netty take precedence.
Example for Mavenpom.xml:<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>your-hbase-version</version> <exclusions> <exclusion> <groupId>io.netty</groupId> <artifactId>*</artifactId> <!-- Exclude all Netty submodules --> </exclusion> </exclusions> </dependency>Example for Gradle
build.gradle:dependencies { implementation('org.apache.hbase:hbase-client:your-hbase-version') { exclude group: 'io.netty' } }Force the correct Netty version
If excluding doesn't fully resolve the conflict, explicitly enforce the Netty version compatible with Spark 2.3 in your dependency management section:
Maven:<dependencyManagement> <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.13.Final</version> <!-- Match Spark 2.3's Netty version --> </dependency> </dependencies> </dependencyManagement>Gradle:
configurations.all { resolutionStrategy.force 'io.netty:netty-all:4.1.13.Final' }Tweak YARN cluster settings (if running on YARN)
If the conflict comes from the YARN cluster's shared classpath, add these configurations to yourspark-submitcommand orspark-defaults.conf:spark-submit \ --conf spark.yarn.user.classpath.first=true \ --conf spark.driver.extraClassPath=$SPARK_HOME/jars/netty-*.jar \ --conf spark.executor.extraClassPath=$SPARK_HOME/jars/netty-*.jar \ your-application.jarThis ensures Spark's own Netty jars load before any cluster-wide ones.
Important note
Just adding Netty jars won't fix the issue—you need to ensure the correct version is the one the JVM loads. The key is eliminating older, conflicting Netty versions first.
内容的提问来源于stack exchange,提问作者Alchemist

