我在试着把星火的数据流传送到Cassandra。我正在用sbt构建一个fat jar,其中包括以下组件着色规则:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.google.common.**" -> "shaded.google.common.@1").inAll
)
之所以这样做,是因为spark的guava版本与某些cassandra库所需的版本不同。
但是,尝试在executor中流式处理sstables时,我看到以下错误:
java.lang.NoSuchMethodError: shaded.google.common.util.concurrent.Futures.addCallback(Lshaded/google/common/util/concurrent/ListenableFuture;Lshaded/google/common/util/concurrent/FutureCallback;)V
at org.apache.cassandra.streaming.StreamResultFuture.addEventListener(StreamResultFuture.java:143)
at org.apache.cassandra.streaming.StreamManager.register(StreamManager.java:126)
at org.apache.cassandra.streaming.StreamResultFuture.createAndRegister(StreamResultFuture.java:130)
at org.apache.cassandra.streaming.StreamResultFuture.init(StreamResultFuture.java:83)
at org.apache.cassandra.streaming.StreamPlan.execute(StreamPlan.java:190)
at org.apache.cassandra.io.sstable.SSTableLoader.stream(SSTableLoader.java:169)
at org.apache.cassandra.io.sstable.SSTableLoader.stream(SSTableLoader.java:154)
...
这让我很困惑,因为它显然找不到阴影类。但是我使用 --jars
选项。
你知道在这里试什么吗?
1条答案
按热度按时间kmbjn2e31#
问题是我的项目在可传递依赖中包含了几个不同版本的guava。sbt选择了与cassandra不兼容的最新版本。
我的解决方案是用cassandra+shaded guava构建一个单独的胖jar,并在运行时包含这个jar。