文档章节

大白话twitter storm效率

book
 book
发布于 2014/05/08 09:21
字数 1563
阅读 7.8K
收藏 70

前提

    能单进程搞定就不要分布式,分布式毕竟带来很多开销,系统也复杂不止一个等级,性能当然没有单进程的给力

到底要不要用分布式系统

    基于前提的描述,如果服务单进程内无法搞定,不得不用分布式解决方案,这个时候我们需要考虑分布式解决方案,分布式这概念大家都懂,这里详细说下storm效率问题

storm效率如何

    如果要谈storm只顾效率的话,似乎过于偏颇,毕竟storm带给我们的不只这一点,其优势很多很多。

    真要谈效率的话我们不妨从以下两方面着手:数据处理和数据传输。

数据处理方面

    storm框架本身不负责你的业务处理,所以这块其实和自己开发的代码的业务处理效率息息相关,在充分理解各业务(bolt)到底是io密集型还是cpu密集型的情况下,合理的分配storm集群资源,具体到每个bolt的线程数,task数,spout task的pending数等。所以这部分总结一句话就是数据处理效率不和storm发生关系!

数据传输方面

    关注三个关键词,单线程、disruptor、zeroMq,在storm中数据传输包括进程内和进程外,进程内数据传输采用disruptor,这个的效率大家可以到网上了解下,资料已经比较多了,而且原代码量也不是很大,有兴趣的可以读读源代码,我们需要关注的是多少tuple一打包交给executor和disruptor的waitcategory。对于进程外,需要关注的稍多一些,storm中进程间数据传输采用zeroMQ,效率同样很可观,另外对于传输的数据需要序列化,storm默认序列化支持java serialization和kryo,对数据的序列化可以自己进行调整,另外每个进程中分别有且仅有一个线程用于数据的传送,假如单进程内开启了过多线程势必会对传输线程造成影响,得不到充分调用也是有可能的。这部分之前测试看,KM的网络,普通pc机网络上行/下行可以分别达到80M,所以总结一句话这方面storm的效率也比较可观!

如何优化topology

  1.  尽量细分spout/bolt,使其更贴近分布式,对不同的component灵活分配资源。

  2. 对于grouping,尽量采用localgrouping,经测试观察,storm默认scheduler是对每个component从worker1轮训分配到workerN,这里假如有三个worker,bolt1可以是3*N个线程,这样bolt1是平均分配到各worker上的,其余bolt也这样处理,这时我们使用localgrouping可以实现数据尽量在进程内传输,降低网络带来的开销。

  3. spout端,假如在topology中,处理瓶颈在spout端,而且你又不能增加spout的数量,可以试试修改spoutWaitStrategy,默认waitstrategy是sleep(1ms),如果嫌这个也慢,不妨试试yield(),当然会带来一定的cpu压力。

  4. 让spout nextTuple()尽量简单,没有阻塞,没有处理逻辑,直接取数据emit就好

  5. 另外推荐这篇:storm topology 一种优化思路

工作案例分析

    用事实说话,我们的服务有个场景,消息进入系统后需要保证其时序性,也就是说消息进来的顺序是1,2,3,出去的时候也要1,2,3   虽然很长一段时间对这个需求非常排斥,觉得这需求完全和分布式是相悖的,那如果硬要在分布式场景下解决只能硬头皮上了。下面详细介绍下调优的过程,假设过程中机器资源一定,topology的worker数量为3。

    首先凭直觉,设定各bolt的executor和task数,待topology启动后,在ui界面中我们可以观察到几个关键参数,即每bolt的execute latency和ack latency,通过这几个关键参数我们可以基本定位到topology的瓶颈,然后回头对bolt的executor和task数进行设置,使个bolt的处理效率基本平衡,不至于导致某个bolt成为系统的瓶颈。调整后处理效率大概能到8K/S

    然后通过dstat观察pc机负载情况,发现cpu还有很大富余,因为topology中有服务需要访问网络资源,所以会有阻塞,所以适当调整worker的executorPool大小,(storm中默认pool大小等于物理核数),调整后处理效率又有了提高能到1W/S

    前面说过这个场景需要保证消息的时序性,所以我们的topology中有一个单线程单task的sortbolt,用于将前面乱序的消息排序进行输出。这里还要提一下,原始的消息是zip消息,然后unzipbolt会解包,将小消息发送给后面业务bolt进行分布式处理(不关心消息顺序),交给sortbolt进行排序,交给zipbolt打包,交给sendbolt发送到queue。第一条中提到可以根据ui调整各bolt的executor数和task数,假如bolt1线程数是3,而bolt2的线程数是2,这样就造成bolt1和bolt2间消息顺序性乱序比较严重,再交给sortbolt进行排序时,导致很多线程的唤醒都没做具体工作,所以现在的目标是尽量缓解bolt间消息乱序情况,我们采用各bolt尽量在每worker上都有,然后让这个worker上的bolt消息传输采用localgrouping,不通过网络,同时也减少了worker间单线程传输导致的消息汇聚与分散带来的乱序,这样处理后效率又有了很大的提高,大概到了1.5W/!


jerry 于 2014年5月8号下午

© 著作权归作者所有

book

book

粉丝 41
博文 22
码字总数 15217
作品 2
海淀
高级程序员
私信 提问
加载中

评论(3)

imarchuang
imarchuang
你好,特别感兴趣你写的东西。也拜读了你的“storm topology 一种优化思路”。
能否把你这篇里讲到的《工作案例分析》的source code 分享一下?我正在做一个关于自动优化配置bolt的线程数,task数,spout task的pending数等的项目。
感谢
book
book 博主

引用来自“南湖船老大”的评论

换下字体和大小吧,看着真心难受
好的
南湖船老大
南湖船老大
换下字体和大小吧,看着真心难受
Apache Storm 的历史及经验教训

Apache Storm 最近成为了ASF的顶级项目,这对于该项目和我个人而言是一个重大的里程碑。很难想像4年前Storm只是我脑海中的一个想法,但现在却成为了一个有着大社区支持并被无数企业使用的繁荣...

run_mei
2014/10/14
1.2W
10
使用 Twitter Storm 处理实时的大数据

使用 Twitter Storm 处理实时的大数据 流式处理大数据简介 IBM DW/M. Tim Jones, 独立作家, 顾问 简介: Storm 是一个开源的、大数据处理系统,与其他系统不同,它旨在用于分布式实时处理且与...

IBMdW
2012/12/06
6.4K
3
Apache Storm 0.9.7 发布,分布式实时计算

Apache Storm 0.9.7 发布了,Apache Storm 的前身是 Twitter Storm 平台,目前已经归于 Apache 基金会管辖。 Apache Storm 是一个免费开源的分布式实时计算系统。简化了流数据的可靠处理,像...

开源中国股侠
2016/09/08
818
1
Twitter Storm入门

.通过学习tutorial了解storm的整体架构(https://github.com/nathanmarz/storm/wiki/Tutorial) 通过学习Concepts了解storm的关键概念(https://github.com/nathanmarz/storm/wiki/Concepts......

加油_张
2013/09/14
361
0
Twitter Storm Ubuntu 单机安装

第 121 章 Twitter Storm 目录 121.1. 单机版121.2. lein 安装 121.1. 单机版 操作系统环境:Ubuntu 13.04 KVM虚拟机 安装 storm 涉及到安装以下包:python、zookeeper、zeromq、jzmq、storm...

netkiller-
2013/08/02
2K
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一名程序员找到一份java的工作需要学习哪些知识?

首先是Javase作为Java最基本的学习内容,不在多说。 然后是掌握JavaScript的基本原理,因为做Java编程开发必须学会JavaScript,用到JavaScript非常多,但是现在很多公司是不用去写原生的Jav...

Java天天
32分钟前
49
0
.shash登录ssh登陆[关闭]

当我进入运行Hardy 8.04的ubuntu-box时,我的.bashrc中的环境变量没有设置。 如果我做一个源.bashrc,变量是正确设置的,一切都很好。 为什么.bashrc不会在登录时运行? #1楼 我有像霍布豪斯...

javail
33分钟前
65
0
uni-app实战:1、万年历

踩坑注意事项: 1、pages.json 文件信息改变后要重新编译下,否则不展示效果 2、uni-app 组件支持的生命周期,与vue标准组件的生命周期相同。这里没有页面级的onLoad等生命周期 编辑中。。。...

轻轻的走过
40分钟前
56
0
​零基础入门深度学习(九):目标检测之常用数据预处理与增广方法

课程名称 | 零基础入门深度学习 授课讲师 | 孙高峰 百度深度学习技术平台部资深研发工程师 授课时间 | 每周二、周四晚20:00-21:00 01 导读 本课程是百度官方开设的零基础入门深度学习课程,主...

飞桨PaddlePaddle
41分钟前
51
0
github 配置 travis 自动发布 release

参考 https://www.jianshu.com/p/807f8c989679 https://docs.travis-ci.com/user/deployment/releases/ 创建 key 在travis 设置key, 用于访问github 配置文件中使用 $API_KEY 填充 language......

阿豪boy
43分钟前
87
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部