java - 提交 Flink 作业时出现 java.lang.NoClassDefFoundError
问题描述
我正在尝试通过在命令行中运行来提交使用 Scala 2.11 创建的 Flink 作业,该作业使用本地 Flink 集群中的 Twitter 流 API:
flink run -c org.myClass C:\path\to\jarFile.jar
并得到以下错误:
2019-06-09 23:40:47,758 WARN org.apache.flink.runtime.webmonitor.handlers.JarRunHandler - Configuring the job submission via query parameters is deprecated. Please migrate to submitting a JSON request instead.
2019-06-09 23:40:47,762 ERROR org.apache.flink.runtime.webmonitor.handlers.JarRunHandler - Unhandled exception.
org.apache.flink.client.program.ProgramInvocationException: The program caused an error:
at org.apache.flink.client.program.OptimizerPlanEnvironment.getOptimizedPlan(OptimizerPlanEnvironment.java:93)
at org.apache.flink.client.program.PackagedProgramUtils.createJobGraph(PackagedProgramUtils.java:80)
at org.apache.flink.runtime.webmonitor.handlers.utils.JarHandlerUtils$JarHandlerContext.toJobGraph(JarHandlerUtils.java:126)
at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$getJobGraphAsync$6(JarRunHandler.java:142)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: org/apache/flink/streaming/connectors/twitter/TwitterSource$EndpointInitializer
at msciss.TwitterHashtagCounter.main(TwitterHashtagCounter.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:529)
at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:421)
at org.apache.flink.client.program.OptimizerPlanEnvironment.getOptimizedPlan(OptimizerPlanEnvironment.java:83)
... 7 more
Caused by: java.lang.ClassNotFoundException: org.apache.flink.streaming.connectors.twitter.TwitterSource$EndpointInitializer
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 15 more
但是在程序中,我在下面的 build.sbt 中设置了 TwitterSource 库:
val flinkDependencies = Seq(
"org.apache.flink" %% "flink-scala" % flinkVersion % "provided",
"org.apache.flink" %% "flink-streaming-scala" % flinkVersion % "provided",
"org.apache.flink" %% "flink-connector-twitter" % flinkVersion,
"commons-logging" % "commons-logging" % "1.2",
"org.apache.logging.log4j" % "log4j-core" % "2.11.2",
"org.apache.commons" % "commons-text" % "1.6")
该应用程序在 IntelliJ 中也可以正常运行,并且 sbt buld / package 不会产生任何问题。我该如何解决这个问题?
解决方案
您需要使用sbt assembly
插件或任何其他允许创建 Fat Jar (Uber Jar) 的插件。目前,您的包不包含外部库,并且 flink 连接器被视为外部库,因为它们不包含在标准二进制构建中。因此,您实际上正在创建您正在创建的包不包含twitter-connector
,但 Flink 本身也不包含,这就是您获得ClassNotFoundException
.
推荐阅读
- python - 什么是使用 Python 的准确 Twitter 情绪分析解决方案?
- c - 如何使用 main 中的函数打开文件 (a_file.text)?
- python-3.x - Python中单行嵌套循环中的迭代顺序
- python-3.x - Azure Databricks - 写入 Az SQL 表
- pdf - PDF JS:PDF 未在 IE 浏览器中加载
- r - 如何在 r 中使用 for 循环标记大量数据点?
- swift - UILabel 不做两行
- java - 从 docx 转换后尝试在 html 中添加一些内容时,文本重叠
- json - 将 Map 键值对转换为 @responseBody 对象的 JSON 属性
- forms - 哪个输入属性适用于属性?