接上篇 storm的安装,本篇进行storm与kafka进行集成工作。
喷口(spout)是流的来源。 例如,spout可能会读取卡夫卡主题中的元组并将其作为流发送。 Bolts消耗输入流,处理并可能发射新的流。 Bolts可以做任何事情,从运行功能,过滤元组,流聚合,流式连接,与数据库交互等等。 Storm拓扑中的每个节点并行执行。 一个拓扑无限期地运行,直到终止它。 Storm会自动重新分配任何失败的任务。 此外,即使机器停机并且信息丢失,Storm也可以保证不会丢失数据。
有三个主要类将Kafka和Storm结合在一起。 他们如下
BrokerHosts - ZkHosts&StaticHosts
BrokerHosts
是一个接口,ZkHosts
和StaticHosts
是它的两个主要实现。 ZkHosts用于通过在ZooKeeper中维护详细信息来动态跟踪Kafka经纪人,而StaticHosts
用于手动/静态设置Kafka经纪人及其详细信息。 ZkHosts是访问Kafka经纪人的简单而快捷的方式。
所以我这里选取了ZkHosts的方式进行构建集成。
(1)主要流程:(简单的描述)其实前面从webServer到kafka这条路已经打通了,在这篇文章里,这篇文章主要是对kafka到storm这条路如何打通进行讲解,在下一篇中会再将怎么持久化到hdfs中的。
ZkHosts的签名如下 -
public ZkHosts(String brokerZkStr, String brokerZkPath)
public ZkHosts(String brokerZkStr)
其中brokerZkStr
是ZooKeeper主机,brokerZkPath
是维护Kafka代理细节的ZooKeeper路径。本文中我选取了第二种方式,下面是我的配置:
//配置zk连接
String zkConnString = "master:2181";
BrokerHosts hosts = new ZkHosts(zkConnString);
//Spout配置 分别是zk主机位置 kafka的topic,然后一个zkRoot ,另外一个就是id
SpoutConfig spoutConfig = new SpoutConfig(hosts, "testtopics", "", "1");
spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());
KafkaSpout kafkaSpout = new KafkaSpout(spoutConfig);
然后下面就是设置spout和bolt的过程了
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("kafkaspout", kafkaSpout).setNumTasks(2);
builder.setBolt("spilt-bolt", new SplitBolt(), 2).shuffleGrouping("kafkaspout").setNumTasks(2);
Config config = new Config();
config.setNumWorkers(2);
config.setDebug(true);
//3、提交任务,分为本地模式、集群模式,这里我们设置了提交到集群中去
StormSubmitter.submitTopologyWithProgressBar("mywordcount",config,builder.createTopology());
(2)pom文件:这里花费是时间是最多的,因为版本以及包之间的匹配问题,调来调去调了一整天才调通的。(里面包含了对下一篇hdfs中的操作需要的包)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.storm</groupId>
<artifactId>storms</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>storms</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.storm/storm-core -->
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>2.0.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients <dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.0.1</version>
</dependency>
-->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.storm/storm-kafka -->
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-kafka</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>2.1.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-hdfs</artifactId>
<version>1.2.2</version>
<exclusions>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass></mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
(3)启动测试:
开启ZK(集群中都要开) kafka(集群中都要开) storm(一个nimbus 其余为supervisor)
启动一个生产者:
bin/kafka-console-producer.sh --broker-list master:9092 --topic testtopics
启动Storm jar
storm jar software/storms-0.0.1-SNAPSHOT.jar com.storm.storm2.WCApp
在生产者中输入:
在/opt/apache-storm-1.1.3/logs/workers-artifacts/mywordcount-18-1563413651/6700/worker.log 中会发现正常输出,并且没有报错就说明成功了:
如果里面报错了,查看错误的时候要是一台supervisor上的错误看不出什么东西来的话,那就去另一台supervisor上去看,说不定会发现什么报错的原因,然后去解决。这里简单列几个问题和解决方案:
1、You're probably bundling the Storm jars with your topology jar.
删除 /Apache-storm2.0.0/lib下的对应jar包即可
2、当重新部署新的版本时,可能出现Exception in thread "main" org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts ["localhost"]. Did you specify a valid list of nimbus hosts for config nimbus.seeds?、
的错误,这时可以用这个方法解决
问题原因:
由于是重新部署的storm,原先旧的storm已在zookeeper中注册了信息,只要进入zookeeper客户端将storm删除:
./bin/zkCli.sh
ls /
rmr /storm
重启storm集群即可。
3、错误集锦(主要是一些jar包缺失导致的错误)
https://www.jianshu.com/p/70c3a7f56386