数据可观察性:如何使用SQL构建自己的异常检测器

在本系列文章中, 推荐一个正规滚球网站将介绍如何从头创建自己的数据可观察性监视器, mapping to 数据健康的五个关键支柱. Part I can be found here.

本系列的第二部分改编自Barr Moses和Ryan Kearns的O ' reilly训练, 管理数据停机时间:对数据管道应用可观察性这是该行业第一个关于数据可观察性的课程. 相关的练习是可用的 here,本文中显示的经过调整的代码是可用的 here.

随着全球对数据需求的增加,强大的数据管道显得尤为重要. 当数据中断时——是否来自模式更改, null values, duplication, 否则,数据工程师需要知道. 

Most importantly, 推荐一个正规滚球网站需要评估破坏的根本原因——而且要快——在它影响下游系统和消费者之前. We use “data downtime指的是数据丢失、错误或不准确的一段时间. 如果你是一名数据专业人士,你可能会熟悉以下问题:

  • 数据是最新的吗?
  • Is the data complete?
  • 字段是否在预期范围内?
  • null率比应该的值高还是低?
  • 模式改变了吗?

以有效的方式回答这些问题, 推荐一个正规滚球网站可以借鉴软件工程师的经验: 监控和可观测性.

刷新你的记忆 Part I, we define data observability 作为一个组织回答这些问题和评估其数据生态系统健康状况的能力. 数据可观察性的五个支柱反映了数据健康的关键变量: 

  • Freshness:我的数据是最新的? 在我的数据没有被更新的时间间隔?
  • Distribution:我的数据在现场层面的健康程度? 我的数据是否在预期范围内?
  • Volume:是我的数据摄入量达到预期阈值?
  • Schema:我的数据管理系统的正式结构发生了变化?
  • Lineage:如果我的一些数据坏了,上游和下游受到什么影响? 我的数据源如何相互依赖?

在本系列文章中, 我很想揭开真相, 研究数据的可观察性是什么样的 in the code.

In Part I, 我看着前面的两根柱子, 新鲜和分布, 并展示了一些SQL代码是如何操作这些概念的. 这些是我认为更“经典”的 异常检测问题 ——给定一个稳定的数据流,是否有任何东西看起来不正常? 良好的异常检测当然是数据可观测性难题的一部分,但它并不是一切. 

Equally important is context. 如果出现异常,很好. But where? 可能是什么上游管道的原因? 什么下游仪表板将受到影响? 我的数据的正式结构改变了? 良好的数据可观察性取决于推荐一个正规滚球网站是否能够适当地利用元数据来回答这些问题.

In this article, 推荐一个正规滚球网站将着眼于两个旨在回答这些问题的数据可观察性支柱 schema and lineage. Once again, 推荐一个正规滚球网站将使用像jupiter和SQLite这样的轻量级工具, 所以你可以轻松地旋转推荐一个正规滚球网站的环境,自己尝试这些练习. Let’s get started.

Our data environment

本教程基于 Exercises 2 and 3 奥莱利的课程 管理数据的停机时间. 欢迎您使用Jupyter笔记本和SQL自己尝试这些练习. 推荐一个正规滚球网站将详细介绍,包括锻炼 4, in future articles.

If you read Part I 对于这个系列,您应该熟悉推荐一个正规滚球网站的数据. 和以前一样,推荐一个正规滚球网站将使用 模拟天文数据 关于宜居行星. 我用Python生成数据集, 根据我在生产环境中遇到的真实事件对数据和异常进行建模. 此数据集完全免费使用,并且 utils folder 如果您感兴趣的话,存储库中包含生成数据的代码.

I’m using SQLite 3.32.3, 这应该使数据库可以从命令提示符或SQL文件与最小的设置. 这些概念可以扩展到任何查询语言 这些实现 可以扩展到MySQL, Snowflake和其他数据库环境的最小变化.

再一次,推荐一个正规滚球网站有了系外行星表

A database entry in EXOPLANETS 包含如下信息:

0._id:表示该行星对应的UUID.
1. distance:距离地球的距离,以光年为单位.
2. g:地表重力的倍数 g,重力常数.
3. orbital_period:以天为单位的单轨道周期的长度.
4. avg_temp:平均表面温度,单位是开尔文.
5. date_added推荐一个正规滚球网站的系统发现这颗行星的日期,并将其自动添加到推荐一个正规滚球网站的数据库中.

请注意一个或多个 distance, g, orbital_period, and avg_temp may be NULL 因为丢失或错误的数据而导致的.

sqlite> SELECT * FROM EXOPLANETS LIMIT 5;

请注意,这个练习是追溯的——推荐一个正规滚球网站正在查看历史数据. 在生产数据环境中, 数据可观察性是实时的,应用于数据生命周期的每个阶段, 因此将涉及与这里所做的略有不同的实现.

看起来推荐一个正规滚球网站最古老的数据是2020-01-01 (note:大多数数据库不会存储单个记录的时间戳, 所以推荐一个正规滚球网站的DATE_ADDED列正在为推荐一个正规滚球网站跟踪). Our newest data…

sqlite> SELECT DATE_ADDED FROM EXOPLANETS ORDER BY DATE_ADDED DESC LIMIT 1; 2020-07-18

可能是2020年7月18日. 当然,这是推荐一个正规滚球网站在上一篇文章中使用的同一个表. 如果推荐一个正规滚球网站想要探索图式和血统的更多背景支柱, 推荐一个正规滚球网站需要扩展推荐一个正规滚球网站的环境.

Now, 除了系外行星, 推荐一个正规滚球网站有一个表叫做EXOPLANETS_EXTENDED, 哪个是过去表的超集. 把它们看作是同一个表是很有用的 不同的时刻. 事实上,EXOPLANETS_EXTENDED的数据可以追溯到2020-01-01…

sqlite> SELECT DATE_ADDED FROM EXOPLANETS_EXTENDED ORDER BY DATE_ADDED ASC LIMIT 1; 2020-01-01

而且还包含了截止2020年9月6日的数据,比系外行星的数据还要多:

sqlite> SELECT DATE_ADDED FROM EXOPLANETS_EXTENDED ORDER BY DATE_ADDED DESC LIMIT 1; 2020-09-06

可视化模式变化

这些表格之间还有一些不同之处:

除6个字段外 EXOPLANETS, the EXOPLANETS_EXTENDED Table包含两个额外的字段:

6. eccentricity: the orbital eccentricity 围绕着它的主星的行星.

7. atmosphere:地球大气的主要化学组成.

Note that like distance, g, orbital_period, and avg_temp, both eccentricity 大气可能是 NULL 因为丢失或错误的数据而导致的. For example, rogue planets 没有定义的轨道偏心率,而且很多行星根本就没有大气层.

还请注意,数据没有回填, 对象中包含的从表开始的数据条目 EXOPLANETS 表)将不会有偏心和大气信息.

两个字段的添加是一个 schema chang-推荐一个正规滚球网站的数据的正式蓝图已经修改. 当对数据结构进行更改时,就会发生模式更改, 手动调试可能会令人沮丧. 模式变化可以指示关于数据的任何数量的事情,包括:

  • 添加新的API端点
  • 假定已弃用的字段还没有…已弃用
  • 列、行或整个表的加法或减法

In an ideal world, 推荐一个正规滚球网站需要记录下这一变化, 因为它表示一个向量,表示推荐一个正规滚球网站的管道可能出现的问题. 不幸的是,推荐一个正规滚球网站的数据库并没有自然地配置为跟踪这些更改. 它没有版本控制历史.

推荐一个正规滚球网站在 Part I 查询单个记录的年龄时,添加了 DATE_ADDED column to cope. 在本例中,推荐一个正规滚球网站将做一些类似的事情,除了添加了一个完整的表:

The EXOPLANETS_COLUMNS 表“版本”推荐一个正规滚球网站的模式中记录的列 EXOPLANETS_EXTENDED at any given date. 看看第一个和最后一个条目, 推荐一个正规滚球网站可以看到这些列在某一时刻发生了明显的变化:

现在,回到推荐一个正规滚球网站最初的问题:图式到底是什么时候改变的? 因为推荐一个正规滚球网站的列列表是按日期索引的, 推荐一个正规滚球网站可以通过一个快速的SQL脚本找到更改的日期:

这里是返回的数据,为了便于阅读,我重新格式化了它:

对于这个查询,推荐一个正规滚球网站返回违规日期:2020-07-19. 比如新鲜度和分布可观察性, 实现模式可观察性遵循一个模式:推荐一个正规滚球网站识别 useful metadata 它会发出管道运行状况的信号,跟踪它,并构建检测器来提醒推荐一个正规滚球网站潜在的问题. 提供一个额外的表,如 EXOPLANETS_COLUMNS 这是一种追踪图式的方法,但还有很多其他方法吗. 我鼓励您考虑如何为自己的数据管道实现模式更改检测器!

Visualizing lineage

推荐一个正规滚球网站将血统描述为 the most holistic 数据可观察性的5个支柱,并有充分的理由. 血统背景事件告诉推荐一个正规滚球网站(1)哪些下游来源可能受到影响, (2)哪些上游来源可能是根本原因. 虽然用SQL代码“可视化”沿袭并不直观, 一个简单的例子可以说明它如何有用.

为此,推荐一个正规滚球网站需要再次扩展数据环境.

介绍:宜居

推荐一个正规滚球网站向数据库中添加另一个表. 到目前为止,推荐一个正规滚球网站一直在记录系外行星的数据. 这里有一个有趣的问题要问:这些行星中有多少可能存在生命?

The HABITABLES 表需要的数据 EXOPLANETS 为了帮助推荐一个正规滚球网站回答这个问题

An entry in HABITABLES 包含以下:

0. _id:表示该行星对应的UUID.

1. perihelion: The closest distance 在一个轨道周期内到达天体.

2. aphelion: The furthest distance 在一个轨道周期内到达天体.

3. atmosphere:地球大气的主要化学成分.

4. habitability: 0到1之间的实数,表示该行星上存在生命的可能性有多大.

5. min_temp:地球表面的最低温度.

6. max_temp:地球表面的最高温度.

7. date_added推荐一个正规滚球网站的系统发现这颗行星的日期,并将其自动添加到推荐一个正规滚球网站的数据库中.

Like the columns in EXOPLANETS, values for perihelionaphelionatmospheremin_temp, and max_temp are allowed to be NULL. In fact, perihelion and aphelion will be NULL for any _id in EXOPLANETS where eccentricity is NULL,因为你使用轨道偏心率来计算这些指标. 这解释了为什么这两个字段总是 NULL 在推荐一个正规滚球网站的旧数据条目中:

sqlite> SELECT * FROM HABITABLES LIMIT 5;

So, we know that HABITABLES 取决于 EXOPLANETS (or, equally, EXOPLANETS_EXTENDED), and EXOPLANETS_COLUMNS does as well. 推荐一个正规滚球网站数据库的依赖关系图是这样的:

图片由蒙特卡罗提供.

非常简单的沿袭信息,但已经很有用了. 让推荐一个正规滚球网站来看看 HABITABLES 在这张图的背景下,看看推荐一个正规滚球网站能学到什么.

调查异常

推荐一个正规滚球网站有一个关键指标时,比如宜居性 HABITABLES推荐一个正规滚球网站可以通过几种方式评估该指标的健康程度. 首先,平均值是多少 habitability 对于给定日期的新数据?

看看这些数据,推荐一个正规滚球网站发现有些地方出了问题. 宜居性的平均值通常在0左右.5,但它减半到0左右.25在记录的数据之后.

这显然是一种分布异常现象……. but what caused it?

这是一个明显的分布异常现象,但这究竟是怎么回事呢? 换句话说,什么是 root cause of this anomaly?

为什么推荐一个正规滚球网站不看看 NULL 宜居度,就像推荐一个正规滚球网站做的那样 Part I?

幸运的是,这里的一切看起来都很正常:

但这看起来并不是推荐一个正规滚球网站问题的原因. 如果推荐一个正规滚球网站着眼于另一个分配健康指标,即 rate of zero values?

显然,这里的问题更严重:

这是另一种分布异常,但是是什么引起的呢?

推荐一个正规滚球网站可以改装推荐一个正规滚球网站内置的一个分布探测器 Part I 要得到可居住性领域中可感知的零利率的第一个日期:

推荐一个正规滚球网站可以通过命令行运行这个查询:





$ sqlite3 EXOPLANETS.db < queries/lineage/habitability-zero-rate-detector.sql

Date_added | habitability_zero_rate | prev_habitability_zero_rate

2020–07–19 | 0.369047619047619 | 0.0

2020年7月19日是零利率开始出现异常结果的第一天. 回想一下,这是与模式更改检测同一天 EXOPLANETS_EXTENDEDEXOPLANETS_EXTENDED is upstream from HABITABLES,所以这两起事件很有可能有关联.

通过这种方式,血统信息可以帮助推荐一个正规滚球网站确定 root cause 并尽快解决这些问题. 比较以下两种对该事件的解释 HABITABLES:

  1. 2020年7月19日,可居住性列的零率 HABITABLES Table从0%上升到37%.
  2. 2020年7月19日,推荐一个正规滚球网站开始跟踪另外两个领域, eccentricity and atmosphere, in the EXOPLANETS table. 这对下游的桌子产生了不利的影响 HABITABLES,经常设置领域 min_temp and max_temp 到极值 eccentricity was not NULL. 这反过来又导致了 habitability 零速率的场峰,推荐一个正规滚球网站检测到平均值的异常下降.

解释(1)仅仅使用了一个异常发生的事实. 解释(2)使用血统, 表和字段之间的依赖关系, 将事件置于上下文并确定根本原因. (2)中的一切都是正确的, by the way, 我鼓励你们去弄乱环境,了解自己正在发生什么. 虽然这些只是简单的例子,但配备(2)的工程师会更快 understand and resolve 根本的问题,以及这一切都归功于适当的可观察性.

What’s next? 

跟踪模式更改和沿袭可以让您前所未有地了解数据的运行状况和使用模式, 提供关于谁的重要上下文信息, what, where, why, 以及你的数据是如何被使用的. In fact, 在理解数据停机的下游(通常是真实世界)影响时,模式和沿继是两个最重要的数据可观察性支柱.

To summarize:

  • Observing our data’s schema 意味着理解数据的正式结构,以及它的变化时间和方式.
  • Observing our data’s lineage 意味着理解推荐一个正规滚球网站管道中的上游和下游依赖关系, 把孤立的事件放在更大的背景下.
  • 数据可观察性的这两大支柱都涉及跟踪适当的元数据, 并将推荐一个正规滚球网站的数据转换成可以理解异常现象的方式.
  • 更好的可观察性意味着更好地理解数据中断的原因和方式, 减少检测时间和分辨率时间.

推荐一个正规滚球网站希望“实践中的数据可观察性”的第二部分是有用的. Thanks for reading. 

在第三部分之前,我希望您不会出现数据停机! 

有兴趣学习更多关于数据可观察性的知识? Reach out to Ryan and the Monte Carlo team