在storm的流计算框架中,在数据量非常大或者计算逻辑比较复杂的情况下,可能会造成处理速度变慢的情况,最后反而不满足了系统的处理要求,因此这里讨论一下。本文的内容是我在storm的使用过程中所得到的一些经验,个人的观点,如果考虑不够全面或者有某些问题,以后会慢慢补齐或者改进。
在数据量一定的情况下,如果要提高计算效率,当然首要的任务是
(1)要将系统中的算法调优。有可能一个算法浪费了一小部分时间,但由于数据量可能比较大,以至于整体上1秒的时间内可能浪费大量的时间。因此,算法的设计还是比较重要的。
(2)其次,就是调整系统中占用资源比较多、运算速度比较慢的那些spout和bolt。在进行topology设计时需要设计好每个bolt的并行度。对于运行速度比较慢的bolt,需要调大他们的并行度,是得更多的资源用到这些计算上面来。这里,bolt运行的快慢是可以从ui界面中看到的,如下图:
如上图,其中,capacity表示一种容量,其实就是占用的资源的百分比。比如,0.799就表示占用了79.9%的分配给这个bolt的资源。这个数值越大,则表示的处理起来速度越慢,则更要加大它的并行度。
(3)然后就是设置acker的数量。acker是在bolt成功处理后,进行ack调用的线程(还是进程,我忘记了)。当数据量比较大时,需要使用这个线程的次数就比较多,因此有可能这个线程就是制约处理速度的因素。因此,可以适当调大acker的数量,用于进行ack的调用。系统中,如果不设置的话,acker的数量默认为1;可以通过以下语句在topology中进行设定:
(4)再就是,在算法的设计过程中,当需要使用某些算法时,比如进行分组的算法,则尽量使用storm系统中自带的fieldsgrouping的方法来代替自己实现的算法。这样效率应该会有提高。
conf.put(Config.TOPOLOGY_ACKER_EXECUTORS, 10);//设置acker的数量
(5)在设置线程的并行度时,最好能够根服务器集群的及其数量和其每台的cpu的核心数有所关联。我一般这样设置,比如,在我的使用的集群中,假如共有5台用于工作的服务器,则我在进行资源消耗较多的bolt的并行度设置时,一般设置其并行度是5的倍数,如10,15,20等。这样可以更容易的促进系统自动进行负载的均衡。
(6)设置好worker的数量。worker是指工作进程的数量,其上可以运行多个工作线程。在设置worker的数量时,首先查看系统中的所有的executors线程数共有多少,比如,有45个。那么,在设置worker的数量时,最好使得每个worker进程所占有的线程数不要太大,也不要太小。我一般设置为3,也就是说每个worker进程大约有3个左右的线程。在上面的45个executors线程的例子中,若共有5台机器,则设置共有25个worker,则每台机器上有5个worker;对于45个线程,每台机器上有15个;这样一平均,则每个worker进程中有3个executors线程。
(这是我自己的看法,大家可以试一下。我感觉如果负载均衡了会更有利于大型集群的运算处理。)
(7)当集群中数据量比较大时,则最好能设置spout中的等待处理的数据量的大小。当集群中等待的数据量比较大时,也就是数据发送比较快,但是处理太慢。这个时候应该阻止spout的发送,否则可能会导致系统队列爆掉。因此,设置以下:
conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 10000);//设置一个spout task上面最多有多少个没有处理的tuple(没有ack/failed)回复,以防止tuple队列爆掉
--------------------- 本文来自 shuaiokshuai 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/shuaiOKshuai/article/details/38365279?utm_source=copy