storm与kafka进行集成

接上篇 storm的安装,本篇进行storm与kafka进行集成工作。

喷口(spout)是流的来源。 例如,spout可能会读取卡夫卡主题中的元组并将其作为流发送。 Bolts消耗输入流,处理并可能发射新的流。 Bolts可以做任何事情,从运行功能,过滤元组,流聚合,流式连接,与数据库交互等等。 Storm拓扑中的每个节点并行执行。 一个拓扑无限期地运行,直到终止它。 Storm会自动重新分配任何失败的任务。 此外,即使机器停机并且信息丢失,Storm也可以保证不会丢失数据。

有三个主要类将Kafka和Storm结合在一起。 他们如下 

BrokerHosts - ZkHosts&StaticHosts

BrokerHosts是一个接口,ZkHostsStaticHosts是它的两个主要实现。 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yann.bai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值