Storm Supervisor 找不到 KafkaSpout class
Storm Supervisor can't find KafkaSpout class
我正在使用 Apache Storm 1.1.2、Apache Kafka 0.10、Zookeeper 和 Docker Compose 编写 dockerized Java 9 Spring 应用程序。
我的拓扑完全在 docker 化服务内的本地集群上运行,但现在我将其移动到生产集群时出现了问题。
我创建提交拓扑到 Storm 集群的服务似乎工作正常,代码在 PostConstruct 中看起来很像这样
KafkaSpoutConfig<String,String> spoutConf =
KafkaSpoutConfig.builder("kafka:9092", "topic")
.setProp(ConsumerConfig.GROUP_ID_CONFIG, "my-group-id")
.setProp(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, MyDeserializer.class)
.build();
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("kafkaSpoutId", new KafkaSpout<String,String>(spoutConf));
builder.setBolt("boltId", new MyBolt()).shuffleGrouping("kafkaSpoutId");
Config conf = new Config();
conf.setNumWorkers(2);
conf.put(Config.STORM_ZOOKEEPER_SERVERS, List.of("zookeeper"));
conf.put(Config.STORM_ZOOKEEPER_PORT, 2181);
conf.put(Config.NIMBUS_SEEDS, List.of("nimbus"));
conf.put(Config.NIMBUS_THRIFT_PORT, 6627);
System.setProperty("storm.jar","/opt/app.jar");
StormSubmitter.submitTopology("topology-id", conf, builder.createTopology());
我的 docker 撰写文件如下所示。
version: "2.1"
services:
my-service:
image: my-service
mem_limit: 4G
memswap_limit: 4G
networks:
- default
environment:
- SPRING_PROFILES_ACTIVE=local
nimbus:
image: storm:1.1.2
container_name: nimbus
command: >
storm nimbus
-c storm.zookeeper.servers="[\"zookeeper\"]"
-c nimbus.seeds="[\"nimbus\"]"
networks:
- default
ports:
- 6627:6627
supervisor:
image: storm:1.1.2
container_name: supervisor
command: >
storm supervisor
-c storm.zookeeper.servers="[\"zookeeper\"]"
-c nimbus.seeds="[\"nimbus\"]"
networks:
- default
depends_on:
- nimbus
links:
- nimbus
restart: always
ports:
- 6700
- 6701
- 6702
- 6703
ui:
image: storm:1.1.2
command: storm ui -c nimbus.seeds="[\"nimbus\"]"
networks:
- default
ports:
- 8081:8080
networks:
default:
external:
name: myNetwork
所有容器都已启动。在 UI 中,我可以看到在 post 构造中创建的拓扑,但没有 Kafka 消息正在处理,应该使用本地 Kafka 生产者生成聚合的螺栓没有发布。
在 /logs/worker-artifact/topology-id****/6700/worker.log
的主管容器中,我可以看到重复出现两个异常。
第一个(我认为更重要)是ClassNotFoundException: org.apache.storm.kafka.spout.KafkaSpout
第二个例外是org.apache.storm.shade.org.jboss.netty.channel.ChannelException: Failed to bind to: 0.0.0.0/0.0.0.0:6700
更新
不幸的是,我不能 post 我的整个 pom 但这是我的 Storm 依赖项
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${storm.version}</version>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-kafka-client</artifactId>
<version>${storm.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
这是我的 spring-boot-maven-plugin。我虽然添加配置以使复制到我的容器不可执行的 jar 可以解决问题。当我检查容器中的 jar 时,它看起来包含 jar 的依赖行,但也有大量乱码
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>false</executable>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
</plugin>
</plugins>
</build>
这是我的大部分 docker文件
FROM ${docker.repository}/openjdk:9.0.1
EXPOSE 80 1099
WORKDIR /opt
ENTRYPOINT ["java", \
"-Dinfo.serviceName=${project.artifactId}", \
"-Dinfo.serviceVersion=${project.version}"]
CMD ["-jar", "app.jar"]
LABEL VERSION="${project.version}" DESCRIPTION="${project.description}"
COPY ${project.build.finalName}-exec.jar /opt/app.jar
我明白了。问题是我正在形成一个不可执行的罐子而不是一个真正的胖罐子。我将以下插件添加到我的 pom
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
接下来我将系统 属性 更改为
System.setProperty("storm.jar", "/opt/storm.jar");
并将以下行添加到我的 Dockerfile
COPY ${project.build.finalName}-jar-with-dependencies.jar /opt/storm.jar
最后我会先 运行 mvn comiple assembly:single
然后将带有依赖关系的项目 jar 从 target/ 复制到 target/docker-ready 就像 from project dir cp target/project-jar-with-dependencies.jar target/docker-ready/
最后 运行 mvn verify docker:build
我正在使用 Apache Storm 1.1.2、Apache Kafka 0.10、Zookeeper 和 Docker Compose 编写 dockerized Java 9 Spring 应用程序。
我的拓扑完全在 docker 化服务内的本地集群上运行,但现在我将其移动到生产集群时出现了问题。
我创建提交拓扑到 Storm 集群的服务似乎工作正常,代码在 PostConstruct 中看起来很像这样
KafkaSpoutConfig<String,String> spoutConf =
KafkaSpoutConfig.builder("kafka:9092", "topic")
.setProp(ConsumerConfig.GROUP_ID_CONFIG, "my-group-id")
.setProp(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, MyDeserializer.class)
.build();
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("kafkaSpoutId", new KafkaSpout<String,String>(spoutConf));
builder.setBolt("boltId", new MyBolt()).shuffleGrouping("kafkaSpoutId");
Config conf = new Config();
conf.setNumWorkers(2);
conf.put(Config.STORM_ZOOKEEPER_SERVERS, List.of("zookeeper"));
conf.put(Config.STORM_ZOOKEEPER_PORT, 2181);
conf.put(Config.NIMBUS_SEEDS, List.of("nimbus"));
conf.put(Config.NIMBUS_THRIFT_PORT, 6627);
System.setProperty("storm.jar","/opt/app.jar");
StormSubmitter.submitTopology("topology-id", conf, builder.createTopology());
我的 docker 撰写文件如下所示。
version: "2.1"
services:
my-service:
image: my-service
mem_limit: 4G
memswap_limit: 4G
networks:
- default
environment:
- SPRING_PROFILES_ACTIVE=local
nimbus:
image: storm:1.1.2
container_name: nimbus
command: >
storm nimbus
-c storm.zookeeper.servers="[\"zookeeper\"]"
-c nimbus.seeds="[\"nimbus\"]"
networks:
- default
ports:
- 6627:6627
supervisor:
image: storm:1.1.2
container_name: supervisor
command: >
storm supervisor
-c storm.zookeeper.servers="[\"zookeeper\"]"
-c nimbus.seeds="[\"nimbus\"]"
networks:
- default
depends_on:
- nimbus
links:
- nimbus
restart: always
ports:
- 6700
- 6701
- 6702
- 6703
ui:
image: storm:1.1.2
command: storm ui -c nimbus.seeds="[\"nimbus\"]"
networks:
- default
ports:
- 8081:8080
networks:
default:
external:
name: myNetwork
所有容器都已启动。在 UI 中,我可以看到在 post 构造中创建的拓扑,但没有 Kafka 消息正在处理,应该使用本地 Kafka 生产者生成聚合的螺栓没有发布。
在 /logs/worker-artifact/topology-id****/6700/worker.log
的主管容器中,我可以看到重复出现两个异常。
第一个(我认为更重要)是ClassNotFoundException: org.apache.storm.kafka.spout.KafkaSpout
第二个例外是org.apache.storm.shade.org.jboss.netty.channel.ChannelException: Failed to bind to: 0.0.0.0/0.0.0.0:6700
更新
不幸的是,我不能 post 我的整个 pom 但这是我的 Storm 依赖项
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${storm.version}</version>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-kafka-client</artifactId>
<version>${storm.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
这是我的 spring-boot-maven-plugin。我虽然添加配置以使复制到我的容器不可执行的 jar 可以解决问题。当我检查容器中的 jar 时,它看起来包含 jar 的依赖行,但也有大量乱码
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>false</executable>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
</plugin>
</plugins>
</build>
这是我的大部分 docker文件
FROM ${docker.repository}/openjdk:9.0.1
EXPOSE 80 1099
WORKDIR /opt
ENTRYPOINT ["java", \
"-Dinfo.serviceName=${project.artifactId}", \
"-Dinfo.serviceVersion=${project.version}"]
CMD ["-jar", "app.jar"]
LABEL VERSION="${project.version}" DESCRIPTION="${project.description}"
COPY ${project.build.finalName}-exec.jar /opt/app.jar
我明白了。问题是我正在形成一个不可执行的罐子而不是一个真正的胖罐子。我将以下插件添加到我的 pom
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
接下来我将系统 属性 更改为
System.setProperty("storm.jar", "/opt/storm.jar");
并将以下行添加到我的 Dockerfile
COPY ${project.build.finalName}-jar-with-dependencies.jar /opt/storm.jar
最后我会先 运行 mvn comiple assembly:single
然后将带有依赖关系的项目 jar 从 target/ 复制到 target/docker-ready 就像 from project dir cp target/project-jar-with-dependencies.jar target/docker-ready/
最后 运行 mvn verify docker:build