流数据处理Flume+Kafka的初步实现

本文介绍了如何通过Flume收集数据并发送到Kafka,再由Storm进行实时处理。实验包括配置Flume的spooldir source和Kafka sink,设置Storm和Zookeeper,启动系统并在Eclipse中运行拓扑。最终实现实时数据处理结构:Flume+kafka->storm。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

实验目的

实验内容

实验过程

Flume+kafka->storm(实时数据的处理结构)

配置storm和zookeeper

启动系统

在eclipse中运行拓扑


  • 实验目的

​​​ 通过虚拟机配置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的配置文件里写的

得到结果如下:

配置成功^_^

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值