使用Redis运行Storm时出错:java.lang.NoClassDefFoundError:Lredis/clients/jedis/jedis
我的Storm类使用Redis队列收集数据 我试着让我的风暴罐跑过去使用Redis运行Storm时出错:java.lang.NoClassDefFoundError:Lredis/clients/jedis/jedis,java,linux,hadoop,redis,apache-storm,Java,Linux,Hadoop,Redis,Apache Storm,我的Storm类使用Redis队列收集数据 我试着让我的风暴罐跑过去 storm jar jar_file_name.jar Topology_name configuration_file 但我有以下例外: Exception in thread "main" java.lang.NoClassDefFoundError: Lredis/clients/jedis/Jedis; at java.lang.Class.getDeclaredFields0(Native Method)
storm jar jar_file_name.jar Topology_name configuration_file
但我有以下例外:
Exception in thread "main" java.lang.NoClassDefFoundError: Lredis/clients/jedis/Jedis;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2397)
at java.lang.Class.getDeclaredField(Class.java:1946)
at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1659)
at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:72)
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:480)
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:468)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:468)
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:365)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1133)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at backtype.storm.utils.Utils.serialize(Utils.java:77)
at backtype.storm.topology.TopologyBuilder.createTopology(TopologyBuilder.java:111)
at OutlierPredictor.main(OutlierPredictor.java:98)
Caused by: java.lang.ClassNotFoundException: redis.clients.jedis.Jedis
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
从命令行
我在单个节点设置中执行此操作
出了什么问题?您需要将所有代码和依赖项打包到一个jar中 请参阅,拓扑部分 运行拓扑非常简单。首先,你把所有的东西都打包 将代码和依赖项集成到一个jar中。然后,运行如下命令 以下是: storm jar all-my-code.jar backtype.storm.MyTopology arg1 arg2 您可能需要使用一些打包工具,如OneJAR、JarJar或ANT,并创建一个包含所有文件和依赖项的jar。请参考这些SO帖子
谢谢你的回答,约翰 但我找到了另一个解决办法 我的$STORM_HOME/lib中没有包括jedis-2.1.0.jar、commons-pool-1.5.5.jar/ 注意:这两个文件在$REDIS_内核中。1)添加绝地依赖项
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
redis.clients
绝地武士
2.9.0
2) 使用汇编插件将所有依赖项打包到一个jar文件中
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>your main class</mainClass>
</manifest>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>your main class</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven jar插件
2.6
真的
你的主课
org.apache.maven.plugins
maven汇编插件
你的主课
带有依赖项的jar
组装
包裹
单一的
3) 忽略包中的storm core
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
org.apache.storm
风暴核心
1.1.1
假如
当我们使用绝地配置时,需要配置。在SpringBoot2.0中,SpringBootStarter数据redis默认提供了莴苣依赖项,而不是绝地依赖项。要使用绝地配置,请按如下方式排除莴苣并添加绝地
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
org.springframework.boot
spring启动程序数据redis
生菜
莴苣核
redis.clients
绝地武士
我建议使用像maven这样的项目管理工具来关注cp、编译和uberjar。我想说,将其他jar(如jedis)放入$STORM_HOME/lib/是一种黑客行为,不是正确的方式:)请使用前面提到的maven依赖项或使用github存储库中提供的jedis jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>