Storm开发过程中的问题与建议
转自:http://blog.csdn.net/ouyang111222/article/details/50061305
(一) topology层级建议设不要设置过多
storm讲究是流式计算,spout发送数据,下游的bolt处理数据,数据的处理计算就像流水线作业一样,每一个节点完成特定的工序;但是这种流水作业的深度不易过长,比如节点A对数据进行split操作,节点B对split之后的数据进行filter过滤,这两个节点完全可以合并在一起。如果topology层级过多,消耗的资源多;节点多,丢数据的风险增大;增加处理事件的环节,不利于排错;
建议:topology的层级控制在5级以下。
(二) 合理使用shuff规则
storm中组件之间流的连接、分组关系有7种:Shuffle Grouping(随机分组)、Fields Grouping(按字段分组)、All Grouping(广播分组)、Global Grouping(全局分组)、Non Grouping(不分组)、Direct Grouping(直接分组)、Local or Shuffle Grouping(本地/随机分组)。其中常用的有:Shuffle Grouping(随机分组)、Fields Grouping(按字段分组)与Local or Shuffle Grouping(本地/随机分组)
Shuffle Grouping:随机分发,它对各个task的tuple分配的比较均匀;
Fields Grouping:它保证相同field值的tuple会去同一个task,比如storm提供的例子中wordcount必须保证相同的元素到同一个task,这时候必须用fields frouping,否则统计出来的数据是不对的;
Local or Shuffle Grouping:如果传送数据的task和接受数据的task在同一个进程之上,那么数据的传输走的是线程之间的通信,否则与shuff grouping类似,因此一般来说local or shuff grouping的性能是优于shuff grouping的(ps:worker内部传输只需要Disruptor队列就可以完成,不用网络开销和序列化开销,shuff grouping所有的数据传输走netty)
是不是说,local or shuff grouping就完美了呢?来看看一个例子,用local or shuff grouping,我开了80个线程,其中有一半的线程的excute 和emit量在2000多,而另一半excute和emit的量在13000左右,结果导致量大的线程的capacity较高,部分由于内存耗尽,worker重启
(三) 使用fieldgrouping导致的数据倾斜问题
使用filedgrouping经常会出现数据倾斜的问题,就是部分线程接收的数据很多,而其他的很少。举个例子,11.11来了,某APP商家统计实时PV,假设安卓在线用户1000万,ios用户10万,现在用app_client做fieldgroup,就会出现这种情况!
怎么办?当让解决的思路很多,单原则都是一样:尽量让它们离散。我们可以app_client+app_version+province,也就是从多级多维度的角度出发,尽量使filed离散。
(四) worker数不是越多越好
worker数并不是越多越好!
每增加一个worker进程,都会讲一些原本线程之间的通信变为进程之间的网络通信,这些进程间的网络通信海需要进行序列化和反序列化操作,这些都会降低吞吐量;另外每增加一个worker进程都会额外增加多个线程(netty发送和接受的线程、心跳线程、systembolt线程以及其他系统组件对应的线程等),这些线程都会消耗系统资源,在系统资源受限的情况下,将降低业务线程的使用效率。
在task保持不变的情况下,worker减少,由于在计算过程之间不同task之间需要切换,worker较少的情况下,进程之间的切换加大,降低了吞吐量,同时worker太少,那么部署的物理节点有限,也限制了整体的性能。
(五) 数据落地视情况考虑批量写入
在很多的场合下,bolt在处理数据落地时如果来一条数据就进行数据存储或者读写是极其耗性能的,特别是在数据量大的情况下,所以一般该场合建议批量写入(读入),策略一般为定时+定量,如下为定时与定量结合的流程:
dataCache(message);//将消息放入内存dataCache
long now = System.currentTimeMillis();
if (now - lastUpdateTime > interval
|| dataCache.size() >= writeSize) {//如果到达了特定的时间或者内存的大小超过了设定的限制
doPersist();//写入数据库(hbase、redis、mysql等)
lastUpdateTime = now;
dataCache.clear();//清空内存
}
collector.ack(input);
return;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
(六) 优化excute
尽可能优化excute的代码,减少excute的执行时间:
1.excute少打info级别的日志,去掉system.out.println()等
2.慎用加锁
3.try catch比较消耗性能
4.一些大对象在使用完后建议设置为null
(七) 关于Ack
在启用Ack的情况下,每个处理的tuple,必须被ack或者fail,因为storm追踪每个tuple要占用内存,所以如果你不ack/fail每一个tuple,那么最终你会看到OutOfMemory错误(关于storm的ack机制和rotaingmap在ack中应用将会在后续的博文中进行解析)。
(八) 关于Storm UI的使用与调试
几个参数的含义
Excute latency:消息的平均处理时间,单位为ms
Process latency:消息从收到到被ack掉所花的时间,单位ms(如果没有启用acker机制,那么该值为0)
Capacity:capacity=bolt调用excute方法处理的消息数量*消息的平均时间/时间区间。ps:在王新春的《storm技术内幕与大数据实践》一书中是这样说的,如果capacity这个值越接近1,说明bolt基本一直在调用execute方法,因此并行度不够,需要扩展这个组件的Executor数量。其实,我认为,这有一点以偏概全,capacity这个参数过高有很多的情况,并不一定是thread数量不够。查看可视化的topology图,利用颜色查看任务的健康程度
蓝色表示输入员spout,bolt的颜色从绿色变化到红色,红色的程度表示bolt的健康程度,越红出问题的可能性越大,如下为一个正常的topology:
如下为一个非正常的topology,值得关注与优化:
查看worker是否重启
查看worker是否重启,首先查看topology的updateTime:
再进入每一个spout或者bolt,点击“Updatetime”,按照时间顺序排序,我们发现红色部分的时间与topology的updatetime相差甚多,那么对应的worker发生了重启,需要关注背后的问题,如内存溢出导致worker重启等。
4 部分节点excute数与emit数较少现象
上面所说的数据倾斜的现象就是情况之一,当然也可能有其他的原因。
5 capacity较大与处理时间较长
这种情况可以在细分为两种情况
(1)每个节点的capacity都很高
一般来说,capacity高相应的处理时间也比较长,通常情况是线程数不够,如果加大线程capacity下降到0.5以下,而处理时间还是很长的话,那就有必要仔细优化一下代码了。
(2)部分节点capacity较大与处理时间较长现象
部分节点capacity较大,而部分capacity很小。这种情形原因可能很多,我之前遇到过这样一种情况:某几个节点的hbase读写时间比较长,几百毫秒甚至几秒,其他节点读写时间正常,最后发现hadoop复用hbase,hadoop与hbase产生资源竞争,解决方法就是hbase拆分,一下子就好了,代码完全不用改。总之,这种情况很多与外界因素介入有关系,如服务器的网络、所用外部中间件或者数据库的性能等等,需要仔细排查。
Storm开发过程中的问题与建议的更多相关文章
- SubSonic3.0 Demo1.0——应用了T4模版可减少开发过程中70%以上的代码量以及80%以上的出错率
应网友的要求,抽了点时间写了这个Demo,希望对2.2版想升级到3.0的朋友或正在使用3.0的朋友有所帮助.大家在使用Demo过程中如果发现什么问题或有什么建议,可以直接将Bug提交给我或告诉我,我会 ...
- Unity项目开发过程中常见的问题,你遇到过吗?
最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...
- 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同
在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...
- asp.net mvc开发过程中的一些小细节
现在做网站用mvc越来越普及了,其好处就不说了,在这里只记录一些很多人都容易忽视的地方. 引用本地css和js文件的写法 这应该是最不受重视的地方,有同事也说我有点小题大作,但我觉得用mvc还是得有一 ...
- 前端在开发过程中怎么提高网站的seo?
前端开发过程中怎么提高网站的seo? 到写这篇博客为止,我还没有做过需要做seo的项目,也不知道怎么前后端合作(我才毕业工作一年左右,往后会多去学习这方面知识的),通过一些配置来提高网站的seo性能. ...
- 一些关于angularJS的自己学习和开发过程中遇到的问题及解决办法
这篇文章也许会不定时更新,主要记录这段时间内自己遇到的angularjs学习开发的一些问题的解决办法.本文以摘抄为主,主要目的还是将自己遇到的困惑在各个地方查到的解决办法的汇总,给自己留个备忘吧. 1 ...
- web开发过程中经常用到的一些公共方法及操作
进化成为程序猿也有段岁月了,所谓的经验,广度还是依旧,只不过是对于某种功能有了多种实现方式的想法.每天依旧不厌其烦的敲打着代码,每一行代码的回车似乎都有一种似曾相识的感觉.于是乎:粘贴复制,再粘贴再复 ...
- 协同开发中SVN的使用建议
协同开发中SVN的使用建议 1. 注意个人账户密码安全 各员工需牢记各自的账户和密码,不得向他人透漏,严禁使用他人账户进行SVN各项操作(主要考虑每个SVN账号的使用者的权限范围问题).如有忘记,请 ...
- Eclipse开发过程中个VM Arguments的设置
Eclipse开发过程中个VM Arguments的设置 1:jre中的Default VM Arguments: -Xms256M -Xmx640M -XX:PermSize=256m -XX:Ma ...
随机推荐
- mac相关记录
一.设置允许安装任何来源软件 命令行执行: sudo spctl --master-disable -----------------------------
- 20145201《Java程序设计》第8周学习总结
20145201 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 通用API 15.1 日志 15.1.1 日志API简介 java.util.logging包提供了日志功 ...
- Linux系统下Git操作命令整理
1.显示当前的配置信息 git config --list 2. 创建repo从别的地方获取 git clone git://git.kernel.org/pub/scm/git/git.git 自己 ...
- 近千节点的Redis Cluster高可用集群案例:优酷蓝鲸优化实战(摘自高可用架构)
(原创)2016-07-26 吴建超 高可用架构导读:Redis Cluster 作者建议的最大集群规模 1,000 节点,目前优酷在蓝鲸项目中管理了超过 700 台节点,积累了 Redis Clus ...
- Which HTTP methods match up to which CRUD methods?
https://stackoverflow.com/questions/6203231/which-http-methods-match-up-to-which-crud-methods Crea ...
- Steema TeeChart Pro VCL FMX 2017.20 Full Suorce在Delphi XE10下的安装
一.首先将压缩包TeeChart Pro VCL FMX 2017.20 FS.rar解压到一个目录,比如 E:\Application\Steema TeeChart Pro VCL FMX 201 ...
- 怎么用Python提取域名中的主域名
从一个域名里面提取主域名,初想起来,貌似很简单,不就是数点[.]的个数吗?取最后一个点前后的字符串,那 abc.txt 是域名吗?那再加个验证,加上国家码,.com,.cn,.org结尾的才算,那这个 ...
- C#470多例winform 界面特效的源码
一共470多例winform 界面特效的源码. 窗体与界面设计... 9 实例001 带历史信息的菜单 10 实例002 菜单动态合并 12 实例003 像开始菜单一样漂亮的菜单.. ...
- Python中有趣的数据结构
链表 链表的基本操作 >>> a = [66.25,333,333,1,1234.5] >>> print a.count(333),a.count(66.25), ...
- power shell添加vim
1.去Vim官网下载适合操作系统的可执行文件 地址:https://www.vim.org/download.php#pc 2.找到Vim文件夹中的vimrc文件进行修改,增加下面这4行. set e ...