什么是数据工程中的流处理?


数据流处理可分为三个不同的数据处理阶段:

  • 收集
  • 处理
  • 呈现

让我们更详细地了解这三个阶段,并举例说明。

步骤 1:收集数据
要处理数据流,首先需要数据流!幸运的是,几乎所有数据都是以连续的方式产生的,将数据持久化为文件只是传统处理系统的产物。

以下是一些常见的实时数据源:

  • 数据库:一种常用的方法是读取事务型数据库的事务日志,创建变更事件流。这种技术被称为变更数据捕获(CDC),可通过 Debezium 等工具完成。数据库中的所有数据和任何更新都将实时反映在流处理器中。
  • 应用程序日志:使用 Vector、Logstash 或 Log4j 的 Kafka Appender 等工具将实时数据发送到 Apache Kafka。
  • 应用程序事件:在应用程序(如 Spring boot)中使用 Kafka 生产者发送自定义事件,如 "司机位置更新"、"订单已处理 "或 "灯泡已更新"。
  • 机器数据:从一组服务器或物联网设备中收集。
  • 平面文件:如果您无法实时获取数据,而传统系统仍在写入文件,您仍然可以对这些文件进行摄取和流式更改,例如使用 Apache Flink 的文件源。

当然,如果您的数据已经在数据流中,如 Kafka、MQTT、ActiveMQ 或其他类似技术,您可以直接从那里开始处理。

第 2 步:处理数据
Apache Flink 或 Kafka Streams 等开源流处理器可让你实时分析数据。

有许多处理操作在流处理用例中非常常见:

  • 重复数据流中的事件。
  • 多个数据流的连接,例如在时间窗口中匹配具有相同关键字的事件、运行连续实时连接或对来自复制数据库的数据进行查找连接。
  • 聚合,可以是永久运行("按国家分列的总计数"),也可以是按时间窗口运行("按国家分列的每小时总计数")。

处理数据流的方法还有很多,包括
  • 过滤和一次元组转换用于获取所需形状的数据。
  • 数据库或 REST 端点查询--例如,对于数据流中的每个事件,我们都会调用外部系统来丰富事件。
  • 复杂事件处理(CEP)用于在流式事件中寻找模式。

流处理器(如 Flink)通常提供多种使用接口,包括 SQL、Java 和 Python 库等高级抽象。特别是,编程抽象允许混合和匹配操作符,从高级 CEP 操作符到可直接使用 Java 访问的低级基元。

步骤 3:展示数据
在收集和处理数据后,最后一步就是向下游消费者提供数据。

数据的去向取决于您的用途。常见的例子包括

  • 驱动实时应用程序:在处理完数据后--也许是为了清理数据,也许是为了在数据中寻找将自动采取哪些行动的模式--您可以将数据写入 Kafka 等流媒体平台。在这里,您的应用程序将使用这些消息来驱动进一步的操作。
  • 数据仓库/湖泊和长期存储:您可以将数据流写入对象存储,包括亚马逊 S3(使用 Parquet 等文件格式,或 Apache Iceberg 和 Delta Lake 等表格格式),或 BigQuery、Snowflake、Oracle 等关系数据库和云数据仓库。
  • 实时分析:由 Apache Pinot、Clickhouse 和 Apache Druid 等技术驱动。
  • 事务型数据库:如 PostgreSQL、MySQL 等,数据用于其他应用程序。
  • 专用数据存储:如图形数据库(Neo4j)、时间序列数据库(InfluxDB)、文本数据(Lucene)等。