apache-spark - Apache Spark 2.2.1 中的 Google PubSub
问题描述
我正在尝试在 Spark 应用程序中使用 Google Cloud PubSub。为简单起见,我们只说这个应用程序是 Spark 的外壳。尝试实例化 aPublisher
会抛出 a NoClassDefFoundError
,这很可能是依赖版本冲突的结果。但是,通过这样的简单设置(只是 Spark 和 Google Cloud PubSub 依赖项),我无法弄清楚如何解决这个问题。
bash-4.4# spark-shell --packages com.google.cloud:google-cloud-pubsub:1.105.0
Ivy Default Cache set to: /root/.ivy2/cache
The jars for the packages stored in: /root/.ivy2/jars
:: loading settings :: url = jar:file:/opt/spark-2.2.1-bin-hadoop2.7/jars/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
com.google.cloud#google-cloud-pubsub added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0
confs: [default]
found com.google.cloud#google-cloud-pubsub;1.105.0 in central
found io.grpc#grpc-api;1.28.1 in central
...
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.2.1
/_/
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_212)
Type in expressions to have them evaluated.
Type :help for more information.
scala> com.google.cloud.pubsub.v1.Publisher.newBuilder("topic").build
java.lang.NoClassDefFoundError: com/google/api/gax/grpc/InstantiatingGrpcChannelProvider
at com.google.cloud.pubsub.v1.stub.PublisherStubSettings.defaultGrpcTransportProviderBuilder(PublisherStubSettings.java:225)
at com.google.cloud.pubsub.v1.TopicAdminSettings.defaultGrpcTransportProviderBuilder(TopicAdminSettings.java:169)
at com.google.cloud.pubsub.v1.Publisher$Builder.<init>(Publisher.java:674)
at com.google.cloud.pubsub.v1.Publisher$Builder.<init>(Publisher.java:625)
at com.google.cloud.pubsub.v1.Publisher.newBuilder(Publisher.java:621)
... 48 elided
Caused by: java.lang.ClassNotFoundException: com.google.api.gax.grpc.InstantiatingGrpcChannelProvider
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 53 more
有什么办法可以让它工作吗?我可以更改 pubsub 依赖版本,但不能更改 Spark 版本。
解决方案
这是由于 Google 的 Guava 依赖冲突,已知在使用 Spark + Google Libraries 时都会存在这种依赖冲突。解决方法(使用 Maven)是使用 maven-shade-plugin。
推荐阅读
- java - 如何修复过时的“getDownloadUrl ()”代码?
- javascript - 什么是不透明物体?
- flutter - Flutter:处理错误 Dio 包(404,400 等)
- node.js - Azure 应用服务 (Windows) 配置变量
- python - 解决简单数独时函数结果与没有函数调用的常规执行之间的差异
- mongodb - 匹配数组包含值的位置
- ios - 更新firebase数据库中的数据时tableview重复值
- javascript - 阻止访问服务器目录
- go - 将 go 接口对象转换/类型转换为具体类型
- javascript - 通过 Google Apps 脚本中的 API 组合 GET 和 POST 请求