目录
通过虚拟机配置Flume及Kafka,掌握Storm获得实际数据源的配置方法。
实验目的
通过虚拟机配置Kafka及编写kafkaSpout,掌握Storm获得实际数据源的配置方法。
实验内容
1. Flume选用1.6以上版本(之前的版本需要自行添加kafka相关包),编写flume-kafka-conf.properties,其中source使用spooldir类型,sink使用org.apache.flume.sink.kafka.KafkaSink类型(需配置topic——kafka中的topic,brokerList——与kafka相同)
2. 根据flume目录lib下的kafka版本,下载相关包,查看及修改配置文件zookeeper.properties(clientPort保持2181不变)和server.properties(broker.id为任意整数,host.name=localhost,port=9092和zookeeper.connect=localhost:2181)
3. 启动zookeeper、kafka和flume,启动kafka中监听输入的程序
bin/kafka-console-consumer.sh --topic topic名称 --zookeeper localhost:2181
4. 在Spooldir中添加文件,查看kafka中消费者的效果
5. Kafka建立任一主题(按照ZooKeeper、kafka-server、kafka-topics的顺序)bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic名称
6. 编写kafkaspout,消费kafka产生的数据
import storm.kafka.BrokerHosts;
import storm.kafka.KafkaSpout;
import storm.kafka.SpoutConfig;
import storm.kafka.StringScheme;
import storm.kafka.ZkHosts;
SpoutConfig spoutConfig = new SpoutConfig(brokerHosts, topic, zkRoot, id);//第一项参数BrokerHosts brokerHosts = new ZkHosts("本机"); 后三项为String
spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());//格式配置为字符串
之后的setSpout("KafkaSpout", new KafkaSpout(spoutConfig));
7. 之后的bolt采用split+count,对kafka中输出的数据进行处理
实验过程
Flume+kafka->storm(实时数据的处理结构)
在前面我们已经完成了flume+kafka系统的构建,现在将kafka得到的数据交由storm处理,在storm中编写kafkaspout对前面系统产生的数据做处理。
Kafka相当于是作为消息队列(或者说是消息中间件)的角色,其产生的消息需要有消费者去消费,所以Kafka与Storm的整合,关键在于我们的Storm如何去消费Kafka消息topic中的消息(kafka消息topic中的消息正是由Flume采集而来,现在我们需要在Storm中对其进行消费)。
在网上找到的一个完整的系统结构:
系统优势:使用Flume去监听订单日志,并实时把每一条日志信息抓取下来并存进Kafka消息系统中, 接着由Storm系统消费Kafka中的消息,同时消费记录由Zookeeper集群管理,这样即使Kafka宕机重启后也能找到上次的消费记录,接着从上次宕机点继续从Kafka的Broker中进行消费。
配置storm和zookeeper
在上面的步骤中已经使用kafka自带的zookeeper完成了第一个实验,这里需要联立的是storm+flume+kafka,所以我使用的是独立安装的zookeeper。安装过程不在叙述,注意zoo.cfg配置如下:
注意server.1=127.0.0.1:2888:3888和dataDir这两个地方
DataDir是存放数据的目录,需要自己建立这个文件夹
接下是storm文件storm.yaml的配置,需要注意一下配置
启动系统
注意启动的顺序是成功的一个关键,启动顺序如下:
先启动zookeeper zkServer.sh start(我配置了环境变量)
然后启动kafka
./bin/kafka-server-start.sh ./config/server.properties 注意到相应的目录去:
创建kafka topic:
./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic sink1
因为我在上面已经创建过sink1这个topic了,所以这里提示已有topic
查看topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
显示sink1为运行正确
启动flume,让flume去连接kafka
bin/flume-ng agent -n agent -c conf -f conf/spool.conf -Dflume.root.logger=INFO,console
-n后面的agent为配置中代理的具体名字,本例中即为agent
启动storm:
Storm nimbus &
Storm supervisor &
Storm ui &
在eclipse中运行拓扑
编写KafkaSpout作为整个系统的数据源:
和普通的spout一样,需要初始化的SpoutOutputCollector,但多了ConsumerConnector来作为kafka和storm的连接
注意在这个方法中完成zookeeper的对接,groupid是上面配置zookeeper的时候的参数
申明输出字段和topic
最重要的Active方法如下:
题目要求的是两个botlt分别为word+count,所以这里直接发送消息
然后是第一个bolt的编写:
Bolt的编写非常简单和普通的bolt一样,这里完成了spout发来的语句的分词,然后输出分词的结果给下游的bolt进行词频统计
第二个bolt的编写如下:
第二个bolt完成对词的统计,所以这使用一个map构建词->计数进行统计,每收到这个词就发送这个词的计数
最后是主方法的编写
Conf的配置是一样的,这里注意每个组件的分组机制就可以,第一个bolt可以随机接受tuple,但第二个bolt完成的是ci的计数,所以更具word字段分组。
启动拓扑,等待一会,就可以看到连接上kafka的sink1了,
接下来我们去修改flume监控的文件目录,flume的配置文件里写的
得到结果如下:
配置成功^_^