Storm 入门(四)—— Storm+Kafka的实时计算实践

本章将简单介绍关于Storm+Kafka的进行一个简单的实践,进行单词累计计算。

词累计计算是一个累计量的计算,实时计算一般要注意是累积量的计算,还是分时量的计算,这两者拥有明显的区别,比如计算网站的用户访问的UV数量,那么累计量就是一定时间如一天内的访问网站的不同的用户数量,第二天清零重新计算不需要在意前一天该用户是否访问过,但是分时计算就不仅需要考虑在当前时间间隔内是否是不同的用户,还要考虑到该用户是否在之前的时间里曾经访问过,访问过就不能计入当前时间间隔内。

首先是关于数据源的接收,关于如何搭建Kafka集群和Storm集群网上教程很多不在本文的讨论范围内。如下是一个kafka的消费spout

Storm 入门(四)—— Storm+Kafka的实时计算实践_第1张图片
接收kafka消息的spout

该spout链接了kafka的集群,将offset放在末尾,开始读取kafka的数据,kafka的group和topic在初始化的时候传入,在Executor中奖不断的调用nextTuple传递日志信息。

然而此时的元组信息是比较粗糙的日志信息,需要将日志清洗一次,获取日志的数据结果。所以在进行词的累计量统计前需要将数据进行切割。如下bolt所示:


Storm 入门(四)—— Storm+Kafka的实时计算实践_第2张图片
解析日志


在上图所示的bolt中解析了日志格式,将日志拆分,解析成json格式,并且取出了其中的key字段进行统计。

那么接下来这个bolt将用于统计词频,并且存入数据库

Storm 入门(四)—— Storm+Kafka的实时计算实践_第3张图片
简单的词频统计

这是一个非常简单的词频统计计入数据库的操作,并且没有关注到数据统计因机器网络等原因出现故障的时候数据恢复容灾的情况,在实际的情况中需要考虑到数据出错的情况下数据重跑的可能性,不过作为一个简单的联系应该是够用了。

因为实时计算的kafka日志接受频率比较高数据库连接数是有限的,不可能频繁的进行数据库操作,因此将词频统计的工作移到内存来做,并且写一个如下的command发出数据库插入或更新指令。

Storm 入门(四)—— Storm+Kafka的实时计算实践_第4张图片
数据操作指令spout

该spout中有两个timer的定时执行指令,我们只用到update指令,指令会在指令队列中存储,spout定时的往指令队列中插入指令,指令队列迅速将指令推送给所有的count的task,进行数据库更新。

写完了各个组件的逻辑需要用topology将各个指令串联起来,如下是一个简单的topology:


Storm 入门(四)—— Storm+Kafka的实时计算实践_第5张图片
简单topology

这个topology非常简单,为topoogy分配了8个worker,为kafka的接受spout分配了8个executor线程,两个bolt都分配了4个executor线程,此外你还可以通过.setNumTasks的方式设置Task的数量。

在计算的词频的bolt中同时接受两类的数据,一个是上游bolt对日志清洗传递的数据,一类是发送指令的spout发出的指令,这也体现了Storm的组件间灵活处理。

你可能感兴趣的:(Storm 入门(四)—— Storm+Kafka的实时计算实践)