大数据课程——Storm综合应用

大数据课程——Storm综合应用

实验内容以及要求

假设在某一搜索应用中,需要实时统计搜索次数最多的热门关键词,并按照实时统计搜索次数输出最热门的20大热门关键词及被搜索次数。用户搜索的日志通过Flume采集,并写入Kafka,Storm从Kafka中实时读取数据,并完成实时统计工作,并进行输出。
在这里插入图片描述
提示:
(1)搜索日志可以采用实验5的数据(搜狗搜索数据),一行代表一次用户搜索;
(2)Flume Agent的Source可以配置为syslogudp类型(端口5640),监控搜索日志;
(3)输出形式自定。

问题总结

Agent配置时的Source类型

Client包是模拟数据包的产生的,将数据发往5640端口。因此Flume的Agent配置要写明Source是syslogudp类型,并且监控5640端口。

Storm的UI界面端口问题

Storm的UI界面端口是可以改动的,默认为8080。但在实验室里做实验的话,就发现老师已经吧端口改了,改成了8099,因此要访问localhost:8099才可以进入Storm的UI界面,否则会出现404错误,这个要注意。

Key、Value问题

写代码的时候,一开始照着书上的Kafka整合Storm的代码来写,但其实获取数据的时候,其实Key是没东西的,Value才能获得具体数据。Key得到的全是null。如下图所示。

在这里插入图片描述

吐槽一下

顺便吐槽一下,实验数据输出的排行榜略少儿不宜。但没办法,只能说数据太真实了哈哈哈。
另外具体代码放在本文最后面。

实验步骤

Flume Agent 配置

在这里插入图片描述
本次将Centos01作为Flume的Agent,负责监控5640端口,拦截收到的数据包,并将其中的数据存储到Kafka集群的topictest话题中。
所以将Source的类型设置为syslogudp,监控5640端口,接受其中产生的数据包。
Sink设置为Kafka集群,将得到的数据包传入kafka集群中。

Storm代码编写思路

在这里插入图片描述
如上图所示,我的项目中主体由KafkaSpout、SplitDataBolt、WordCountBolt、ReportBolt四项组成,数据在其中依次流动,StormTopology对他们进行设置、调用。(代码在文末)。
KafkaSpout作为数据源,从kafka集群中提取需要的数据,并且发送给SplitDataBolt进行处理。
SplitOutBolt作为一个处理Bolt,将接收到的数据进行分割处理,从中提取出关键字字段,并且设置值为1(因为出现一次),发送给WordCountBolt进行统计。
WordCountBolt作为第二个处理Bolt,对关键词的出现次数进行统计和存储,并将统计结果发送给ReportBolt。
ReportBolt作为第三个Bolt,将接收到的“关键词-出现次数”数据进行存储,并且按照“出现次数”进行排序,将排序结果进行输出,得到最终的结果排行榜。

代码展示

首先依次开启Zookeeper、HDFS、HA集群、Kafka、Flume、Storm。并且可以进入Storm的UI界面来测试Storm是否开启成功,其他的集群开启这里不予以赘述。

在这里插入图片描述
系统开启完毕后,就可以运行Client.jar包,该JAR包的作用是负责从数据集中提取数据,整合成数据包,并且随机间隔一定时间向5640端口发送该数据包。这样就可以模拟真实的数据产生,并且被Flume抓住该数据包,发送到Kafka集群中。

在这里插入图片描述
如果一切顺利的话,可以开启一个消费者,查看topictest话题,能看到数据正常被发送到Kafka集群中。如下图所示。
在这里插入图片描述
项目代码写好后,打包成Storm.jar包,在Centos01中运行,成功运行后如下图所示。

在这里插入图片描述
每间隔一段时间,都会打印出排行榜信息,如下图所示。可以看到随着时间的增加,排行榜是在根据数据不断变化的,不断输出排名前20的关键词排行信息,可以看到关键词以及其出现次数统计。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码

KafkaSpout

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;

import java.time.Duration;
import java.util.Arrays;
import java.util.Map;
import java.util.Properties;

/**
 * @author: 冰冷灬泡面
 * @date: 2021/5/7 13:31
 * @description:
 * @modifiedBy:
 */
public class KafkaSpout extends BaseRichSpout {
   
    private static final long serialVersionUID = 7582771881226024741L;
    private KafkaConsumer<String, String> consumer;
    SpoutOutputCollector collector;


    /*---------------设置Kafka配置-------------*/
    public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
   
        this.collector = spoutOutputCollector;
        //Kafka属性信息
        Properties props = new Properties();
        props.put("bootstrap.servers", "centos01:9092");
        props.put("group.id", "test");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值