这篇博客,我们一起来实现一个功能,实时舆论监控。
今天学到了一句话,Talk is cheap, show me your code,分享给大家
好,我们开始!
背景
公司现有的舆论监控是这样的,运营人员每隔一段时间会去查看阿里云日志服务的日志,但由于运营人员不熟这一块,肯定是不能让他们直接上阿里云去查看的,所以我们的开发在GM的菜单栏上加上了这个功能,当运营人员要查看玩家聊天日志的时候,选好时间日期等字段,发送请求给后端,后端调用阿里云提供的接口拿到从阿里云返回的日志,后台处理过后返回给前端界面。
那么这样做有什么缺点呢?首先,这个舆论监控功能不够实时,比如说,我们的运营人员可能每半个小时才会查看一次日志,那么就有可能过了半小时,运营人员才看到某个玩家有不当言论,这个时候再去采取相应措施处理,菜都凉了。而更多时候,是玩家主动的跟我们的客服人员投诉某玩家有不当言论,我们的运营人员才去查看相关日志。而且我们的运营人员每次查看日志,真的是把所有玩家的聊天记录从头到尾都看个遍,这实在是浪费时间啊!Life is short, why not make good use of time and learn Python haha?
方案概述
针对上面的背景介绍,提出如下方案,简述如下
- 前端GM界面提供让我们的运营人员自定义敏感关键字功能,并把敏感关键字存到MySQL数据库
- 使用 Flume + Kafka + Spark Streaming 处理玩家聊天日志
- 实时,间隔时间为10s
- 自动告警
实现
在Kafka创建topic名为mafia-chat,如图
代码如下
bin/kafka-topics.sh \
--create \
--zookeeper hadoop004:2181/kafka \
--replication-factor 1 \
--partitions 3 \
--topic mafia-chat
bin/kafka-topics.sh \
--list \
--zookeeper hadoop004:2181/kafka
进入Flume文件夹
[hadoop@hadoop004 bin]$ pwd
/data/aaron/app/apache-flume-1.6.0-cdh5.7.0-bin/bin
[hadoop@hadoop004 bin]$ nohup ./flume-ng agent --name sls-flume-kafka \
> --conf /data/aaron/app/apache-flume-1.6.0-cdh5.7.0-bin/conf/conffile \
> --conf-file /data/aaron/app/apache-flume-1.6.0-cdh5.7.0-bin/conf/conffile/mafia-chat.conf \
> -Dflume.root.logger=INFO,console &
通过Kafka consumer消费看到数据,此处涉及到公司相关信息,就不贴图了
下面我们再来演示在Spark Streaming中读取MySQL数据库,代码如下
val mysqlDF = spark.read.format("jdbc")
.option("url", "jdbc:mysql://ip:3306")
.option("dbtable", "mafia_chat.forbidden_word")
.option("user", "root").option("password", "pwd")
.option("driver", "com.mysql.jdbc.Driver").load()
mysqlDF.show
在启动Spark作业之前,我们还需要做一些准备工作,如下
create database mafia_chat;
CREATE TABLE `forbidden_word` (
`id` int(11) NOT NULL,
`word` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
grant all on *.* to root@'*';
flush privileges;
INSERT INTO forbidden_word (id, word) VALUES(1, '结婚');
INSERT INTO forbidden_word (id, word) VALUES(2, '联姻');
启动Spark Streaming作业