• 【转载】Storm TickTuple 意外停止


    原文链接转自:http://woodding2008.iteye.com/blog/2328114


    Storm的滑动窗口TickTuple通常用来控制bolt定制执行入库操作,使用过程中遇到了TickTuple“意外停止”的情况。

    场景描述

    Jiaodian任务共计使用12个worker,tick tuple间隔为5分钟。

    WebPvLogSpout & WebPvLogBolt的executor数量为12.

    WebPvLogSpout消费kafka topic,log_product_ypvlog共计10个partition

    6月14号下午启动,次日凌晨1点35分之后,有2个bolt就收不到tick tuple。

    生产tickTuple消息的线程【user-timer】由于disruptor的原因,一直处于挂起状态。

    Java代码  收藏代码
    1. "user-timer" daemon prio=10 tid=0x00007f8ea8ac7000 nid=0x353c runnable [0x00007f8e29662000]  
    2.    java.lang.Thread.State: TIMED_WAITING (parking)【处于挂起状态,一致等待信号激活自己,正常情况应该处于sleeping状态】  
    3. at sun.misc.Unsafe.park(Native Method)  
    4. at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:349)  
    5. at com.lmax.disruptor.AbstractMultithreadedClaimStrategy.waitForFreeSlotAt(AbstractMultithreadedClaimStrategy.java:99)  
    6. at com.lmax.disruptor.AbstractMultithreadedClaimStrategy.incrementAndGet(AbstractMultithreadedClaimStrategy.java:49)  
    7. at com.lmax.disruptor.Sequencer.next(Sequencer.java:127)  
    8. at backtype.storm.utils.DisruptorQueue.publishDirect(DisruptorQueue.java:174)  
    9. at backtype.storm.utils.DisruptorQueue.publish(DisruptorQueue.java:167)  
    10. at backtype.storm.disruptor$publish.invoke(disruptor.clj:66)  
    11. at backtype.storm.disruptor$publish.invoke(disruptor.clj:68)  
    12. at backtype.storm.daemon.executor$setup_ticks_BANG_$fn__6510.invoke(executor.clj:315)  
    13. at backtype.storm.timer$schedule_recurring$this__1807.invoke(timer.clj:99)  
    14. at backtype.storm.timer$mk_timer$fn__1790$fn__1791.invoke(timer.clj:50)  
    15. at backtype.storm.timer$mk_timer$fn__1790.invoke(timer.clj:42)  
    16. at clojure.lang.AFn.run(AFn.java:24)  
    17. at java.lang.Thread.run(Thread.java:745)  

    问题分析

    包装后的kafka客户端会让分配不到partition的spout一直阻塞[ArrayBlockingQueue.take()]

    user-timer多个小时的jstack信息,都是TIMED_WAITING (parking),其他worker的状态是sleeping。

    spout几个小时一直阻塞,由于spout接收队列会被metrics and system stream塞满,一直得不到处理,会导致TickTuple消息无法放入到队列,这就导致了user-timer线程一直挂起,等待被唤醒。

    解决方案

    将spout的数量设置为kafka topic的partition相等的数量,实际上是不让spout长时间的处于阻塞状态。

    官网issues

  • 相关阅读:
    查询手机内联系人
    加载媒体库里的音频
    用ContentProvider获取通讯录联系人
    TensorFlow学习笔记:保存和读取模型
    如何「优雅」地标数据
    Bagging, Boosting, Bootstrap
    3D中的旋转变换
    PCA算法浅析
    SQL Server数据库邮件配置
    浅谈checkpoint与内存缓存
  • 原文地址:https://www.cnblogs.com/dongxiao-yang/p/6019479.html
Copyright © 2020-2023  润新知