Je viens de mettre à jour mon projet spark de la version 2.2.1 à la version 2.3.0 pour rechercher l’exception de gestion des versions ci-dessous. J'ai des dépendances sur spark-cassandra-connector.2.0.7 et cassandra-driver-core.3.4.0 à partir de datastax, qui à leur tour dépendent de netty 4.x alors que spark 2.3.0 utilise 3.9.x.
La classe soulevant l'exception, org.Apache.spark.network.util.NettyMemoryMetrics, a été introduite dans spark 2.3.0.
La dégradation de mes dépendances Cassandra est-elle le seul moyen de contourner l'exception? Merci!
Exception in thread "main" Java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.metric()Lio/netty/buffer/PooledByteBufAllocatorMetric;
at org.Apache.spark.network.util.NettyMemoryMetrics.registerMetrics(NettyMemoryMetrics.Java:80)
at org.Apache.spark.network.util.NettyMemoryMetrics.<init>(NettyMemoryMetrics.Java:76)
at org.Apache.spark.network.client.TransportClientFactory.<init>(TransportClientFactory.Java:109)
at org.Apache.spark.network.TransportContext.createClientFactory(TransportContext.Java:99)
at org.Apache.spark.rpc.netty.NettyRpcEnv.<init>(NettyRpcEnv.scala:71)
at org.Apache.spark.rpc.netty.NettyRpcEnvFactory.create(NettyRpcEnv.scala:461)
at org.Apache.spark.rpc.RpcEnv$.create(RpcEnv.scala:57)
at org.Apache.spark.SparkEnv$.create(SparkEnv.scala:249)
at org.Apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175)
at org.Apache.spark.SparkContext.createSparkEnv(SparkContext.scala:256)
at org.Apache.spark.SparkContext.<init>(SparkContext.scala:423)
Il semble que vous utilisiez une version "trop ancienne" de netty 4. Peut-être que vous avez plusieurs sur votre chemin de classe? Cela ne devrait pas poser de problème d'avoir Netty 4.x et 3.x sur le classpath.
J'aimerais ajouter quelques détails supplémentaires à la réponse pour faciliter le travail. Il suffit d'exécuter mvn dependency:tree -Dverbose -Dincludes=io.netty:netty-all
. Toutes les dépendances seront renvoyées à l'aide de io.netty
et de sa version. Dans mon cas, le coupable était Hive Jdbc 2.1.0, dont la version est plus basse que la version utilisée par spark 2.3.1. Par conséquent, le chemin de classe omet de charger le netty de l'étincelle, car il était déjà chargé depuis Hive-jdbc.
Le correctif consiste donc à exclure les dépendances de Hive-Jdbc dans pom.xml