既然我们对结构化、半结构化和非结构化等不同数据格式有了一个初步认识,接下来就来看看这些数据实际来源于何处,以及数据工程师通常如何收集它们。确定数据的来源和收集方法,通常是设计数据存储和处理系统的第一步。这就像在做饭前,你需要知道食材从哪里来一样。数据可以来源于种类繁多的地方,这可能会让你感到意外。作为数据工程师,你会经常接触到这些来源中的许多。下面我们来看一些常见类别:常见数据来源操作型数据库: 它们是许多应用程序的支柱。这些数据库保存着业务操作的当前状态。例子包括:一家零售公司的数据库,保存着客户信息、产品库存和销售记录。一个Web应用程序的数据库,存储着用户账户和偏好设置。 这些数据库通常是关系型数据库(如PostgreSQL、MySQL、SQL Server),以结构化表的形式存储数据;或者是NoSQL数据库(如MongoDB、Cassandra),它们提供更灵活的数据模型。我们将在下一节更详细地讨论数据库。这里主要想说明的是,它们是结构化或半结构化业务数据的一个主要来源。日志: 几乎所有计算机系统都会生成日志。这些是记录已发生事件的数据,常用于故障排除、性能监控或了解使用模式。例子包括:Web服务器日志,记录每个请求(IP地址、访问页面、时间)。应用程序日志,记录软件内部的错误、警告或特定操作。系统日志,追踪操作系统事件。 日志数据通常是半结构化(例如,特定格式的行)或非结构化(例如,自由格式的错误消息)的,并且可以非常迅速地积累。用户活动和交互数据: 现代应用程序,特别是Web和移动应用,会根据用户行为生成海量数据。这包括:按钮或链接的点击。查看的页面和停留时间。输入的搜索查询。添加到购物车的商品。 这些数据,有时被称为点击流数据,对了解用户参与度、提供个性化体验以及进行A/B测试非常有价值。它通常以事件形式捕获,并且可以是半结构化的(例如JSON对象)。API(应用程序编程接口): API就像一份合同,允许不同的软件系统以预定义的方式请求和交换数据。数据工程师使用API从以下来源获取数据:第三方服务: 从外部提供商获取天气预报、股票价格、社交媒体提及或地图数据。内部微服务: 在现代架构中,大型应用程序的不同部分可能通过内部API进行通信。例如,一个订单服务可能会使用API从库存服务获取产品详情。 我们将在本章后面再次提到API。文件: 有时,数据只是以文件的形式到达。这在以下情况很常见:从遗留系统导出的数据。合作伙伴或部门生成的报告(例如,电子表格)。从传感器或设备收集的数据,这些设备会定期将读数转储到文件中。 这些文件可以是各种格式,如CSV(逗号分隔值)、JSON(JavaScript对象表示法)、XML(可扩展标记语言)、Parquet或纯文本。流式来源: 与存储在数据库或文件中的数据不同,有些数据以连续流的形式到达。例如:来自物联网设备的实时传感器读数。金融市场数据(股票行情)。实时社交媒体信息流。来自在线游戏平台的事件。 处理流式数据需要与批处理数据不同的方法,我们将在第5章讨论这一点。数据采集方法了解数据来源只是成功的一半;另一半是知道如何收集数据。方法通常取决于来源:数据库查询: 对于操作型数据库,最直接的方法通常是使用其原生语言进行查询,关系型数据库通常使用SQL,NoSQL数据库则有特定的查询语言。数据可以定期(例如,每晚)或更频繁地批量提取。日志传输/聚合: 从数百甚至数千台服务器收集日志需要专门的工具。日志传输器(如Fluentd、Filebeat或云原生代理)在服务器上运行,读取正在写入的日志文件,并将日志事件转发到中央存储或处理系统。API调用: 从API获取数据,你的系统需要向API提供的特定URL端点发出网络请求(通常是HTTP GET请求)。API随后会返回所请求的数据,通常是JSON等格式。数据收集可能涉及按计划(例如,每小时)调用API以获取更新。具体操作方面包括处理认证(证明你有权限访问API)和遵守速率限制(在给定时间内可以发出多少请求)。文件传输/摄入: 当数据以文件形式到来时,收集可能涉及:使用SFTP(安全文件传输协议)等协议传输文件的计划任务。用户通过网页界面上传文件。系统自动检测放入特定存储位置(如Amazon S3存储桶)的新文件。流式摄入: 从流式来源收集数据通常涉及使用消息队列或专用流处理平台(如Apache Kafka、Google Pub/Sub或AWS Kinesis)。生产者(数据来源)持续向这些平台发送数据,而消费者(你的数据处理应用程序)则实时或接近实时地从这些平台读取数据。变更数据捕获(CDC): CDC技术不是重复查询整个数据库表来查找变更,而是专注于捕获源数据库中发生的变更(插入、更新、删除),通常通过读取数据库的事务日志。这对于保持下游系统同步来说效率要高得多。虽然实施细节可能比较复杂,但了解这种方法的存在是有益的。网页抓取: 这涉及编写程序(抓取器)来自动浏览网站并直接从HTML页面提取信息。虽然在没有API可用时有时是必需的,但应谨慎对待。网站经常变化,可能导致抓取器失效,并且抓取可能引发伦理和法律问题,或违反网站的服务条款。相比使用正式API,它通常可靠性较低且不那么受欢迎。这里有一个图表,说明了不同来源通常如何被访问:digraph G { rankdir=LR; node [shape=box, style="rounded,filled", fontname="Helvetica", fontsize=10, color="#495057", fillcolor="#e9ecef"]; edge [color="#495057", arrowhead=vee, penwidth=1.0]; // 数据来源 db [label="操作型 数据库", fillcolor="#a5d8ff"]; // blue logs [label="服务器与应用 日志", fillcolor="#ffec99"]; // yellow web [label="用户活动 (点击,浏览)", fillcolor="#b2f2bb"]; // green api [label="外部API (天气,社交)", fillcolor="#d0bfff"]; // violet files [label="上传文件 (CSV,JSON)", fillcolor="#ffd8a8"]; // orange stream [label="流式数据 (传感器,信息流)", fillcolor="#fcc2d7"]; // pink // 采集方法 query [label="数据库查询", shape=ellipse, fillcolor="#e9ecef"]; ship [label="日志传输/ 聚合", shape=ellipse, fillcolor="#e9ecef"]; call [label="API调用", shape=ellipse, fillcolor="#e9ecef"]; transfer [label="文件传输", shape=ellipse, fillcolor="#e9ecef"]; ingest [label="流式摄入", shape=ellipse, fillcolor="#e9ecef"]; cdc [label="变更数据 捕获 (CDC)", shape=ellipse, fillcolor="#e9ecef"]; // 连接 db -> query; db -> cdc [style=dashed]; // CDC是数据库的备选方案 logs -> ship; web -> ship; // 通常通过日志机制收集 web -> call [style=dashed]; // 或通过SDK进行调用 api -> call; files -> transfer; stream -> ingest; // 确保来源在视觉上分组 {rank=min; db; logs; web; api; files; stream;} // 确保方法在视觉上分组 {rank=max; query; ship; call; transfer; ingest; cdc;} }不同的数据来源通常需要特定的采集方法。数据库通常通过查询获取,日志通过传输,API通过调用,文件通过传输,流式数据通过摄入。掌握这些来源和采集方法是十分重要的。当你需要构建数据管道(我们将在第3章讨论)时,你的首要问题通常会是:“数据存储在哪里?”和“我们如何获取它?”。拥有这个可能性图谱,可以帮助你为手头的工作选择合适的工具和技术。接下来,我们将更详细地查看最常见的数据存储结构之一:数据库。