3. 数据源探索与采集:常见数据源类型及采集策略

数据源是样本构建的起点。不同类型的数据源在访问方式、数据格式、实时性、数据量级上差异显著。本章系统梳理数据库、API、日志、文件四大类数据源的核心特征与采集策略,帮助你在实际项目中快速定位并高效获取原始数据。

3.1 常见数据源类型对比

下表从访问方式、数据结构、典型场景、采集难点四个维度对四类数据源进行横向对比:

数据源类型 访问方式 数据结构 典型场景 采集难点
数据库 JDBC/ODBC 直连 结构化(表、视图) 业务系统、交易记录 权限控制、大表全量扫描
API HTTP/HTTPS 请求 半结构化(JSON/XML) 第三方服务、微服务 限流、鉴权、分页
日志 文件流/消息队列 半结构化/非结构化 服务器日志、用户行为 高吞吐、格式不统一
文件 文件系统/SFTP 结构化/非结构化 CSV/Excel/图片/文本 编码、格式解析、版本管理
选型建议: 优先选择数据库直连获取结构化数据;若数据量极大且实时性要求高,考虑日志流式采集;API 适合低频、小批量、跨系统的数据交换;文件采集常用于离线批量和非结构化数据场景。

3.2 数据库数据源与采集策略

数据库是最常见的数据源,通常存储业务核心数据。采集时需关注以下要点:

  • 连接方式: 使用 JDBC/ODBC 驱动直连,支持 MySQL、PostgreSQL、Oracle、SQL Server 等主流数据库。
  • 增量采集: 通过时间戳字段(如 update_time)或自增 ID 实现增量拉取,避免全表重复扫描。
  • 分页与限流: 大表使用 LIMIT/OFFSET 或游标分页,控制单次查询数据量,防止数据库负载过高。
  • 连接池管理: 使用连接池(如 HikariCP、Druid)复用连接,避免频繁创建/销毁。
-- 增量采集示例:基于时间戳
SELECT * FROM orders
WHERE update_time > '2025-03-01 00:00:00'
ORDER BY update_time ASC
LIMIT 1000;

3.3 API 数据源与采集策略

API 是微服务架构和第三方数据接入的主要方式。采集时需处理鉴权、限流、分页、重试等常见问题。

  • 鉴权方式: API Key、OAuth 2.0、JWT Token,需在请求头中携带。
  • 限流处理: 遵守 API 的 Rate Limit,使用指数退避(Exponential Backoff)策略进行重试。
  • 分页策略: 支持 offset/limit、cursor、page 三种分页模式,需根据 API 文档适配。
  • 数据格式: 通常返回 JSON 或 XML,需解析并转换为结构化表。
# Python 采集 API 示例(带限流重试)
import requests
import time

def fetch_api_data(url, api_key, max_retries=3):
    headers = {"Authorization": f"Bearer {api_key}"}
    for attempt in range(max_retries):
        resp = requests.get(url, headers=headers)
        if resp.status_code == 200:
            return resp.json()
        elif resp.status_code == 429:  # Too Many Requests
            wait = int(resp.headers.get("Retry-After", 5))
            time.sleep(wait)
        else:
            resp.raise_for_status()
    return None

3.4 日志数据源与采集策略

日志数据通常由应用服务器、Web 服务器、中间件产生,具有高吞吐、持续产生的特点。采集策略分为推模式和拉模式:

  • 推模式(Agent 采集): 在服务器部署采集 Agent(如 Filebeat、Fluentd),实时读取日志文件并发送到中央存储(如 Kafka、Elasticsearch)。
  • 拉模式(消息队列): 应用直接将日志写入消息队列(如 Kafka、RabbitMQ),采集程序从队列消费。
  • 日志格式解析: 常见格式包括 Apache/Nginx 访问日志、JSON 日志、自定义分隔符日志,需编写解析规则。
关键指标: 日志采集的吞吐量通常以 MB/s 或 万条/秒 衡量。对于高并发系统,建议使用 Kafka 作为缓冲层,避免采集程序直接写入数据库造成压力。

3.5 文件数据源与采集策略

文件数据源涵盖 CSV、Excel、Parquet、图片、文本等格式,常用于离线批量和外部数据交换。采集时需关注:

  • 格式识别: 根据文件扩展名或 MIME 类型选择解析器,CSV 注意分隔符和编码(UTF-8/GBK)。
  • 批量与增量: 使用文件修改时间或目录监听实现增量采集;对于大文件,支持分块读取。
  • 压缩与加密: 常见压缩格式(.gz、.zip)需先解压;加密文件需提供解密密钥。
  • 数据校验: 采集后校验行数、字段数、MD5 校验和,确保数据完整性。
# Python 读取 CSV 文件示例
import pandas as pd

df = pd.read_csv("user_data.csv", encoding="utf-8", sep=",")
print(f"采集行数: {len(df)}")
print(f"字段列表: {list(df.columns)}")

3.6 数据源采集架构总览

下图展示了一个典型的多数据源采集架构,涵盖数据库、API、日志、文件四种数据源的采集路径与数据流向:

多数据源采集架构总览 数据库 MySQL / Oracle / PG API REST / GraphQL 日志 Filebeat / Fluentd 文件 CSV / Parquet / Excel 采集引擎(调度器 + 连接池 + 限流 + 重试) JDBC 连接池 / HTTP 客户端 / Agent 管理 / 文件监听 消息队列 / 缓冲层 Kafka / RabbitMQ / Redis Stream 数据湖 / 数据仓库 HDFS / S3 / ClickHouse / Elasticsearch 说明:采集引擎统一管理连接、限流、重试;缓冲层解耦生产与消费;存储层提供统一数据视图

3.7 采集策略选择矩阵

根据数据量级和实时性要求,选择合适的采集策略:

数据量级 实时性要求 推荐策略 典型工具
小(< 1GB/天) 低(T+1) 定时批量拉取 SQL 脚本 + cron
中(1GB~100GB/天) 中(分钟级) 增量采集 + 消息队列 DataX / Flume
大(> 100GB/天) 高(秒级) 流式采集 + 分布式缓冲 Kafka Connect / Flink CDC
常见陷阱: 1) 数据库全量采集未加时间戳过滤,导致重复数据;2) API 采集未处理限流,导致 IP 被封;3) 日志采集未考虑磁盘 I/O 瓶颈,影响业务应用性能。建议在采集前进行数据源摸底测试,评估吞吐量和延迟。

3.8 数据源探索清单

在开始采集前,建议按以下清单完成数据源探索:

  1. 数据源清单: 列出所有可能的数据源,包括数据库地址、API 端点、日志路径、文件目录。
  2. 数据量评估: 预估每日新增数据量、历史数据总量、峰值吞吐量。
  3. 访问权限: 确认数据库账号权限、API Key 有效期、文件系统读写权限。
  4. 数据质量检查: 抽样检查字段完整性、格式一致性、异常值比例。
  5. 采集频率规划: 根据业务需求确定全量/增量、实时/离线策略。