记一次处理bug经历

    这次问题设计组件稍复杂,这里大致说一下,我是做过车信息查询的。负责大数据模块,有另外一个组专门负责卡口,数据是由他们从各卡口抽取,然后插入到hbase中。再通过协处理器,将数据在写进hbase之前发送到AMQ消息队列,然后再消费建立solr索引,架构基本就是这样的。

    基于这个,在元旦前后,数据出现点小问题。在元旦前高速卡口上的数据都是可以通过solr查询到的,而元旦之后的数据无法查询到的。当时发现问题时我们自信的认为肯定是抽数据那块出现问题了,后来经查,高速卡口的数据确实抽取到数据了。然后我们逐个组件查找问题,首先我们从hbase开始。由于抽数据那边不确却的知道具体是那些数据丢失,只知道卡口有个编号这些编号都属于高速上的,给我们查询带来一些不便。我首先想到一个简便的方法查询,就是通过hive建一个外部表然后映射到hbase中我需要查询的表,这里可以选择新的只用映射几个我需要知道的字段。

    映射语句如下:

CREATE EXTERNAL TABLE xx(
rowkey string, 
aa string, 
bb string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "
:key,
cf:aa,
cf:bb")
TBLPROPERTIES("hbase.table.name" = "table");

    然后,我们就可以通hive很容易就查出我们需要的数据。

    在hbase这确实查到有高速卡口的数据。然后我们有想到,消费AMQ中数据的程序是我们自己写的,可不可能是在消费的时候出现问题。经查看我们消费程序的日志,没有异常日志。为了确认不是在消费这个节点上出现问题,我现场在代码中加入一个条件,如果遇到高速卡口的数据就日志打印出来。重启消费程序后,验证结果是始终没有高速卡口的数据出现。

    至此基本把问题缩小到协处理器和AMQ上。当时当时负责协处理器的同事当时不在,一时半会也无法通过代码验证。然后只有硬着头皮先去查看协处理器的日志,这一看日志,果真发现有问题,发现我们RS有一节点上的日志中有协处理器的几条日志,日志是我们自己定义的,大致意思就是协处理器在region上没有挂载成功。问题是找到了,当时该如何解决。继续在日志里面查找,发现有报找不到类的异常,缺少AMQ的jar包,因为协处理器中是把数据发送到AMQ的,所以需要AMQ相关的包连接AMQ。然后我们添加上AMQ相关包,重启该节点上的RegionServer,OK了,solr中能查到高速卡口的数据。

    至此问题解决了,通过这次查找问题,一个是经验积累。另一方面也明白了,规范的重要性,之所有出现这样的情况时因为,元旦前添加了个节点,也就是出问题的节点。我们有添加节点的文档,但是很零散。一旦有遗漏就是给自己挖了一大坑,所以把流程规范是不可或缺的。



转载于:https://my.oschina.net/u/1240328/blog/599693

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这次的文章标题原本想叫《一次因错用HashMap造成的生产BUG》,但作者觉得这个标题可能会让人联想到某些Java公众号写的标题党文章,所以改成了现在这个标题。在文章中,作者承认在A接口中将所有产品都放到HashMap中并不太规范,但在实际实现中是可行的,所以并不算是“错用”。然而,作者在写代码时疏忽了缓存的问题,忽视了HashMap在多线程环境下不能使用的要求,结果写出了有BUG的代码。 作者从这次线上BUG中学到了几个教训:首先,在使用直接存放对象引用的内存缓存时,要注意不要修改从缓存中获取的内容;其次,在修改代码时,要全面考虑前后逻辑,思考修改的后果;再次,不要困于思维陷阱,在寻找问题时不一定问题出在前面的代码;最后,遇到解决不了的问题时,寻求帮助是很重要的,领导在几分钟内就发现了作者几个小时都没找到的BUG问题出现在addDisplayStyle()方法中。当有多个APP请求A接口时,业务线程执行到product.put("displayStyle", displayStyle)这行代码时,实际上是在往同一个Map中放入元素。由于key相同,就会发生哈希冲突。如果此时某个Map的元素个数达到了扩容条件,就会触发扩容,并有可能出现链表成环的情况。当有新的请求到来时,工作线程执行到recommends = deduplicateAndGetFirstN(recommends, 3)这行代码。 综上所述,这次的文章是关于作者经历一次因错用HashMap而导致生产BUG经历。作者从中学到了关于使用缓存、修改代码、寻找问题和寻求帮助等方面的教训。问题出现在addDisplayStyle()方法中,当多个APP请求A接口时,可能会触发HashMap的扩容并导致链表成环的情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值