目标:每秒18000条数据能够通过storm挖掘处理完
问题:通过kafka完成,每秒只能处理5000条左右
1.通过增加bolt的处理线程数,并未发现UI上的每秒处理的速度变快
2.写文件,决定用直接读取文件的方式:
kafka写了8min,最终写出了1180000条数据,
这说明了一个问题,8min只能产生1180000条数据,如何能在1s处理18000条数据。
3.即使这样,仍然采用直接读文件的方法,而非采用从kafka读取数据
(1)readlog不sleep,1180000条数据30秒内处理完成,然而,查询结果无法输出
(2)readlog每条sleep 1ms,但是readlog并不能在内读到18000条数据,虽然该情况下,查询有输出
4.考虑sleep的时间太长,每10000条数据sleep 10ms,或者5000条数据sleep 10ms,结果还是处理很快,查询没有输出结果
5.既然每秒18000条是通过UI看的,为什么我一定要一秒的数据也是18000条呢(18000条数据的时间标记是一样的),因为1s的数据是Map打包处理的,修改1s 1800条数据,但是这样处理的速度仍然是特别慢的,而且稳定到下图的值的时候,增长很慢。
6.剩下只有一个可能,因为打时间标签花费太长时间,将打标签的工作,由发数据的挪到bolt中。下一个方案就是将打时间戳的工作由发送数据端改到bolt端,但是还是稳定在1s 5000条数据
(1)加大线程数到48,会报空指针的异常,这很可能是因为并发修改的缘故
(2)增加抛弃的数据,每10条抛弃9条,但还是稳定在1s 5000条数据
7.进一步简化发送数据端的逻辑,会出现并发修改的问题,报空指针异常
得出结论:
(1)优点:kafka发送数据有限制流量的作用,大量数据来临时,不会崩溃,程序不会不出结果。
(2)缺点:并不能使数据端速度达到每秒18000条甚至更多,换而言之,当大量数据来临时,并不能及时处理完,可能需要更多的时间进行处理。