什么是数据管道?阶段、类型和设计选择

什么是数据管道?

Scrapeless Web Unlocker 为数据管道的采集阶段检索网页内容,包括需要 JavaScript 渲染的页面。

什么是数据管道?

数据管道是一系列相互连接的处理步骤,把数据从源头移动到目的地,并在此过程中完成所需的抽取、转换、校验和投递。源头可能是一个应用数据库、一个文件、一个事件流,或一个经授权的公共网站。目的地可能是一张报表表、一个搜索索引,或另一个应用。管道描述了两者之间要完成的工作,以及在什么规则下产出结果才算可用。

下载页面的脚本可以是管道的一个组件。一个完整的网页数据管道还要说明采集了什么、哪些记录被接受、它们被存储在何处,以及消费者何时可以使用它们。当某个任务成功结束却产出了一份不完整的目录时,这种区别就很重要。进程完成和数据集完成是两件不同的事实。

摘要

  • 数据管道连接数据源和可用的输出。 仅仅移动可能就足够,但许多工作流还会转换和校验记录。
  • 批处理和流处理描述处理节奏。 根据所需的新鲜度和运营成本选择节奏。
  • 检查点描述已经提交的进度。 只有在对应输出已经持久化之后才推进检查点。
  • 数据血缘解释一个输出从何而来。 与数据一起保存源引用和转换版本。

管道需要哪些阶段?

管道需要为采集、解释、接受和投递设置清晰的边界,即使每个阶段都由同一个程序实现。先从一个源头契约开始:哪些数据集在范围内,允许什么访问,以及什么构成一次完整的观测。对于一个产品目录,这可能意味着已批准的品类、一个市场,以及定义好的观测周期。

摄取把源端的字节或事件带入系统。解析将这些字节转换为候选记录。转换让字段拥有一致的含义,例如把价格金额与其货币拆分开。校验决定记录是否符合目的地的契约。投递让被接受的记录对读取者可用。编排负责调度这些活动并强制执行它们之间的依赖关系。

将采集证据与转换后的业务字段分开保存。 用于数据来源追溯的 PROV 模型 描述了实体、活动和责任主体之间如何关联。一个实用的实现可以从源位置、观测时间、解析器版本和一次运行标识开始。这些字段可以让分析人员把一个出人意料的值追溯回产生它的证据。

批处理与流处理有何不同?

批处理管道处理有界的数据集合,而流处理管道处理持续不断的事件序列。计划导出天然是有界的:一个作业接收一个已定义的输入,并为该次运行生成输出。流则保持活跃,必须决定事件何时可以参与汇总,尤其是在事件乱序到达时。

新鲜度应当是一个需求,而不是一个口号。每日市场报告可能可以接受计划批处理。运营告警则可能需要在相关事件发生后不久就更新。流处理增加了关于事件时间、到达时间、缓冲以及迟到数据的决策。更快的调度不会自动让网页源更加新。源本身可能发布得很少,或者缓存自己的结果。

决策批处理流处理
输入边界已定义的文件、分区或运行范围持续的事件序列
进度跟踪已完成的分区或批次位置和事件时间策略
典型关注点在消费者截止时间前完成保持处理延迟和积压有界
历史更正重新计算受影响的分区应用一次更正或重建受影响的状态

混合设计很常见。一个流可以支撑当前的运营视图,而一个有界作业重建历史汇总。两条路径应使用兼容的定义,否则实时看板和之后的报告就可能因为与源变化无关的原因而不一致。

ETL 和 ELT 与数据管道是同一个概念吗?

ETL 和 ELT 是在转换发生位置上不同的管道安排。Extract, transform, load 在放入目的地之前就准备好数据。Extract, load, transform 则先落地源数据,再利用目的地的处理环境完成转换。更广义的管道概念还包括那些在不改变业务含义的前提下复制数据的工作流。

这个选择会影响访问和恢复。投递前完成转换可以把不合适的字段隔离在报表系统之外。先落地原始输入可以为未来的重新解读保留证据,但它也会创建一个需要保留控制和受限访问的数据存储。只有在有人能识别源版本以及创建它的进程时,原始存储才有用。

将目的地与文件编码分开描述。同一个数据集可以有多个可下载表示形式,而不会因此变成几个互不相关的数据集。 DCAT 关于数据集与分发的区分 有助于在目录和交接中明确这种分离。

Web 数据管道是什么样子的?

Web 数据管道将已批准的页面观测转换为下游系统可以解释的记录。以一个用于目录监控的设计为例。输入是一份已批准的类别列表。采集阶段获取每个相关页面。发现阶段遵循站点的连续/翻页机制。抽取阶段识别产品及其可见属性。规范化阶段将金额、货币、可用性和来源标识分别记录为独立字段。

验收阶段会检查响应中是否包含预期的目录,而不是访问消息或空的页面外壳。然后它会检查所需的标识符和字段类型。当源数据确实省略价格时,缺失的价格会以“缺失并带有说明性状态”的形式保留,不会被转换为零。最后,交付阶段会根据产品标识和观测上下文写入一条观测记录。

无爬取网络解锁器 属于集合边界。The Web Unlocker 请求契约 定义了如何请求内容。你的应用程序仍然负责发现范围、解析规则、记录验证和存储。这样的分工可以防止将一次成功的采集请求误认为是一次有效的数据仓库加载。

对于计划收款, 增量式网页抓取与变更检测 可以减少不必要的后续工作。文档变更和业务记录变更是两个独立的问题。导航横幅可能会更改文档,而每个产品属性都保持不变。

检查点和重复项处理应如何工作?

检查点应表示已被可靠持久接受的数据,而不仅仅是被请求的数据。如果工作者在保存当前批次之前记录了延续令牌,进程在停止时可能会留下未记录的空档。应在你理解其故障行为的边界内,同时保存已接受的输出及其进度标记。

从业务问题中选择目标标识。最新状态表可以使用来源和产品标识符。观察历史还需要一个观察边界。在不同日期对同一产品的两次观测可以构成合法的历史。对同一观察的两次传送不应产生额外的业务事件。

幂等写入使对相同逻辑输入的重复投递产生相同的存储结果。此属性取决于键和写入语义;队列或调度器本身并不保证这一点。请记录清楚一次加载是替换一个分区、按键合并,还是追加观测数据。除非每一个相关边界都能支撑该断言,否则避免宣称端到端的“精确一次”行为。

对于表格输出, 表格元数据和关键约束 为行、列、主键和关系提供一套有用的术语。在使用方开始对输出进行联接之前,先就这些含义达成一致。

你应该监控什么?

在监控已交付数据集状况的同时,也要监控其工作器的状况。作业持续时间和请求次数可以说明资源使用情况。已接受记录、被拒绝记录、来源覆盖范围以及最新完成观测的时间跨度,可以说明输出是否有用。一个没有异常的作业仍然可能什么都没有交付。

在消费时刻定义新鲜度。源发布时间、采集时间和仓库可用时间回答的是不同的问题。较新的采集时间戳并不能证明源内容是新的。应当保留这些区分,而不是把所有时间都放进一个名为“更新时间”的字段中。

当某个分区未通过验收时,需保持上一个已通过验收的分区可识别,并标记当前分区为未完成。消费者应当能够区分“已过期但已被接受”的数据与“新采集但尚未通过校验”的数据。为每条关键规则指定负责人,以便在产生告警时能够促成决策,而不是只留下无人处理的日志记录。

在比较设计时,衡量每个被接受的业务结果的成本。 无爬取定价 为收集规划提供信息,而存储、转换和审查会带来额外成本。提高提取准确性可能比增加原始请求吞吐量更有价值。

你如何从一个易于管理的设计开始?

从一个数据源、一个输出契约和一个消费方决策开始。写明记录粒度、必填字段、完整性规则、新鲜度截止时间以及负责人。在添加分布式调度之前先实现一次有界运行。使用具有代表性的数据源样本,及早暴露缺失字段和含糊不清的标识符。

将对源代码的更改与对你解释的更改区分开来。解析器的新版本可以在没有任何源代码更新的情况下更改输出。在符合允许保留范围的前提下,保存足够的证据来解释这种差异。收集个人信息本身需要单独的目的说明、访问控制和删除流程;公开可见性并不能满足这些义务。

结论

一个有用的数据流水线具有清晰的接收边界和清晰的交付边界。以最小的源到消费者路径为起点,使其进度和证据可检视,并且只有在消费者能够解释每一条存储记录所代表的含义之后再进行扩展。

将集合层付诸实践

选择与您的来源匹配的 Scrapeless 集合功能,然后应用上述验证和操作决策。

立即注册即可获得 5 美元的免费额度 — 无需信用卡.

领取您的 $5 额度 →

常见问题解答

数据管道和 ETL 是同一回事吗?

不是。ETL 只是提取、转换和加载在更大范畴的数据管道中的一种安排方式。一个数据管道可以在转换之前进行加载,或者在不改变数据的情况下移动数据。

每个流水线都需要流式处理吗?

不。只要批处理管道的交付节奏能够满足消费者对数据新鲜度的要求,它就足够了。只有在持续产生的事件以及对低处理延迟的需求足以证明额外状态管理的开销时,流式处理才是有用的。

一次成功的请求会产生错误的流水线数据吗?

是的。返回的内容可能不完整、不相关或被错误解读。在向用户发布输出之前,请验证目标内容、记录结构和集合覆盖范围。

Scrapeless 适用于哪些场景?

Scrapeless Web Unlocker 可以在摄取边界提供网页内容。您的管道仍然负责抽取逻辑、转换、验证、沿袭跟踪和写入目标端。

参考资料