Storm优化心得

  1. 将storm的消息打包后发送将极大的提升storm的吞吐量,减少emit次数 单机环境下平均每多一次emit,速率降低6%
  2. 设定一个合理的spout的ack等待队列的长度 通过topology.max.spout.pending进行配置大小
    当pending满时,spout将不会再向bolt发射数据,防止雪崩的发生
  3. 设置合理的executor的传输配置 topology.transfer.buffer.size=32
    topology.executor.receive.buffer.size=16384
    topology.executor.send.buffer.size=16384
    http://www.michael-noll.com/blog/2013/06/21/understanding-storm-internal-message-buffers/
    这篇文章有较好的说明
  4. 配置合理的jvm参数 storm的topology默认只给768M的最大容量,实际生产环境中可能不够 应该设置合理的新生代和老年代大小,尽可能的减少全局gc 当storm分配的内存过大时(比如8G),可以使用cms回收器进行回收 远程调试storm和jmx监测
    由于可能会有多个拓扑运行在storm上所以通过直接指定端口的方式会造成端口占用的问题 解决方法有两个
    1) 直接修改storm.yaml
    加入 需要重启nimbus worker.childopts: “-Xmx1024m
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.port=1%ID%
    storm api中的注释:

    /*
    The jvm opts provided to workers launched by this supervisor. All “%ID%”, “%WORKER-ID%”, “%TOPOLOGY-ID%”
    and “%WORKER-PORT%” substrings are replaced with:
    %ID% -> port (for backward compatibility),
    %WORKER-ID% -> worker-id,
    %TOPOLOGY-ID% -> topology-id,
    %WORKER-PORT% -> port.
    */
    2) 通过在topology的config中配置topology.worker.childopts为需要的jvm参数 对于一些System.properties也是通过这个方法设置,这个不需要重启storm,
    注意topology中设置worker.childopts并不会生效,中topology的main方法中进行System.setProperty也是无效的,必须通过这种方式进行设置

  5. storm的监测和指标 storm虽然可以开jmx,但是你无法从中抓取到任何信息,你可以通过storm
    ui给出的RESTful接口来获取所有bolt的信息 storm
    ui本质上是调用了nimbus给出的接口,理论上直接通过nimbus也能获取数据 但是不方便
    https://github.com/apache/storm/blob/master/docs/STORM-UI-REST-API.md
    同时你可以通过编写Metric的方式来监测你想要的特定的应用内的指标
    http://blog.csdn.net/desilting/article/details/22798693 此外可以通过
    config.registerMetricsConsumer自定义监测记录以何种形式输出
    可以通过实现IMetricsConsumer接口的方式自定义输出方式 比如jmx
  6. 滑动窗口的实现 TickTuple的原理是bolt的config中配置了
    conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS,
    emitFrequencyInSeconds); 后系统每隔一段时间都会从__system component发射一个tuple过来
    但是如果对时间点上有严格要求 可以模拟TickTuple的方式写一个TickSpout定时发射tick给你想要定时发数据的bolt
    目前项目中使用了quartz做了TickSpout达成了整点定时调度的功能
  7. 适量增加并发度 但不是越多越好 配置过多的并发度会增加cpu上下文切换开销 一般来说 对于调用次数比较多的bolt
    并发度不应该超过每台物理机上cpu的核心数 需要根据实际情况进行修改
  8. 注册kryo对象提升序列化速率 理论上可以通过 config.registerSerialization(class);
    方法注册一些自定义的对象,storm默认使用kyro序列化方案,预先注册对象将会带来一些性能上的提升 不够大多数时候序列化并不是瓶颈
  9. 使用hook进行一些纪录和额外操作
    通过配置topology.auto.task.hooks可以在各个bolt的传输之间增加钩子,可以通过钩子实现一些诸如日志纪录等全局内容,不过对emit的性能有一定影响
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值