[转帖]线上一个隐匿 Bug 的复盘

一个,隐匿,bug,复盘 · 浏览次数 : 0

小编点评

## Summary of the Article **Title:** Unveiling an Implicit Conversion Bug in Hive **Introduction:** The article discusses an overlooked bug encountered during project development. The bug, initially a minor issue, escalated to a critical level due to the large amount of data involved. While it was resolved by addressing the data type mismatch between related tables, the underlying cause revealed a need for a better understanding of implicit conversion rules in Hive. **Problem Analysis:** The bug originated from the business logic used for generating access card return invoices. It involved comparing primary IDs from two tables (t2 and t3) based on an equality condition. However, the t3.primary_id field stored bigint values, which caused a precision loss during the MapReduce calculation. This led to an unexpected association between records, resulting in the exclusion of intended customers. **Solution:** The article outlines two approaches to address this problem: 1. **Explicit Conversion:** Convert all relevant fields to string types before performing the comparison, ensuring strict string matching. 2. **Re-execution:** Reexecute the logic within the appropriate data range, identifying customers who should have received the access card but were not sent. **Conclusion:** The article emphasizes the importance of understanding implicit conversion rules and provides valuable insights for developers and data analysts working with Hive. By analyzing this hidden bug, it highlights the potential consequences of overlooking implicit conversions and emphasizes the need for careful consideration of data types and potential maximum values during table creation. **Additional Recommendations:** - To prevent this issue, developers should perform data type checks during field mapping and ensure compatibility before performing implicit comparisons. - Implement comprehensive testing strategies to identify and handle such hidden bugs early in the development cycle. - Adhere to best practices for data type conversion to avoid precision loss and ensure reliable data analysis.

正文

前言

之前负责的一个项目上线好久了,最近突然爆出一 Bug,最后评估影响范围将 Bug 升级成了故障,只因为影响的数据量有 10000 条左右,对业务方造成了一定的影响。

但因为不涉及到资金损失,Bug 修复后对数据进行修补,所以最终级别也是较低的。

今天和大家分享这个线上隐匿的 Bug,也好在工作的项目中得以借鉴哈~

需求背景

主题:民宿入住回访问卷

描述:

针对入住民宿的顾客,在离店后的当天或第二天内需要给顾客发送本次入住民宿的回访问卷,以此收集顾客入住体验的意见或建议

说明:

因为数据量较大,采用的是 Hive 库存储数据和逻辑加工

问题分析

1.业务逻辑

**t2表:**存储(昨日+今日此时)离店的顾客清单信息

**t3表:**存储已发送过回访问卷的顾客清单信息

出现 Bug 的核心业务逻辑如下:

所使用的等值关联字段为:

t2.id = t3.primary_id

t2表中过滤掉t3表中的数据,通过使用t2表作为主表left join子表t3表

然后判断t3.primary_id is null,说明是没有发送过的。

2.问题出现

t2.id字段类型为:string 类型

t3.primary_id字段类型为:bigint 类型

两个不同类型的字段进行等值关联时,当t3.primary_id实际值为超过 16 位的数值时则在 MapReduce 计算过程中将其字段类型由 bigint 类型转换为 double 类型,此时就出现了精度缺失的情况。

例如:

# 此处只是用来举例说明问题,不代表实际真实值
t2.id = 1000110000000000
t3.primary_id = 10001100000000009
  • 1
  • 2
  • 3

如上例子,t3表中已有 primary_id = 10001100000000009的记录发送过回访问卷

此时t3.primary_id = 10001100000000009的值超过 16 位,将其转换成 double 类型时,将其值进行截断后再等值关联

则会出现将t3.primary_id = 1000110000000000(将末尾的9去掉)再与t2表中的id关联

正好关联上已有 primary_id = 10001100000000009的记录,所以认为此条记录不应该再发送回访问卷,直接被过滤掉了

而实际业务中这条记录并不在已发送回访问卷记录表中,只因为精度缺失导致不该关联上的两条记录再被截断后错误的关联上了

结果:导致应该发送回访问卷的顾客,没有被发送

解决方案

1.Bug 解决

当时线上出现这个 Bug 后第一时间的解决方案是:
将等值关联的字段进行类型转换,全部转换成 string 类型后再进行等值关联

使用cast函数进行类型转换,这样可以解决精度缺失的问题

2.漏掉数据处理

将等值关联处修改后的代码逻辑,按照影响的业务数据时间范围,重新执行一次,找出本应该发送回访问卷但因此 Bug 而未发送的顾客清单,发送一次回访问卷。

总结

通过前面的分析,可看出这个线上的 Bug 比较隐匿,如果对隐式转换规则不清楚,则很大可能会出现这方面的问题。

今天给大家分享这个隐式转换的 Bug,希望在今后的工作项目中有类似问题时可借鉴一二。

除了出现 Bug 后的补救措施,在以后的项目中我们能提前做些什么呢?

  1. 一旦出现等值关联,则需要考虑关联字段的字段类型是否一致;
  2. 定义表时,需要结合具体业务情况考虑可能出现的最大值的数据范围;
  3. 不能因为害怕出现此问题,在不加思索的情况下,只要等值关联就使用cast函数进行 string 类型的转换;

欢迎关注 无量测试之道 公众号,回复领取资源

Python+Unittest框架API自动化、

Python+Unittest框架API自动化、

Python+Pytest框架API自动化、

Python+Pandas+Pyecharts大数据分析、

Python+Selenium框架Web的UI自动化、

Python+Appium框架APP的UI自动化、

Python编程学习资源干货、

Vue前端组件化框架开发、

资源和代码 免费送啦~

备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

微信搜索公众号:无量测试之道

添加关注,让我们一起共同成长!

</article>

与[转帖]线上一个隐匿 Bug 的复盘相似的内容:

[转帖]线上一个隐匿 Bug 的复盘

前言 之前负责的一个项目上线好久了,最近突然爆出一 Bug,最后评估影响范围将 Bug 升级成了故障,只因为影响的数据量有 10000 条左右,对业务方造成了一定的影响。 但因为不涉及到资金损失,Bug 修复后对数据进行修补,所以最终级别也是较低的。 今天和大家分享这个线上隐匿的 Bug,也好在工作

[转帖]线上大量CLOSE_WAIT的原因深入分析

这一次重启真的无法解决问题了:一次 MySQL 主动关闭,导致服务出现大量 CLOSE_WAIT 的全流程排查过程。 近日遇到一个线上服务 socket 资源被不断打满的情况。通过各种工具分析线上问题,定位到问题代码。这里对该问题发现、修复过程进行一下复盘总结。 先看两张图。一张图是服务正常时监控到

[转帖]Kafka 核心技术与实战学习笔记(七)kafka集群参数配置(上)

一.Broker 端参数 Broke存储信息配置 log.dirs:非常重要,指定Broker需要使用的若干文件目录路径,没有默认值必须亲自指定。log.dir:他只能表示单个路径,补充上一个参数用。 如何设置: 只要设置log.dirs,不要设置log.dir线上环境一定要为log.dirs配置多

[转帖]关于线上环境CLOSE_WAIT和TIME_WAIT过高

https://www.cnblogs.com/Bozh/p/3752476.html 运维的同学和Team里面的一个同学分别遇到过Nginx在线上环境使用中会遇到TIME_WAIT过高或者CLOSE_WAIT过高的状态 先从原因分析一下为什么,问题就迎刃而解了。 首先是TIME_WAIT: 理解一

[转帖]13 个 QA 带你了解线上压测的知识点

https://my.oschina.net/u/4526289/blog/5586897 摘要:设计一个线上压测系统能让我们学习到多少东西?这 13 个问题看你能否搞定。 本文分享自华为云社区《设计一个线上压测系统能让我们学习到多少东西?13 个问题看你能否搞定》,作者:breakDawn。 Q:

[转帖]nginx的proxy_next_upstream使用中的一个坑

https://zhuanlan.zhihu.com/p/35803906 今天线上系统出了点问题,机房的电信出口突然不通了,原本以为能自动切换的nginx配置,居然没有生效,导致了业务告警,手工紧急处理了才解决了。 当时的设想是,如果这个服务的访问,出现了500或者超时的情况,会自动重试到下一个服

[转帖]一个小操作,SQL 查询速度翻了 1000 倍

https://tidb.net/book/tidb-monthly/2022/2022-04/usercase/sql-1000 背景介绍​ 某一天早上来到公司,接到业务同学反馈,线上某个SQL之前查询速度很快,从某个时间点开始查询速度突然变慢了,希望DBA帮忙查看下。业务同学反馈的原话如下: ​

[转帖]关于 AREX

https://arextest.github.io/website/zh-Hans/docs/intro/ AREX 介绍​ 背景​ 对于一个初上线的简单服务,只需通过常规的自动化测试加上人工即可解决,但我们线上核心的业务系统往往比较复杂,通常也会频繁的需求迭代,如何保证被修改后的系统原有业务的正

[转帖]某游戏海外版本堆外内存泄露排查

https://www.jianshu.com/p/cae00d9c99fe 某游戏海外版本堆外内存泄露排查 现象 线上有部分服务器用top发现Java进程内存占用占比达到99,而且出现了有一个服务器被Linux OOM Kill 排查 选择了110服,该机器的Java进程最大堆内存设置的是9710

[转帖]基于腾讯云微服务引擎(TSE) ,轻松实现云上全链路灰度发布

https://my.oschina.net/u/4587289/blog/8570699 1. 概述 软件开发过程中,应用发布非常频繁,通常情况下,开发或运维人员会将系统里所有服务同时上线,使得所有用户都使用上新版本。这样的操作时常会导致发布失败,或因发布前修改代码,线上出现 Bug。 假设一个在