Storm中Spout使用注意事项小结
来源:互联网 发布:把枪怎么用手机网络 编辑:程序博客网 时间:2024/05/23 18:37
Storm中Spout用于读取并向计算拓扑中发送数据源,最近在调试一个topology时遇到了系统qps低,处理速度达不到要求的问题,经过排查后发现是由于对Spout的使用模式不当导致的多线程同步等待。这里罗列几点个人觉得编写Spout代码时需要特别注意的地方:
1. 最常用的模式是使用一个线程安全的queue,如BlockingQueue,spout主线程从queue中读取数据;另外的一个或多个线程负责从数据源(如各种消息中间件、db等)读取数据并放入queue中。
2. 如果不关心数据是否丢失(例如数据统计分析的典型场景),不要启用ack机制。
3. Spout的nextTuple和ack方法是在同一个线程中被执行的(可能最初觉得这块不会成为瓶颈,为了简单实现起见就单线程了,jstorm应该是已经改成了多线程),因此不能在nextTuple或ack方法里block住当前线程,这样将直接影响spout的处理速度,很关键。
4. Spout的nextTuple发送数据时,不能阻塞当前线程(见上一条),比如从queue中取数据时,使用poll接口而不是take,且poll方法尽量不要传参阻塞固定时间,如果queue中没有数据则直接返回;如果有多条待发送的数据,则一次调用nextTuple时遍历全部发出去。
5. Spout从0.8.1之后在调用nextTuple方法时,如果没有emit tuple,那么默认需要休眠1ms,这个具体的策略是可配置的,因此可以根据自己的具体场景,进行设置,以达到合理利用cpu资源。
参考 :http://www.cnblogs.com/panfeng412/p/storm-spout-common-issues.html
- Storm中Spout使用注意事项小结
- storm使用中注意事项
- Storm中Spout和Bolt的生命周期
- Storm bolt/spout生命周期
- storm trident 自定义spout
- storm中supervisor, task, worker, spout, bolt之间的关系
- Storm 0.9.0中trident的Spout接口变化
- Storm使用非java语言构建Bolt,Spout
- Kafka+Storm+HBase项目Demo(5)--topology,spout,bolt使用
- Storm——spout,bolt
- 用MapReduce 模拟日志发送,在Storm的Spout中接收UDP数据
- (大数据之storm)strom中worker、task、spout/bolt、executor、component的关系
- Storm 提交拓扑后UI中spout、bolt的Num都显示为0
- Storm之Spout、Bolt、Topology组件
- Storm Trident中的Spout源码解读
- Storm的Spout和Bolt中的方法
- storm-kafka(storm spout作为kafka的消费端)
- storm-[4] -java.lang.NoClassDefFoundError: storm/trident/spout/ITridentSpout
- hibernate一级缓存,二级缓存,三级缓存,缓存算法及配置。
- java环境变量设置
- 十二、Shell数组:shell数组的定义、数组长度
- HDU 1020 Encoding
- android 常用方法总结
- Storm中Spout使用注意事项小结
- Cookie总结
- Largest Number (Java)
- 某移动社交应用服务端架构浅析
- FFmpeg av_seek_frame()参数以及使用
- Dojo TreeGrid 懒加载
- 通用适配器(一)── 适用于 ListView、GridView 的 CommonBaseAdapte(ViewHolder 模式)
- TWMPROXY 代理 REDIS 服务
- 齐次坐标(Homogeneous Coordinates)