根本原因是道路的终点。根本原因应是因果链中的初始事件——不妨称之为多米诺骨牌的第一块,且能对问题作出主要解释。若数据问题的这一根本原因未发生,所有近因也不应出现,它与所有近因存在直接的因果关系。
当然,根本原因并非总能一目了然,相关性也未必绝对精准。若你对自己的结论缺乏信心,可通过一个思维实验来推算真实的置信度:假设老板告诉你,团队将完全按照你的假设推进方案,上线前不会有人复核,且方案全程以你的名义负责;一旦出错,所有责任由你承担。此时,你会给自己的假设打多少分(0-100 分)?如果低于 70,请继续调查。
常见的根本原因数据问题包括:
1. 用户错误:我们先从用户错误开始,因为这是常见的错误。可能有人录入了错误的数据库模式或无效值,这会导致数据管道无法读取数据,或基于错误数值执行了本应正确的处理流程,最终引发任务失败。
2. 数据标记错误:有时数据表中的行会发生错位,导致正确的字段标签被错误映射到对应列中。
3. 数据合作方未按时交付数据:这一情况也极为常见。你可以构建一个防弹系统,但你无法控制看不见的东西;若问题存在于源数据中,会导致本质良好的管道出现异常。
4. 代码错误:当管道出现新版本时,这种情况很常见。使用 Git 或 GitLab 等版本控制软件可以很快解决这个问题。将生产代码与先前版本进行比较,并使用先前版本运行测试。
5. OCR 数据错误:光学扫描仪读取数据时出现错误,导致生成异常值(或缺失值)。
6. 数据过期问题:数据集已过时,不再有效。
7. 重复数据问题:通常,供应商无法交付数据,因此管道运行的是上周的数据。
8. 权限问题:数据管道执行失败的原因可能是:系统缺乏拉取数据的权限,或无执行数据转换操作的权限。
9. 基础架构错误:可能的情况包括:可用内存达到上限、API 调用次数耗尽、Apache Spark 集群未启动,或数据仓库出现异常缓慢,这些问题都会导致任务在缺少所需数据的情况下执行(最终失败)。
10. 时间表变更:有人(或某个系统)修改了调度配置,导致管道执行顺序错乱,或直接未触发运行。
11. 有偏倚数据集:排查起来非常棘手。要排查此类问题,唯一可行的方法是通过测试验证数据相对于同类真实数据集是否存在异常,或追溯数据的采集与生成链路。
12. 编排器故障:管道调度器未能成功调度任务,或未触发任务执行。
13. 机器幽灵(数据天降异常):成因完全无法追溯。很难承认这一点,但对有些事情来说,就是如此。你所能做的最优选择是做好记录存档,并为后续情况做好准备,待下次发生时收集更全面的数据,进而着手挖掘相关关联线索。
当然,实际情况中还存在根本原因不完全明确的情况。许多现象相互关联,且很可能彼此依赖,但始终找不到一个清晰统一的答案——即便你通过调整修复了数据问题,也依然不确定问题的症结所在。
这种情况下(与其他所有情况一样),请在日志中记录下你的假设;待后续有条件时,继续通过历史数据验证,并持续关注新出现的问题以及更具解释力的潜在原因。