storm和MapReduce框架是类似的,但在生成数据时,往往是增量更新。因为Trident的出现,开发一套实时数据程序非常方便。本人将介绍小米统计storm开发过程中使用的一些优化点。
acker数据设置适中
为了保证数据流被正确的消耗,storm通过acker来跟踪各个数据流,并维持各个数据流的应答。acker设置过小,对任务应答会处理不过来。acker设置过大,会消耗比较多的资源。根据需要可以设置几十个
对应参数:topology.acker.executors
超时时间不要设置过长
设置过长,会导致之前没commit的数据导致该offset之后的数据被重新处理。如果设置时间为6个小时,那么6个小时前一个数据没有被commit,可能导致这6个小时内的数据都被重新消耗一次。
减少shuffle的数据
shuffle过程,会极大的增加网络IO,开发过程中应该尽量减少shuffle的数据量。如果可能,最好在一台节点上处理所有能处理的任务,不要将不必要的数据通过shuffle分发到下一个过程处理。
trident接口的异常处理
用trident写storm程序时,实现继承类的接口时,如果抛出异常,该bolt对应线程会挂掉,并打印出异常信息,对应的消息会被重试,同时重启一个bolt。所以对于已知的异常,一定要处理