摘要:本文主要讲了笔者使用Strom中的一些优化建议

1、使用rebalance命令动态调整并发度

Storm计算以topology为单位,topology提交到Storm集群中运行后,通过storm rebalance 命令可对topology进行动态调整。

比方添加Topology的worker数,改动Bolt。Spout的并行运行数量 parallelism等,从而实现topology的动态调整,达到弹性计算的目的。

(当然调整时要配合监控模块)

基本上主要有两种使用方法:
1) storm rebalance topology-name -n new-work-num,
调整指定topology的worknum。
2)storm rebalance topology-name -e component=parallelism
调整指定topology中指定component的并行数量.

注:Jstorm不提供这个功能

2、使用tick消息做定时器

使用Storm组件的定时器须要为bolt重写以下的方法:
public Map<String, Object> getComponentConfiguration() {
Map<String, Object> conf = new HashMap<String, Object>();
conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 60);//每60s持久化一次数据
return conf;
}
当中:Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS 定时消息发送的频率。单位为秒。

我们推断是否为tick消息。

能够使用TupleHelpers类中的isTickTuple方法,详细代码:
public static boolean isTickTuple(Tuple tuple) {
return tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID) && tuple.getSourceStreamId().equals(
Constants.SYSTEM_TICK_STREAM_ID);
}

3、使用组件的并行度取代线程池

道理很easy,通过给bolt/spout 设置parallelism。而不是在bolt/spout设置线程池。

这样能够避免一个组件将一台机器资源耗尽。

4、不要在Spout中处理耗时操作

Spout都是单线程的,假设太多的耗时操作就在这里,那么整个程序的处理吞吐量就会下降。并且假设nextTuple方法很耗时,那么消息会成功运行完毕后,Acker给Spout发送消息。Spout假设无法及时消费,可能造成Ack消息超时丢弃。然后Spout就觉得这个消息运行失败

5、单个spout/bolt中做一件事

每个spout/bolt仅仅做一件事,比方消息的第一次清洗放在spout,接下来的计算放在bolt。再接下来计算结果入库再放到一个bolt,将整个任务串连多个spout/bolt起来。而不是单独的放在一个组件中。这样才干最大使用集群的资源。也好方便对一个单独的组件进行调优

6、注意fieldsGrouping的数据均衡性

Strom中有6种fields方法。fieldsGrouping是按字段进行分组.通过合理的设置。确实各个Bolt/spout接收的消息都比較均衡。避免单个节点机器处理大量数据,这样耗时又耗机器。这里就涉及到一个field字段的选择。

7、优先使用LocalOrShuffleGrouping

数据首先优先选择本节点上的bolt处理,降低不必要的传输数据。其他Storm Grouping例如以下,

Shuffle Grouping :随机分组,尽量均匀分布到下游Bolt中
将流分组定义为混排。

这样的混排分组意味着来自Spout的输入将混排,或随机分发给此Bolt中的任务。shuffle grouping对各个task的tuple分配的比較均匀。
Fields Grouping :按字段分组,按数据中field值进行分组;同样field值的Tuple被发送到同样的Task
这样的grouping机制保证同样field值的tuple会去同一个task,这对于WordCount来说很关键,假设同一个单词不去同一个task,那么统计出来的单词次数就不正确了。“if the stream is grouped by the “user-id” field, tuples with the same “user-id” will always go to the sae task”
All grouping :广播
广播发送, 对于每个tuple将会拷贝到每个bolt中处理。
Global grouping :全局分组,Tuple被分配到一个Bolt中的一个Task,实现事务性的Topology。
Stream中的全部的tuple都会发送给同一个bolt任务处理,全部的tuple将会发送给拥有最小task_id的bolt任务处理。

None grouping :不分组
不关注并行处理负载均衡策略时使用该方式。眼下等同于shuffle grouping,另外storm将会把bolt任务和他的上游提供数据的任务安排在同一个线程下。
Direct grouping :直接分组 指定分组
由tuple的发射单元直接决定tuple将发射给那个bolt。普通情况下是由接收tuple的bolt决定接收哪个bolt发射的Tuple。这是一种比較特别的分组方法,用这样的分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。

仅仅有被声明为Direct Stream的消息流能够声明这样的分组方法。并且这样的消息tuple必须使用emitDirect方法来发射。

消息处理者能够通过TopologyContext来获取处理它的消息的taskid (OutputCollector.emit方法也会返回taskid)。

8、不是全部场景都要使用ACK机制

假设说处理的消息每天都有上亿,消息丢失个几百几千事实上对计算结果的影响是很小的。先说一下ACK机制:

 为了保证数据能正确的被处理, 对于spout产生的每个tuple, storm都会进行跟踪。这里面涉及到ack/fail的处理,假设一个tuple处理成功是指这个Tuple以及这个Tuple产生的全部Tuple都被成功处理, 会调用spout的ack方法;假设失败是指这个Tuple或这个Tuple产生的全部Tuple中的某一个tuple处理失败, 则会调用spout的fail方法;
在处理tuple的每个bolt都会通过OutputCollector来告知storm, 当前bolt处理是否成功。

另外须要注意的。当spout触发fail动作时,不会自己主动重发失败的tuple,须要我们在spout中又一次获取发送失败数据,手动又一次再发送一次。
Ack原理

  Storm中有个特殊的task名叫acker,他们负责跟踪spout发出的每个Tuple的Tuple树(由于一个tuple通过spout发出了,经过每个bolt处理后,会生成一个新的tuple发送出去)。当acker(框架自启动的task)发现一个Tuple树已经处理完毕了。它会发送一个消息给产生这个Tuple的那个task。
Acker的跟踪算法是Storm的主要突破之中的一个,对随意大的一个Tuple树,它仅仅须要恒定的20字节就能够进行跟踪。
Acker跟踪算法的原理:acker对于每个spout-tuple保存一个ack-val的校验值,它的初始值是0,然后每发射一个Tuple或Ack一个Tuple时,这个Tuple的id就要跟这个校验值异或一下。并且把得到的值更新为ack-val的新值。那么假设每个发射出去的Tuple都被ack了,那么最后ack-val的值就一定是0。

Acker就依据ack-val是否为0来推断是否全然处理,假设为0则觉得已全然处理。

使用IBasicBolt接口实现自己主动确认

为了简化编码,Storm为Bolt提供了一个IBasicBolt接口。它会在调用execute()方法之后正确调用ack()方法,BaseBasicBolt类是该接口的一个实现,用来实现自己主动确认

9、尽量抽取公用的处理部分到一个组件

比方说存储到数据库的动作。

能够尽量都使用同个bolt来写。管理好线程池

10、合理设置work数目

work数目并非越多越好。还要看你的数据和你的处理逻辑。这个普通情况下能够重复调整參数来确定最优。能够通过查看页面上的各个bolt/spout处理消息的耗时,资源使用情况来确定

11、GC參数优化

对每个work的jvm參数进行调整。推荐生产使用parNew+CMS垃圾回收方式。

上面就是笔者自己的一些总结,希望对你有帮助。

Strom优化指南的更多相关文章

  1. 阿里无线前端性能优化指南 (Pt.1 加载优化)

    前言 阿里无线前端团队在过去一年对所负责业务进行了全面的性能优化.以下是我们根据实际经验总结的优化指南,希望对大家有所帮助. 第一部分仅包括数据加载期优化. 图片控制 对于网页特别是电商类页面来说,图 ...

  2. 移动H5前端性能优化指南

    移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...

  3. GCC 编译优化指南(转)

    GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...

  4. web前端性能优化指南(转)

    web前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网络 ...

  5. 【转载】Spark性能优化指南——高级篇

    前言 数据倾斜调优 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 查看导致数据倾斜的key的数据分布情况 数据倾斜的解决方案 解决方案一:使用Hive ETL预处理数 ...

  6. 【转载】 Spark性能优化指南——基础篇

    转自:http://tech.meituan.com/spark-tuning-basic.html?from=timeline 前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能 ...

  7. Mina架构与优化指南

    MINA架构 这里,我借用了一张Trustin Lee在Asia 2006的ppt里面的图片来介绍MINA的架构. Remote Peer就是客户端,而下方的框是MINA的主要结构,各个框之间的箭头代 ...

  8. 移动端网站优化指南-WAP篇

    转载:http://seofangfa.com/mobile-seo/mobile-seo-guide.html 1.域名优化:启用短域名,例如:m.abc.com,便于用户记忆,方便搜索蜘蛛查找,减 ...

  9. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

随机推荐

  1. phpunit Cannot redeclare class PHPUnit_Runner_Version

  2. Xilinx Platform Usb Cable

    Key Features High-performance FPGA configuration and PROM/CPLD programming Includes innovative FPGA- ...

  3. 修改WampServer的默认端口

    WampServer默认的安装端口是80,容易和已安装的ISS等其他服务冲突,导致WampServer无法启动. 无法启动的现象如下: 1.apache服务无法启动.问题所在:80端口冲突. 2.在浏 ...

  4. AMD64 Instruction-Level Debugging With dbx

    http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/amd64-dbx-364568.html A ...

  5. Leptonica在VS2010中的编译及简单使用举例

    在tesseract-ocr中会用到leptonica库.这里对leptonica简介下. Leptonica是一个开源的图像处理和图像分析库,它的license是BSD 2-clause.它主要包括 ...

  6. 给.DLL文件加一个数字签名的方法

     给.dll文件加一个数字签名的方法 效果如图所示:   做法: 下载数字签名工具包:http://files.cnblogs.com/babyt/SignTool.rar  /Files/JavaC ...

  7. WaitForSingleObject和CEvent用法

    WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将 ...

  8. selenium3+python自动化50-环境搭建(firefox)

    前言 有不少小伙伴在安装selenium环境后启动firefox报错,因为现在selenium升级到3.0了,跟2.0的版本还有有一点区别的. 安装环境过程中主要会遇到三个坑: 1.'geckodri ...

  9. 读书笔记之:C语言深度剖析

    读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中 ...

  10. 【BZOJ】【2527】【POI2011】Meteors

    整体二分+树状数组 整体二分……感谢zyf提供的入门题 简单粗暴的做法:枚举每一个国家,二分他的$w_i$,然后计算……然而这样效率很低…… 整体二分就是:对所有的国家一起进行二分,$w_i$在mid ...