本次错误发生背景为做基于 Storm 的股票数据流处理实验,此前已经完成 Zookeeper 集群(3 节点)、Kafka 集群(3 节点)、Storm 集群(3 个 Nimbus 节点、3 个 Supervisor 节点、1 个 UI 节点)的搭建与部署。同时在 IDEA 中编写了核心类:WriteTopology(用于将 CSV 股票数据写入 Kafka,DataSourceSpout2读取 CSV等,完成代码打包后在提交拓扑时,遇到了报错,为了解决这个问题花费了好久时间,所以打算记录一下:

        类文件具有错误的版本 61.0, 应为 52.0。

        这个错误的核心原因是 Storm 版本与本地 JDK 版本不兼容:我本地使用的是 JDK 1.8(对应类文件版本 52.0),但使用的 Storm 2.8.2是用 Java 17 编译的(对应类文件版本 61.0),低版本 JDK 无法解析高版本编译的类文件。

        

        为了解决这个问题,需要将Storm 版本降级到 支持 Java 8 的Storm 2.4.0版本,将 pom.xml 中所有 Storm 相关依赖的版本从 2.8.2 改为 2.4:此时我们尝试去提交拓扑,又提示找不到主类:

Error: Could not find or load main class org.example.kafka_storm2.WriteTopology Caused by: java.lang.ClassNotFoundException: org.example.kafka_storm2.WriteTopology

        这个错误的核心原因是 Storm 容器内的版本与拓扑依赖的 Storm 版本不兼容,因为我们在使用storm-compose.yml拉取镜像的时候,默认拉取的是2.8.0的版本,我们需要修改 storm-compose.yml,将所有 Storm 服务的镜像版本指定为 storm:2.4.0:

        然后进入容器,重启storm集群,再次尝试打包:
        docker-compose -f ./storm-compose.yml down

        docker-compose -f ./storm-compose.yml up -d

        这样就可以顺利解决找不到主类的问题了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐