共计 1021 个字符,预计需要花费 3 分钟才能阅读完成。
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 资源。
一种基于 Storm 的可扩展即时数据处理架构思考 http://www.linuxidc.com/Linux/2015-07/120511.htm
Storm 如何分配任务和负载均衡?http://www.linuxidc.com/Linux/2015-07/120466.htm
Storm 进程通信机制分析 http://www.linuxidc.com/Linux/2014-12/110158.htm
Apache Storm 的历史及经验教训 http://www.linuxidc.com/Linux/2014-10/108544.htm
Apache Storm 的详细介绍 :请点这里
Apache Storm 的下载地址 :请点这里
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-08/121568.htm